From 77e18985126bee932393dc99cd18d34f0b3c9c61 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Jan 2022 17:56:52 +0100 Subject: [PATCH 001/319] Merge remote-tracking branch 'origin/v3.4' into dev --- CHANGELOG.md | 62 - CHANGELOG_LATEST.md | 51 +- CONTRIBUTING.md | 14 +- Makefile | 4 +- README.md | 8 +- interface/.env | 3 + interface/.env.development | 5 - interface/.eslintignore | 2 - interface/.eslintrc | 27 - interface/.prettierrc | 2 +- interface/config-overrides.js | 46 +- interface/package-lock.json | 35372 ++++++---------- interface/package.json | 99 +- interface/progmem-generator.js | 157 +- interface/public/css/roboto.css | 32 +- interface/public/fonts/li.woff2 | Bin 15440 -> 0 bytes interface/public/fonts/md.woff2 | Bin 0 -> 15920 bytes interface/public/fonts/me.woff2 | Bin 15552 -> 0 bytes interface/public/fonts/re.woff2 | Bin 15344 -> 15688 bytes interface/public/index.html | 15 +- interface/src/App.tsx | 64 +- interface/src/AppRouting.tsx | 132 +- interface/src/AuthenticatedRouting.tsx | 66 + interface/src/CustomMuiTheme.tsx | 46 - interface/src/CustomTheme.tsx | 47 + interface/src/SignIn.tsx | 256 +- interface/src/ap/APModes.ts | 8 - interface/src/ap/APSettingsController.tsx | 33 - interface/src/ap/APSettingsForm.tsx | 134 - interface/src/ap/APStatus.ts | 28 - interface/src/ap/APStatusController.tsx | 33 - interface/src/ap/APStatusForm.tsx | 91 - interface/src/ap/AccessPoint.tsx | 57 - interface/src/api/Endpoints.ts | 24 - interface/src/api/Env.ts | 26 - interface/src/api/ap.ts | 16 + interface/src/api/authentication.ts | 64 + interface/src/api/endpoints.ts | 105 + interface/src/api/env.ts | 2 + interface/src/api/features.ts | 9 + interface/src/api/index.ts | 2 - interface/src/api/mqtt.ts | 16 + interface/src/api/network.ts | 25 + interface/src/api/ntp.ts | 20 + interface/src/api/security.ts | 17 + interface/src/api/system.ts | 40 + .../src/authentication/AuthenticatedRoute.tsx | 56 - .../src/authentication/Authentication.ts | 129 - .../authentication/AuthenticationContext.tsx | 77 - .../authentication/AuthenticationWrapper.tsx | 135 - .../authentication/UnauthenticatedRoute.tsx | 35 - interface/src/authentication/index.ts | 6 - interface/src/components/ApplicationError.tsx | 59 - interface/src/components/ButtonRow.tsx | 26 + interface/src/components/ErrorButton.tsx | 11 - interface/src/components/FormActions.tsx | 7 - interface/src/components/FormButton.tsx | 13 - interface/src/components/FormLoader.tsx | 56 - .../src/components/FullScreenLoading.tsx | 32 - interface/src/components/HighlightAvatar.tsx | 19 - interface/src/components/MenuAppBar.tsx | 390 - interface/src/components/MessageBox.tsx | 48 + .../src/components/PasswordValidator.tsx | 64 - interface/src/components/RestController.tsx | 141 - interface/src/components/RestFormLoader.tsx | 64 - interface/src/components/SectionContent.tsx | 25 +- interface/src/components/SingleUpload.tsx | 128 - .../src/components/WebSocketController.tsx | 158 - .../src/components/WebSocketFormLoader.tsx | 43 - interface/src/components/WindowSize.tsx | 14 - interface/src/components/index.ts | 26 +- .../{ => inputs}/BlockFormControlLabel.tsx | 2 +- .../inputs/ValidatedPasswordField.tsx | 36 + .../components/inputs/ValidatedTextField.tsx | 24 + interface/src/components/inputs/index.ts | 3 + interface/src/components/layout/Layout.tsx | 36 + .../src/components/layout/LayoutAppBar.tsx | 51 + .../src/components/layout/LayoutAuthMenu.tsx | 73 + .../src/components/layout/LayoutDrawer.tsx | 73 + .../src/components/layout/LayoutMenu.tsx | 42 + .../src/components/layout/LayoutMenuItem.tsx | 32 + interface/src/components/layout/context.ts | 25 + interface/src/components/layout/index.ts | 2 + .../components/loading/ApplicationError.tsx | 43 + .../src/components/loading/FormLoader.tsx | 38 + .../src/components/loading/LoadingSpinner.tsx | 24 + interface/src/components/loading/index.ts | 3 + .../src/components/routing/RequireAdmin.tsx | 11 + .../routing/RequireAuthenticated.tsx | 30 + .../routing/RequireUnauthenticated.tsx | 15 + .../src/components/routing/RouterTabs.tsx | 27 + interface/src/components/routing/index.ts | 6 + .../src/components/routing/useRouterTab.ts | 9 + .../src/components/upload/SingleUpload.tsx | 86 + interface/src/components/upload/index.ts | 2 + .../src/components/upload/useFileUpload.ts | 59 + .../authentication/Authentication.tsx | 84 + .../src/contexts/authentication/context.ts | 19 + .../src/contexts/authentication/index.ts | 2 + .../src/contexts/features/FeaturesLoader.tsx | 47 + interface/src/contexts/features/context.ts | 10 + interface/src/contexts/features/index.ts | 2 + interface/src/features/FeaturesContext.tsx | 32 - interface/src/features/FeaturesWrapper.tsx | 31 - interface/src/framework/ap/APSettingsForm.tsx | 184 + interface/src/framework/ap/APStatusForm.tsx | 104 + interface/src/framework/ap/AccessPoint.tsx | 40 + interface/src/framework/mqtt/Mqtt.tsx | 40 + .../src/framework/mqtt/MqttSettingsForm.tsx | 315 + .../src/framework/mqtt/MqttStatusForm.tsx | 142 + .../framework/network/NetworkConnection.tsx | 72 + .../framework/network/NetworkSettingsForm.tsx | 257 + .../framework/network/NetworkStatusForm.tsx | 179 + .../network/WiFiConnectionContext.tsx | 11 + .../framework/network/WiFiNetworkScanner.tsx | 101 + .../framework/network/WiFiNetworkSelector.tsx | 69 + .../src/framework/ntp/NTPSettingsForm.tsx | 101 + interface/src/framework/ntp/NTPStatusForm.tsx | 218 + interface/src/framework/ntp/NetworkTime.tsx | 40 + interface/src/{ => framework}/ntp/TZ.tsx | 2 +- .../src/framework/security/GenerateToken.tsx | 79 + .../framework/security/ManageUsersForm.tsx | 176 + interface/src/framework/security/Security.tsx | 31 + .../security/SecuritySettingsForm.tsx | 80 + interface/src/framework/security/UserForm.tsx | 100 + .../framework/system/FirmwareFileUpload.tsx | 32 + .../system/FirmwareRestartMonitor.tsx | 43 + .../src/framework/system/OTASettingsForm.tsx | 97 + interface/src/framework/system/System.tsx | 60 + interface/src/framework/system/SystemLog.tsx | 282 + .../src/framework/system/SystemStatusForm.tsx | 379 + .../framework/system/UploadFirmwareForm.tsx | 26 + interface/src/history.ts | 5 - interface/src/hooks/index.ts | 2 - interface/src/hooks/useAuthorizedRest.ts | 12 - interface/src/hooks/useRest.ts | 79 - interface/src/index.tsx | 15 +- interface/src/mqtt/Mqtt.tsx | 56 - interface/src/mqtt/MqttSettingsController.tsx | 33 - interface/src/mqtt/MqttSettingsForm.tsx | 376 - interface/src/mqtt/MqttStatus.ts | 59 - interface/src/mqtt/MqttStatusController.tsx | 33 - interface/src/mqtt/MqttStatusForm.tsx | 116 - interface/src/network/NetworkConnection.tsx | 96 - .../src/network/NetworkConnectionContext.tsx | 13 - .../src/network/NetworkSettingsController.tsx | 35 - interface/src/network/NetworkSettingsForm.tsx | 286 - interface/src/network/NetworkStatus.ts | 57 - .../src/network/NetworkStatusController.tsx | 32 - interface/src/network/NetworkStatusForm.tsx | 169 - interface/src/network/WiFiNetworkScanner.tsx | 203 - interface/src/network/WiFiNetworkSelector.tsx | 65 - interface/src/network/WiFiSecurityModes.ts | 23 - interface/src/ntp/NTPSettingsController.tsx | 33 - interface/src/ntp/NTPSettingsForm.tsx | 96 - interface/src/ntp/NTPStatus.ts | 27 - interface/src/ntp/NTPStatusController.tsx | 33 - interface/src/ntp/NTPStatusForm.tsx | 262 - interface/src/ntp/NetworkTime.tsx | 57 - interface/src/project/Dashboard.tsx | 30 + interface/src/project/DashboardData.tsx | 825 + interface/src/project/DashboardStatus.tsx | 259 + interface/src/project/DeviceIcon.tsx | 42 + interface/src/project/EMSESPBoardProfiles.tsx | 22 - interface/src/project/EMSESPDashboard.tsx | 54 - .../src/project/EMSESPDataController.tsx | 35 - interface/src/project/EMSESPDataForm.tsx | 692 - interface/src/project/EMSESPHelp.tsx | 131 - interface/src/project/EMSESPSettings.tsx | 40 - .../src/project/EMSESPSettingsController.tsx | 39 - interface/src/project/EMSESPSettingsForm.tsx | 644 - interface/src/project/EMSESPStatus.ts | 39 - .../src/project/EMSESPStatusController.tsx | 34 - interface/src/project/EMSESPStatusForm.tsx | 105 - interface/src/project/EMSESPtypes.ts | 120 - interface/src/project/Help.tsx | 27 + interface/src/project/HelpInformation.tsx | 171 + interface/src/project/ProjectMenu.tsx | 73 +- interface/src/project/ProjectRouting.tsx | 56 +- interface/src/project/SensorForm.tsx | 101 - interface/src/project/Settings.tsx | 30 + interface/src/project/SettingsApplication.tsx | 541 + .../src/project/SettingsCustomization.tsx | 281 + interface/src/project/ValueForm.tsx | 115 - interface/src/project/api.ts | 89 + interface/src/project/types.ts | 254 + interface/src/project/validators.ts | 44 + interface/src/security/GenerateToken.tsx | 119 - .../src/security/ManageUsersController.tsx | 36 - interface/src/security/ManageUsersForm.tsx | 259 - interface/src/security/Security.tsx | 51 - .../security/SecuritySettingsController.tsx | 36 - .../src/security/SecuritySettingsForm.tsx | 75 - interface/src/security/UserForm.tsx | 142 - interface/src/serviceWorker.ts | 142 - interface/src/setupProxy.js | 24 +- interface/src/system/LogEventConsole.tsx | 143 - interface/src/system/LogEventController.tsx | 344 - .../src/system/OTASettingsController.tsx | 33 - interface/src/system/OTASettingsForm.tsx | 90 - interface/src/system/System.tsx | 87 - .../src/system/SystemStatusController.tsx | 33 - interface/src/system/SystemStatusForm.tsx | 376 - .../src/system/UploadFirmwareController.tsx | 93 - interface/src/system/UploadFirmwareForm.tsx | 41 - interface/src/system/VersionCheck.tsx | 211 - interface/src/{ap/types.ts => types/ap.ts} | 3 + .../{features/types.ts => types/features.ts} | 0 interface/src/types/index.ts | 9 + interface/src/types/me.ts | 4 + .../src/{mqtt/types.ts => types/mqtt.ts} | 3 +- .../{network/types.ts => types/network.ts} | 4 +- interface/src/{ntp/types.ts => types/ntp.ts} | 0 .../{security/types.ts => types/security.ts} | 2 +- interface/src/types/signin.ts | 8 + .../src/{system/types.ts => types/system.ts} | 20 +- interface/src/utils/binding.ts | 32 +- interface/src/utils/endpoints.ts | 4 + interface/src/utils/index.ts | 5 + interface/src/utils/route.ts | 1 + interface/src/utils/submit.ts | 8 + .../src/{ntp/TimeFormat.ts => utils/time.ts} | 9 +- interface/src/utils/useRest.ts | 66 + interface/src/utils/useWs.ts | 94 + interface/src/validators/ap.ts | 30 + interface/src/validators/authentication.ts | 12 + interface/src/validators/index.ts | 14 +- interface/src/validators/isHostname.ts | 8 - interface/src/validators/isIP.ts | 5 - interface/src/validators/isIPv4.ts | 5 - interface/src/validators/isPath.ts | 6 - interface/src/validators/mqtt.ts | 18 + interface/src/validators/network.ts | 21 + interface/src/validators/ntp.ts | 10 + interface/src/validators/optional.ts | 4 - interface/src/validators/or.ts | 8 - interface/src/validators/security.ts | 36 + interface/src/validators/shared.ts | 60 + interface/src/validators/system.ts | 12 + interface/tsconfig.json | 4 +- lib/ArduinoJson/ArduinoJson.h | 2 +- lib/ArduinoJson/CHANGELOG.md | 454 +- lib/ArduinoJson/LICENSE.md | 2 +- lib/ArduinoJson/README.md | 46 +- lib/ArduinoJson/SUPPORT.md | 27 - lib/ArduinoJson/src/ArduinoJson.h | 4 +- lib/ArduinoJson/src/ArduinoJson.hpp | 9 +- .../src/ArduinoJson/Array/ArrayFunctions.hpp | 2 +- .../src/ArduinoJson/Array/ArrayImpl.hpp | 2 +- .../src/ArduinoJson/Array/ArrayIterator.hpp | 2 +- .../src/ArduinoJson/Array/ArrayRef.hpp | 2 +- .../src/ArduinoJson/Array/ArrayShortcuts.hpp | 2 +- .../src/ArduinoJson/Array/ElementProxy.hpp | 2 +- .../src/ArduinoJson/Array/Utilities.hpp | 160 +- .../ArduinoJson/Collection/CollectionData.hpp | 11 +- .../ArduinoJson/Collection/CollectionImpl.hpp | 29 +- .../src/ArduinoJson/Configuration.hpp | 173 +- .../Deserialization/DeserializationError.hpp | 23 +- .../ArduinoJson/Deserialization/Filter.hpp | 2 +- .../Deserialization/NestingLimit.hpp | 2 +- .../ArduinoJson/Deserialization/Reader.hpp | 2 +- .../Readers/ArduinoStreamReader.hpp | 2 +- .../Readers/ArduinoStringReader.hpp | 4 +- .../Deserialization/Readers/FlashReader.hpp | 4 +- .../Readers/IteratorReader.hpp | 2 +- .../Deserialization/Readers/RamReader.hpp | 2 +- .../Readers/StdStreamReader.hpp | 2 +- .../Deserialization/Readers/VariantReader.hpp | 2 +- .../Deserialization/deserialize.hpp | 2 +- .../Document/BasicJsonDocument.hpp | 14 +- .../Document/DynamicJsonDocument.hpp | 2 +- .../src/ArduinoJson/Document/JsonDocument.hpp | 15 +- .../Document/StaticJsonDocument.hpp | 6 +- .../src/ArduinoJson/Json/EscapeSequence.hpp | 2 +- .../src/ArduinoJson/Json/JsonDeserializer.hpp | 17 +- .../src/ArduinoJson/Json/JsonSerializer.hpp | 8 +- .../src/ArduinoJson/Json/Latch.hpp | 2 +- .../ArduinoJson/Json/PrettyJsonSerializer.hpp | 2 +- .../src/ArduinoJson/Json/TextFormatter.hpp | 13 +- .../src/ArduinoJson/Json/Utf16.hpp | 2 +- lib/ArduinoJson/src/ArduinoJson/Json/Utf8.hpp | 2 +- .../src/ArduinoJson/Memory/Alignment.hpp | 2 +- .../src/ArduinoJson/Memory/MemoryPool.hpp | 16 +- .../src/ArduinoJson/Misc/SafeBoolIdiom.hpp | 26 + .../src/ArduinoJson/Misc/SerializedValue.hpp | 2 +- .../src/ArduinoJson/Misc/Visitable.hpp | 2 +- .../MsgPack/MsgPackDeserializer.hpp | 19 +- .../ArduinoJson/MsgPack/MsgPackSerializer.hpp | 8 +- .../src/ArduinoJson/MsgPack/endianess.hpp | 23 +- .../src/ArduinoJson/MsgPack/ieee754.hpp | 2 +- lib/ArduinoJson/src/ArduinoJson/Namespace.hpp | 2 +- .../src/ArduinoJson/Numbers/Float.hpp | 2 +- .../src/ArduinoJson/Numbers/FloatParts.hpp | 2 +- .../src/ArduinoJson/Numbers/FloatTraits.hpp | 44 +- .../src/ArduinoJson/Numbers/Integer.hpp | 2 +- .../ArduinoJson/Numbers/arithmeticCompare.hpp | 2 +- .../src/ArduinoJson/Numbers/convertNumber.hpp | 2 +- .../src/ArduinoJson/Numbers/parseNumber.hpp | 2 +- .../src/ArduinoJson/Object/MemberProxy.hpp | 2 +- .../ArduinoJson/Object/ObjectFunctions.hpp | 9 +- .../src/ArduinoJson/Object/ObjectImpl.hpp | 6 +- .../src/ArduinoJson/Object/ObjectIterator.hpp | 2 +- .../src/ArduinoJson/Object/ObjectRef.hpp | 12 +- .../ArduinoJson/Object/ObjectShortcuts.hpp | 2 +- .../src/ArduinoJson/Object/Pair.hpp | 2 +- .../src/ArduinoJson/Polyfills/alias_cast.hpp | 2 +- .../src/ArduinoJson/Polyfills/assert.hpp | 2 +- .../src/ArduinoJson/Polyfills/attributes.hpp | 2 +- .../src/ArduinoJson/Polyfills/ctype.hpp | 2 +- .../src/ArduinoJson/Polyfills/integer.hpp | 2 +- .../src/ArduinoJson/Polyfills/limits.hpp | 2 +- .../src/ArduinoJson/Polyfills/math.hpp | 2 +- .../src/ArduinoJson/Polyfills/mpl/max.hpp | 2 +- .../src/ArduinoJson/Polyfills/pgmspace.hpp | 38 +- .../Polyfills/pgmspace_generic.hpp | 12 +- .../ArduinoJson/Polyfills/preprocessor.hpp | 2 +- .../src/ArduinoJson/Polyfills/safe_strcmp.hpp | 32 - .../ArduinoJson/Polyfills/static_array.hpp | 24 +- .../src/ArduinoJson/Polyfills/type_traits.hpp | 2 +- .../Polyfills/type_traits/conditional.hpp | 2 +- .../Polyfills/type_traits/declval.hpp | 2 +- .../Polyfills/type_traits/enable_if.hpp | 2 +- .../type_traits/integral_constant.hpp | 2 +- .../Polyfills/type_traits/is_array.hpp | 2 +- .../Polyfills/type_traits/is_base_of.hpp | 2 +- .../Polyfills/type_traits/is_class.hpp | 2 +- .../Polyfills/type_traits/is_const.hpp | 2 +- .../Polyfills/type_traits/is_convertible.hpp | 2 +- .../Polyfills/type_traits/is_enum.hpp | 2 +- .../type_traits/is_floating_point.hpp | 2 +- .../Polyfills/type_traits/is_integral.hpp | 2 +- .../Polyfills/type_traits/is_pointer.hpp | 2 +- .../Polyfills/type_traits/is_same.hpp | 2 +- .../Polyfills/type_traits/is_signed.hpp | 2 +- .../Polyfills/type_traits/is_unsigned.hpp | 2 +- .../Polyfills/type_traits/make_unsigned.hpp | 2 +- .../Polyfills/type_traits/make_void.hpp | 2 +- .../Polyfills/type_traits/remove_const.hpp | 2 +- .../Polyfills/type_traits/remove_cv.hpp | 2 +- .../type_traits/remove_reference.hpp | 2 +- .../Polyfills/type_traits/type_identity.hpp | 2 +- .../src/ArduinoJson/Polyfills/utility.hpp | 28 - .../Serialization/CountingDecorator.hpp | 2 +- .../src/ArduinoJson/Serialization/Writer.hpp | 2 +- .../Writers/ArduinoStringWriter.hpp | 2 +- .../Serialization/Writers/DummyWriter.hpp | 2 +- .../Serialization/Writers/PrintWriter.hpp | 4 +- .../Writers/StaticStringWriter.hpp | 2 +- .../Serialization/Writers/StdStreamWriter.hpp | 2 +- .../Serialization/Writers/StdStringWriter.hpp | 2 +- .../src/ArduinoJson/Serialization/measure.hpp | 2 +- .../ArduinoJson/Serialization/serialize.hpp | 2 +- .../StringStorage/StringCopier.hpp | 36 +- .../ArduinoJson/StringStorage/StringMover.hpp | 19 +- .../StringStorage/StringStorage.hpp | 2 +- .../Strings/Adapters/ArduinoString.hpp | 24 + .../Strings/Adapters/ArduinoStringAdapter.hpp | 51 - .../Adapters/ConstRamStringAdapter.hpp | 51 - .../Strings/Adapters/FlashString.hpp | 80 + .../Strings/Adapters/FlashStringAdapter.hpp | 48 - .../Strings/Adapters/JsonString.hpp | 20 + .../Strings/Adapters/JsonStringAdapter.hpp | 27 - .../Strings/Adapters/RamString.hpp | 119 + .../Strings/Adapters/RamStringAdapter.hpp | 29 - .../Adapters/SizedFlashStringAdapter.hpp | 48 - .../Adapters/SizedRamStringAdapter.hpp | 43 - .../Strings/Adapters/StdString.hpp | 23 + .../Strings/Adapters/StdStringAdapter.hpp | 46 - .../Strings/Adapters/StringView.hpp | 20 + .../Strings/Adapters/StringViewAdapter.hpp | 44 - .../src/ArduinoJson/Strings/IsString.hpp | 17 + .../ArduinoJson/Strings/IsWriteableString.hpp | 37 - .../src/ArduinoJson/Strings/StoragePolicy.hpp | 53 +- .../src/ArduinoJson/Strings/StoredString.hpp | 35 + .../src/ArduinoJson/Strings/String.hpp | 37 +- .../src/ArduinoJson/Strings/StringAdapter.hpp | 32 - .../ArduinoJson/Strings/StringAdapters.hpp | 81 +- .../src/ArduinoJson/Variant/Converter.hpp | 2 +- .../src/ArduinoJson/Variant/ConverterImpl.hpp | 95 +- .../src/ArduinoJson/Variant/SlotFunctions.hpp | 52 +- .../ArduinoJson/Variant/VariantCompare.hpp | 10 +- .../ArduinoJson/Variant/VariantContent.hpp | 5 +- .../src/ArduinoJson/Variant/VariantData.hpp | 131 +- .../ArduinoJson/Variant/VariantFunctions.hpp | 21 +- .../src/ArduinoJson/Variant/VariantImpl.hpp | 45 +- .../ArduinoJson/Variant/VariantOperators.hpp | 4 +- .../src/ArduinoJson/Variant/VariantRef.hpp | 4 +- .../ArduinoJson/Variant/VariantShortcuts.hpp | 2 +- .../src/ArduinoJson/Variant/VariantSlot.hpp | 22 +- .../src/ArduinoJson/Variant/VariantTag.hpp | 2 +- .../src/ArduinoJson/Variant/VariantTo.hpp | 2 +- .../src/ArduinoJson/Variant/Visitor.hpp | 4 +- .../src/ArduinoJson/compatibility.hpp | 2 +- lib/ArduinoJson/src/ArduinoJson/version.hpp | 8 +- lib/ArduinoJson/src/CMakeLists.txt | 2 +- lib/ESPAsyncWebServer/AsyncJson.h | 9 +- lib/PButton/PButon.cpp | 7 +- lib/framework/APSettingsService.cpp | 2 +- lib/framework/APSettingsService.h | 58 +- lib/framework/APStatus.h | 2 +- lib/framework/AuthenticationService.cpp | 2 +- lib/framework/AuthenticationService.h | 5 +- lib/framework/ESP8266React.cpp | 5 - lib/framework/ESPUtils.h | 2 +- lib/framework/FSPersistence.h | 6 +- lib/framework/FactoryResetService.h | 2 +- lib/framework/HttpEndpoint.h | 9 +- lib/framework/IPUtils.h | 2 +- lib/framework/JsonUtils.h | 2 +- lib/framework/MqttPubSub.h | 2 +- lib/framework/MqttSettingsService.cpp | 21 +- lib/framework/MqttSettingsService.h | 5 +- lib/framework/MqttStatus.h | 2 +- lib/framework/NTPSettingsService.h | 2 +- lib/framework/NTPStatus.h | 2 +- lib/framework/OTASettingsService.cpp | 18 +- lib/framework/OTASettingsService.h | 4 +- lib/framework/RestartService.h | 2 +- lib/framework/SecurityManager.h | 2 +- lib/framework/SecuritySettingsService.h | 4 +- lib/framework/StatefulService.h | 9 +- lib/framework/SystemStatus.h | 2 +- lib/framework/UploadFirmwareService.h | 2 +- lib/framework/WiFiScanner.h | 2 +- lib/uuid-syslog/src/syslog.cpp | 26 +- lib_standalone/Arduino.cpp | 10 + lib_standalone/Arduino.h | 13 +- lib_standalone/ESP8266React.h | 81 +- lib_standalone/FSPersistence.h | 2 +- lib_standalone/HttpEndpoint.h | 2 +- lib_standalone/Network.h | 4 + lib_standalone/SecurityManager.h | 2 +- lib_standalone/SecuritySettingsService.h | 4 +- lib_standalone/StatefulService.h | 7 +- media/EMS-ESP_logo.png | Bin 4159 -> 0 bytes media/boiler.svg | 1 - media/boiler_128.png | Bin 4329 -> 0 bytes media/boiler_16.png | Bin 594 -> 0 bytes media/boiler_16x16.ico | Bin 1150 -> 0 bytes media/boiler_24.png | Bin 856 -> 0 bytes media/boiler_256.png | Bin 8572 -> 0 bytes media/boiler_32.png | Bin 1186 -> 0 bytes media/boiler_512.png | Bin 18042 -> 0 bytes media/boiler_64.png | Bin 2238 -> 0 bytes media/console.png | Bin 561391 -> 739700 bytes media/domoticz.png | Bin 27057 -> 0 bytes media/esp8266.png | Bin 92063 -> 0 bytes media/ha_lovelace.png | Bin 155908 -> 181867 bytes media/home-assistant.png | Bin 4257 -> 0 bytes media/logo-proddy-fw.jpg | Bin 8478 -> 0 bytes media/web_devices.png | Bin 81200 -> 89709 bytes media/web_edit.png | Bin 110309 -> 64080 bytes media/web_log.png | Bin 248347 -> 167225 bytes media/web_mqtt.png | Bin 73909 -> 81965 bytes media/web_settings.png | Bin 102992 -> 94566 bytes media/web_status.png | Bin 48021 -> 49196 bytes mock-api/.prettierrc | 2 +- mock-api/package-lock.json | 1059 +- mock-api/package.json | 9 +- mock-api/server.js | 995 +- pio_local.ini_example | 25 +- platformio.ini | 4 + scripts/api_test.http | 31 + scripts/bootloader_dio_40m.bin | Bin 15872 -> 17104 bytes scripts/build_interface.py | 24 +- scripts/clang-format.py | 0 scripts/clang-tidy.py | 0 scripts/espota.py | 0 scripts/esptool.py | 0 scripts/helpers.py | 0 scripts/main_script.py | 37 - scripts/rename_fw.py | 0 scripts/upload_esp32.py | 0 scripts/upload_fw.py | 18 - src/analogsensor.cpp | 413 + src/analogsensor.h | 180 + src/command.cpp | 71 +- src/command.h | 10 +- src/console.cpp | 141 +- src/console.h | 13 +- src/dallassensor.cpp | 470 +- src/dallassensor.h | 84 +- src/default_settings.h | 44 +- src/device_library.h | 16 +- src/devices/boiler.cpp | 1213 +- src/devices/boiler.h | 78 +- src/devices/connect.cpp | 9 +- src/devices/connect.h | 7 +- src/devices/controller.cpp | 9 +- src/devices/controller.h | 7 +- src/devices/gateway.cpp | 9 +- src/devices/gateway.h | 7 +- src/devices/generic.cpp | 13 +- src/devices/generic.h | 4 +- src/devices/heatpump.cpp | 47 +- src/devices/heatpump.h | 7 +- src/devices/mixer.cpp | 280 +- src/devices/mixer.h | 34 +- src/devices/solar.cpp | 921 +- src/devices/solar.h | 159 +- src/devices/switch.cpp | 61 +- src/devices/switch.h | 7 +- src/devices/thermostat.cpp | 1807 +- src/devices/thermostat.h | 66 +- src/emsdevice.cpp | 965 +- src/emsdevice.h | 311 +- src/emsdevicevalue.cpp | 250 + src/emsdevicevalue.h | 190 + src/emsesp.cpp | 401 +- src/emsesp.h | 95 +- src/emsesp_stub.hpp | 1 + src/emsfactory.h | 8 +- src/helpers.cpp | 286 +- src/helpers.h | 32 +- src/locale_DE.h | 639 + src/locale_EN.h | 246 +- src/mqtt.cpp | 467 +- src/mqtt.h | 87 +- src/shower.cpp | 33 +- src/system.cpp | 608 +- src/system.h | 107 +- src/telegram.cpp | 35 +- src/telegram.h | 104 +- src/test/test.cpp | 209 +- src/test/test.h | 13 +- src/version.h | 2 +- src/web/WebAPIService.cpp | 34 +- src/web/WebAPIService.h | 19 +- src/web/WebCustomizationService.cpp | 272 + src/web/WebCustomizationService.h | 106 + src/web/WebDataService.cpp | 180 +- src/web/WebDataService.h | 20 +- src/web/WebLogService.cpp | 11 +- src/web/WebLogService.h | 7 - src/web/WebSettingsService.cpp | 164 +- src/web/WebSettingsService.h | 45 +- src/web/WebStatusService.cpp | 49 +- src/web/WebStatusService.h | 8 +- 538 files changed, 32282 insertions(+), 38655 deletions(-) delete mode 100644 interface/.env.development delete mode 100644 interface/.eslintignore delete mode 100644 interface/.eslintrc delete mode 100644 interface/public/fonts/li.woff2 create mode 100644 interface/public/fonts/md.woff2 delete mode 100644 interface/public/fonts/me.woff2 create mode 100644 interface/src/AuthenticatedRouting.tsx delete mode 100644 interface/src/CustomMuiTheme.tsx create mode 100644 interface/src/CustomTheme.tsx delete mode 100644 interface/src/ap/APModes.ts delete mode 100644 interface/src/ap/APSettingsController.tsx delete mode 100644 interface/src/ap/APSettingsForm.tsx delete mode 100644 interface/src/ap/APStatus.ts delete mode 100644 interface/src/ap/APStatusController.tsx delete mode 100644 interface/src/ap/APStatusForm.tsx delete mode 100644 interface/src/ap/AccessPoint.tsx delete mode 100644 interface/src/api/Endpoints.ts delete mode 100644 interface/src/api/Env.ts create mode 100644 interface/src/api/ap.ts create mode 100644 interface/src/api/authentication.ts create mode 100644 interface/src/api/endpoints.ts create mode 100644 interface/src/api/env.ts create mode 100644 interface/src/api/features.ts delete mode 100644 interface/src/api/index.ts create mode 100644 interface/src/api/mqtt.ts create mode 100644 interface/src/api/network.ts create mode 100644 interface/src/api/ntp.ts create mode 100644 interface/src/api/security.ts create mode 100644 interface/src/api/system.ts delete mode 100644 interface/src/authentication/AuthenticatedRoute.tsx delete mode 100644 interface/src/authentication/Authentication.ts delete mode 100644 interface/src/authentication/AuthenticationContext.tsx delete mode 100644 interface/src/authentication/AuthenticationWrapper.tsx delete mode 100644 interface/src/authentication/UnauthenticatedRoute.tsx delete mode 100644 interface/src/authentication/index.ts delete mode 100644 interface/src/components/ApplicationError.tsx create mode 100644 interface/src/components/ButtonRow.tsx delete mode 100644 interface/src/components/ErrorButton.tsx delete mode 100644 interface/src/components/FormActions.tsx delete mode 100644 interface/src/components/FormButton.tsx delete mode 100644 interface/src/components/FormLoader.tsx delete mode 100644 interface/src/components/FullScreenLoading.tsx delete mode 100644 interface/src/components/HighlightAvatar.tsx delete mode 100644 interface/src/components/MenuAppBar.tsx create mode 100644 interface/src/components/MessageBox.tsx delete mode 100644 interface/src/components/PasswordValidator.tsx delete mode 100644 interface/src/components/RestController.tsx delete mode 100644 interface/src/components/RestFormLoader.tsx delete mode 100644 interface/src/components/SingleUpload.tsx delete mode 100644 interface/src/components/WebSocketController.tsx delete mode 100644 interface/src/components/WebSocketFormLoader.tsx delete mode 100644 interface/src/components/WindowSize.tsx rename interface/src/components/{ => inputs}/BlockFormControlLabel.tsx (71%) create mode 100644 interface/src/components/inputs/ValidatedPasswordField.tsx create mode 100644 interface/src/components/inputs/ValidatedTextField.tsx create mode 100644 interface/src/components/inputs/index.ts create mode 100644 interface/src/components/layout/Layout.tsx create mode 100644 interface/src/components/layout/LayoutAppBar.tsx create mode 100644 interface/src/components/layout/LayoutAuthMenu.tsx create mode 100644 interface/src/components/layout/LayoutDrawer.tsx create mode 100644 interface/src/components/layout/LayoutMenu.tsx create mode 100644 interface/src/components/layout/LayoutMenuItem.tsx create mode 100644 interface/src/components/layout/context.ts create mode 100644 interface/src/components/layout/index.ts create mode 100644 interface/src/components/loading/ApplicationError.tsx create mode 100644 interface/src/components/loading/FormLoader.tsx create mode 100644 interface/src/components/loading/LoadingSpinner.tsx create mode 100644 interface/src/components/loading/index.ts create mode 100644 interface/src/components/routing/RequireAdmin.tsx create mode 100644 interface/src/components/routing/RequireAuthenticated.tsx create mode 100644 interface/src/components/routing/RequireUnauthenticated.tsx create mode 100644 interface/src/components/routing/RouterTabs.tsx create mode 100644 interface/src/components/routing/index.ts create mode 100644 interface/src/components/routing/useRouterTab.ts create mode 100644 interface/src/components/upload/SingleUpload.tsx create mode 100644 interface/src/components/upload/index.ts create mode 100644 interface/src/components/upload/useFileUpload.ts create mode 100644 interface/src/contexts/authentication/Authentication.tsx create mode 100644 interface/src/contexts/authentication/context.ts create mode 100644 interface/src/contexts/authentication/index.ts create mode 100644 interface/src/contexts/features/FeaturesLoader.tsx create mode 100644 interface/src/contexts/features/context.ts create mode 100644 interface/src/contexts/features/index.ts delete mode 100644 interface/src/features/FeaturesContext.tsx delete mode 100644 interface/src/features/FeaturesWrapper.tsx create mode 100644 interface/src/framework/ap/APSettingsForm.tsx create mode 100644 interface/src/framework/ap/APStatusForm.tsx create mode 100644 interface/src/framework/ap/AccessPoint.tsx create mode 100644 interface/src/framework/mqtt/Mqtt.tsx create mode 100644 interface/src/framework/mqtt/MqttSettingsForm.tsx create mode 100644 interface/src/framework/mqtt/MqttStatusForm.tsx create mode 100644 interface/src/framework/network/NetworkConnection.tsx create mode 100644 interface/src/framework/network/NetworkSettingsForm.tsx create mode 100644 interface/src/framework/network/NetworkStatusForm.tsx create mode 100644 interface/src/framework/network/WiFiConnectionContext.tsx create mode 100644 interface/src/framework/network/WiFiNetworkScanner.tsx create mode 100644 interface/src/framework/network/WiFiNetworkSelector.tsx create mode 100644 interface/src/framework/ntp/NTPSettingsForm.tsx create mode 100644 interface/src/framework/ntp/NTPStatusForm.tsx create mode 100644 interface/src/framework/ntp/NetworkTime.tsx rename interface/src/{ => framework}/ntp/TZ.tsx (99%) create mode 100644 interface/src/framework/security/GenerateToken.tsx create mode 100644 interface/src/framework/security/ManageUsersForm.tsx create mode 100644 interface/src/framework/security/Security.tsx create mode 100644 interface/src/framework/security/SecuritySettingsForm.tsx create mode 100644 interface/src/framework/security/UserForm.tsx create mode 100644 interface/src/framework/system/FirmwareFileUpload.tsx create mode 100644 interface/src/framework/system/FirmwareRestartMonitor.tsx create mode 100644 interface/src/framework/system/OTASettingsForm.tsx create mode 100644 interface/src/framework/system/System.tsx create mode 100644 interface/src/framework/system/SystemLog.tsx create mode 100644 interface/src/framework/system/SystemStatusForm.tsx create mode 100644 interface/src/framework/system/UploadFirmwareForm.tsx delete mode 100644 interface/src/history.ts delete mode 100644 interface/src/hooks/index.ts delete mode 100644 interface/src/hooks/useAuthorizedRest.ts delete mode 100644 interface/src/hooks/useRest.ts delete mode 100644 interface/src/mqtt/Mqtt.tsx delete mode 100644 interface/src/mqtt/MqttSettingsController.tsx delete mode 100644 interface/src/mqtt/MqttSettingsForm.tsx delete mode 100644 interface/src/mqtt/MqttStatus.ts delete mode 100644 interface/src/mqtt/MqttStatusController.tsx delete mode 100644 interface/src/mqtt/MqttStatusForm.tsx delete mode 100644 interface/src/network/NetworkConnection.tsx delete mode 100644 interface/src/network/NetworkConnectionContext.tsx delete mode 100644 interface/src/network/NetworkSettingsController.tsx delete mode 100644 interface/src/network/NetworkSettingsForm.tsx delete mode 100644 interface/src/network/NetworkStatus.ts delete mode 100644 interface/src/network/NetworkStatusController.tsx delete mode 100644 interface/src/network/NetworkStatusForm.tsx delete mode 100644 interface/src/network/WiFiNetworkScanner.tsx delete mode 100644 interface/src/network/WiFiNetworkSelector.tsx delete mode 100644 interface/src/network/WiFiSecurityModes.ts delete mode 100644 interface/src/ntp/NTPSettingsController.tsx delete mode 100644 interface/src/ntp/NTPSettingsForm.tsx delete mode 100644 interface/src/ntp/NTPStatus.ts delete mode 100644 interface/src/ntp/NTPStatusController.tsx delete mode 100644 interface/src/ntp/NTPStatusForm.tsx delete mode 100644 interface/src/ntp/NetworkTime.tsx create mode 100644 interface/src/project/Dashboard.tsx create mode 100644 interface/src/project/DashboardData.tsx create mode 100644 interface/src/project/DashboardStatus.tsx create mode 100644 interface/src/project/DeviceIcon.tsx delete mode 100644 interface/src/project/EMSESPBoardProfiles.tsx delete mode 100644 interface/src/project/EMSESPDashboard.tsx delete mode 100644 interface/src/project/EMSESPDataController.tsx delete mode 100644 interface/src/project/EMSESPDataForm.tsx delete mode 100644 interface/src/project/EMSESPHelp.tsx delete mode 100644 interface/src/project/EMSESPSettings.tsx delete mode 100644 interface/src/project/EMSESPSettingsController.tsx delete mode 100644 interface/src/project/EMSESPSettingsForm.tsx delete mode 100644 interface/src/project/EMSESPStatus.ts delete mode 100644 interface/src/project/EMSESPStatusController.tsx delete mode 100644 interface/src/project/EMSESPStatusForm.tsx delete mode 100644 interface/src/project/EMSESPtypes.ts create mode 100644 interface/src/project/Help.tsx create mode 100644 interface/src/project/HelpInformation.tsx delete mode 100644 interface/src/project/SensorForm.tsx create mode 100644 interface/src/project/Settings.tsx create mode 100644 interface/src/project/SettingsApplication.tsx create mode 100644 interface/src/project/SettingsCustomization.tsx delete mode 100644 interface/src/project/ValueForm.tsx create mode 100644 interface/src/project/api.ts create mode 100644 interface/src/project/types.ts create mode 100644 interface/src/project/validators.ts delete mode 100644 interface/src/security/GenerateToken.tsx delete mode 100644 interface/src/security/ManageUsersController.tsx delete mode 100644 interface/src/security/ManageUsersForm.tsx delete mode 100644 interface/src/security/Security.tsx delete mode 100644 interface/src/security/SecuritySettingsController.tsx delete mode 100644 interface/src/security/SecuritySettingsForm.tsx delete mode 100644 interface/src/security/UserForm.tsx delete mode 100644 interface/src/serviceWorker.ts delete mode 100644 interface/src/system/LogEventConsole.tsx delete mode 100644 interface/src/system/LogEventController.tsx delete mode 100644 interface/src/system/OTASettingsController.tsx delete mode 100644 interface/src/system/OTASettingsForm.tsx delete mode 100644 interface/src/system/System.tsx delete mode 100644 interface/src/system/SystemStatusController.tsx delete mode 100644 interface/src/system/SystemStatusForm.tsx delete mode 100644 interface/src/system/UploadFirmwareController.tsx delete mode 100644 interface/src/system/UploadFirmwareForm.tsx delete mode 100644 interface/src/system/VersionCheck.tsx rename interface/src/{ap/types.ts => types/ap.ts} (87%) rename interface/src/{features/types.ts => types/features.ts} (100%) create mode 100644 interface/src/types/index.ts create mode 100644 interface/src/types/me.ts rename interface/src/{mqtt/types.ts => types/mqtt.ts} (94%) rename interface/src/{network/types.ts => types/network.ts} (96%) rename interface/src/{ntp/types.ts => types/ntp.ts} (100%) rename interface/src/{security/types.ts => types/security.ts} (84%) create mode 100644 interface/src/types/signin.ts rename interface/src/{system/types.ts => types/system.ts} (83%) create mode 100644 interface/src/utils/endpoints.ts create mode 100644 interface/src/utils/route.ts create mode 100644 interface/src/utils/submit.ts rename interface/src/{ntp/TimeFormat.ts => utils/time.ts} (87%) create mode 100644 interface/src/utils/useRest.ts create mode 100644 interface/src/utils/useWs.ts create mode 100644 interface/src/validators/ap.ts create mode 100644 interface/src/validators/authentication.ts delete mode 100644 interface/src/validators/isHostname.ts delete mode 100644 interface/src/validators/isIP.ts delete mode 100644 interface/src/validators/isIPv4.ts delete mode 100644 interface/src/validators/isPath.ts create mode 100644 interface/src/validators/mqtt.ts create mode 100644 interface/src/validators/network.ts create mode 100644 interface/src/validators/ntp.ts delete mode 100644 interface/src/validators/optional.ts delete mode 100644 interface/src/validators/or.ts create mode 100644 interface/src/validators/security.ts create mode 100644 interface/src/validators/shared.ts create mode 100644 interface/src/validators/system.ts delete mode 100644 lib/ArduinoJson/SUPPORT.md create mode 100644 lib/ArduinoJson/src/ArduinoJson/Misc/SafeBoolIdiom.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Polyfills/safe_strcmp.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Polyfills/utility.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ArduinoStringAdapter.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ConstRamStringAdapter.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/FlashString.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/FlashStringAdapter.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/JsonString.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/JsonStringAdapter.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamString.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamStringAdapter.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/SizedFlashStringAdapter.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/SizedRamStringAdapter.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StdString.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StdStringAdapter.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StringView.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StringViewAdapter.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/IsString.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/IsWriteableString.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/StoredString.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapter.hpp delete mode 100644 media/EMS-ESP_logo.png delete mode 100644 media/boiler.svg delete mode 100644 media/boiler_128.png delete mode 100644 media/boiler_16.png delete mode 100644 media/boiler_16x16.ico delete mode 100644 media/boiler_24.png delete mode 100644 media/boiler_256.png delete mode 100644 media/boiler_32.png delete mode 100644 media/boiler_512.png delete mode 100644 media/boiler_64.png delete mode 100644 media/domoticz.png delete mode 100644 media/esp8266.png delete mode 100644 media/home-assistant.png delete mode 100644 media/logo-proddy-fw.jpg create mode 100644 scripts/api_test.http mode change 100755 => 100644 scripts/build_interface.py mode change 100755 => 100644 scripts/clang-format.py mode change 100755 => 100644 scripts/clang-tidy.py mode change 100755 => 100644 scripts/espota.py mode change 100755 => 100644 scripts/esptool.py mode change 100755 => 100644 scripts/helpers.py delete mode 100755 scripts/main_script.py mode change 100755 => 100644 scripts/rename_fw.py mode change 100755 => 100644 scripts/upload_esp32.py delete mode 100755 scripts/upload_fw.py create mode 100644 src/analogsensor.cpp create mode 100644 src/analogsensor.h create mode 100644 src/emsdevicevalue.cpp create mode 100644 src/emsdevicevalue.h create mode 100644 src/locale_DE.h create mode 100644 src/web/WebCustomizationService.cpp create mode 100644 src/web/WebCustomizationService.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d24ee944..e07faec1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,68 +5,6 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -# [3.3.0] - November 28 2021 - -## Added - -- Add system commands for syslog level and watch [#98](https://github.com/emsesp/EMS-ESP32/issues/98) -- Added pool data to telegrams 0x494 & 0x495 [#102](https://github.com/emsesp/EMS-ESP32/issues/102) -- Add RC300 second summermode telegram [#108](https://github.com/emsesp/EMS-ESP32/issues/108) -- Add support for the RC25 thermostat [#106](https://github.com/emsesp/EMS-ESP32/issues/106) -- Add new command 'entities' for a device, e.g. http://ems-esp/api/boiler/entities to show the shortname, description and HA Entity name (if HA enabled) [#116](https://github.com/emsesp/EMS-ESP32/issues/116) -- Support for Junkers program and remote (fb10/fb110) temperature -- Home Assistant `state_class` attribute for Wh, kWh, W and KW [#129](https://github.com/emsesp/EMS-ESP32/issues/129) -- Add current room influence for RC300 [#136](https://github.com/emsesp/EMS-ESP32/issues/136) -- Added Home Assistant device_class to sensor entities -- Added another Buderus RC10 thermostat with Product ID 65 [#160](https://github.com/emsesp/EMS-ESP32/issues/160) -- Added support for mDNS [#161](https://github.com/emsesp/EMS-ESP32/issues/161) -- Added last system ESP32 reset code to log (and `system info` output) -- Firmware Checker in WebUI [#168](https://github.com/emsesp/EMS-ESP32/issues/168) -- Added new MQTT setting for enabling 'response' topic -- Support for non-standard Thermostats like Tado [#174](https://github.com/emsesp/EMS-ESP32/issues/174) -- Include MQTT connection status in 'api/system/info' -- Include Network status in 'api/system/info' and also the MQTT topic `info` [#202](https://github.com/emsesp/EMS-ESP32/issues/202) -- Added Ethernet PHY module as an option in the Board Profile [#210](https://github.com/emsesp/EMS-ESP32/issues/210) - -## Fixed - -- MQTT reconnecting after WiFi reconnect [#99](https://github.com/emsesp/EMS-ESP32/issues/99) -- Manually Controlling Solar Circuit [#107](https://github.com/emsesp/EMS-ESP32/issues/107) -- Fix thermostat commands not defaulting to the master thermostat [#110](https://github.com/emsesp/EMS-ESP32/issues/110) -- Enlarge parse-buffer for long names like `cylinderpumpmodulation` -- MQTT not subscribing to all device entities [#166](https://github.com/emsesp/EMS-ESP32/issues/166) -- Help fix issues with WebUI unable to fully load UI over Ethernet [#177](https://github.com/emsesp/EMS-ESP32/issues/177) -- Shower alert never reset after limit reached when enabled [(PR #185)] -- Remove HA entity entries when a device value goes dormant [#196](https://github.com/emsesp/EMS-ESP32/issues/196) -- deciphering last error code dates on 0xC2 telegram [#204](https://github.com/emsesp/EMS-ESP32/issues/204) - -## Changed - -- Syslog BOM only for utf-8 messages [#91](https://github.com/emsesp/EMS-ESP32/issues/91) -- Check for KM200 by device-id 0x48, remove tx-delay [#90](https://github.com/emsesp/EMS-ESP32/issues/90) -- rename `fastheatupfactor` to `fastheatup` and add percent [#122](https://github.com/emsesp/EMS-ESP32/issues/122) -- "unit" renamed to "uom" in API call to recall a Device Value -- initial backend React changes to replace the class components (HOCs) with React Hooks -- Use program-names instead of numbers -- Boiler's maintenancemessage always published in MQTT (to prevent HA missing entity) -- Unit of Measure 'times' added to MQTT Fails, Rx fails, Rx received, Tx fails, Tx reads & Tx writes -- Improved API. Restful HTTP API works in the same way as MQTT calls -- Removed settings for MQTT subscribe format [#173](https://github.com/emsesp/EMS-ESP32/issues/173) -- Improve Nefit Moduline 200 functionality [#183](https://github.com/emsesp/EMS-ESP32/issues/183) -- `status` in the MQTT heartbeat renamed to `bus_status` -- Layout changes in the WebUI, showing stripped table rows in Dashboard -- Alternative font for log window [#219](https://github.com/emsesp/EMS-ESP32/issues/219) - -## **BREAKING CHANGES** - -- API: "unit" renamed to "uom" in API call to recall a Device Value -- HA: `sensor.boiler_boiler_temperature` renamed to `sensor.actual_boiler_temperature` -- HA: `binary_sensor.boiler_ww_disinfecting` renamed to `binary_sensor.boiler_ww_disinfection` -- HA: # removed from counts in MQTT Fails, Rx fails, Rx received, Tx fails, Tx reads & Tx writes -- `txread` renamed to `txreads` and `txwrite` renamed to `txwrites` in MQTT heartbeat payload -- 'dallas sensors' in api/system/info moved to the "System" section. Renamed "uptime (seconds)" and "reset reason" -- `status` in the MQTT heartbeat renamed to `bus_status` - # [3.2.1] August 8 2021 ## Added diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 90b48d1f8..183a3f19a 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -1,17 +1,56 @@ # Changelog -# [3.3.1] +# [3.4.0] ## Added +- WebUI optimizations, updated look&feel and better performance [#124](https://github.com/emsesp/EMS-ESP32/issues/124) +- Auto refresh of WebUI after successful firmware upload [#178](https://github.com/emsesp/EMS-ESP32/issues/178) +- New Customization Service in WebUI. First feature is the ability to enable/disabled Enitites (device values) from EMS devices [#206](https://github.com/emsesp/EMS-ESP32/issues/206) +- Option to disable Telnet Console [#209](https://github.com/emsesp/EMS-ESP32/issues/209) +- Added Hide SSID, Max Clients and Preferred Channel to Access Point +- Merged in MichaelDvP's changes like Fahrenheit conversion, publish single (for IOBroker) and a few other critical optimizations +- Enabled bi-directional read/write with Home Assistant, so values can be changed automatically from the UI without scripting [#265](https://github.com/emsesp/EMS-ESP32/issues/265) +- Added GC7000F Boiler [#270](https://github.com/emsesp/EMS-ESP32/issues/270) +- Revised LED flash sequence on boot up to show system health (1 flash=no ems, 2 flashes=no wifi) [#224](https://github.com/emsesp/EMS-ESP32/issues/224) +- Analog Sensor support [#271](https://github.com/emsesp/EMS-ESP32/issues/271) +- Solar cylinder priority [#247](https://github.com/emsesp/EMS-ESP32/issues/247) +- Read only mode in Settings, where EMS Tx/Write commands are blocked [#286](https://github.com/emsesp/EMS-ESP32/issues/286) +- Added 8700i Boiler device +- Added Cascade CM10 Controller device +- Add Olimex ESP32-POE-ISO to board profiles plus settings to customize Ethernet modules [#301](https://github.com/emsesp/EMS-ESP32/issues/301) + ## Fixed - lastcode broke MQTT JSON structure [#228](https://github.com/emsesp/EMS-ESP32/issues/228) -- overlapping while reading sequence of EMS1.0 telegrams -- redundant telegram readings (because of offset overflow) -- added missing RC30/Moduline400 [#243](https://github.com/emsesp/EMS-ESP32/issues/243) -- check received status before toggling fetch on empty telegram [#268][#282] +- fixed issue with overlapping while reading sequence of EMS1.0 telegrams +- fixed redundant telegram readings (because of offset overflow) +- added missing RC30/Moduline 400 [#243](https://github.com/emsesp/EMS-ESP32/issues/243) +- Correct modes for RC25 [#106](https://github.com/emsesp/EMS-ESP32/issues/106) +- Clean up old HA config's in MQTT before publishing data. This will prevent HA giving the 'dict' warnings [#229](https://github.com/emsesp/EMS-ESP32/issues/229) +- RC25 temperature setting [#272](https://github.com/emsesp/EMS-ESP32/issues/272) +- Buderus RC25 - "hc1 mode type" incorrect value [#273](https://github.com/emsesp/EMS-ESP32/issues/273) +- Increased number of Mixers and Heating Circuits [#294](https://github.com/emsesp/EMS-ESP32/issues/294) +- Check receive status before removing a telegram fetch [#268](https://github.com/emsesp/EMS-ESP32/issues/268), [#282](https://github.com/emsesp/EMS-ESP32/issues/282) ## Changed -## **BREAKING CHANGES** +- Use flash system to show system health (1 flash=no ems, 2 flashes=no wifi) [#224](https://github.com/emsesp/EMS-ESP32/issues/224) +- Renamed Dallas Sensor to Temperature Sensor in UI +- Dallas Format removed. Use the name to give each sensor an alias +- No longer MQTT subscribes to topic `/thermostat_hc` as it supports a path similar to the API endpoint construct +- Show Sensors quality in WebUI +- Controller not shown in WebUI dashboard +- renamed "Home Assistant Integration" to "MQTT Discovery" in MQTT Settings [#290](https://github.com/emsesp/EMS-ESP32/issues/290) +- Show ems tx reads and writes separatly +- Show ems device handlers separated for received, fetched and pending handlers. + +## **BREAKING CHANGES:** + +- Settings: + - order of Boolean Format has changed in Application Settings - check your settings + - Dallas Format setting removed. Now customize name of each Dallas sensor via the UI +- MQTT/API + - Boiler `wwheat` renamed to `ww3wayon` [#211](https://github.com/emsesp/EMS-ESP32/issues/211) + - Boiler `ww` tag renamed to `dhw`. Any custom Home Assistant lovelace dashboards will need updating. + - Renamed description of `wwtapactivated` to "turn on/off DHW". Otherwise would have looked like "boiler_dhw_turn_on_off_dhw" in HA. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index facf3ff90..651e51c67 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,3 @@ -Logo - # Contributing **Any contribution helps EMS-ESP get better for the entire community!** @@ -32,8 +30,8 @@ This document describes rules that are in effect for this repository, meant for 6. Issues with feature requests should be discussed for viability/desirability. 7. Feature requests or changes that are meant to address a very specific/limited use case, especially if at the expense of increased code complexity, may be denied, or may be required to be redesigned, generalized, or simplified. 8. Feature requests that are not accompanied by a PR: - - could be closed immediately (denied). - - could be closed after some predetermined period of time (left as candidate for somebody to pick up). + - could be closed immediately (denied). + - could be closed after some predetermined period of time (left as candidate for somebody to pick up). 9. In some cases, feedback may be requested from the issue reporter, either as additional info for clarification, additional testing, or other. If no feedback is provided, the issue may be closed by a contributor or after 40 days by the STALE bot. ## Pull requests @@ -94,7 +92,7 @@ References: - --------------------------------------- +--- ## Contributor License Agreement (CLA) @@ -123,7 +121,7 @@ By making a contribution to this project, I certify that: This Contributor License Agreement (CLA) was adopted on April 1st, 2019. -The text of this license is available under the [Creative Commons Attribution-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/). It is based on the Linux [Developer Certificate Of Origin](http://elinux.org/Developer_Certificate_Of_Origin), but is modified to explicitly use the GPL-3.0 license and not mention sign-off (due to GitHub.com keeps an historial, with your user name, of PRs' commits and all editions on PR's comments). +The text of this license is available under the [Creative Commons Attribution-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/). It is based on the Linux [Developer Certificate Of Origin](http://elinux.org/Developer_Certificate_Of_Origin), but is modified to explicitly use the GPL-3.0 license and not mention sign-off (due to GitHub.com keeps an historial, with your user name, of PRs' commits and all editions on PR's comments). **Why a CLA ?** @@ -133,9 +131,9 @@ A CLA is a legal document in which you state _you are entitled to contribute the CLA is a safety because it also ensures that once you have provided a contribution, you cannot try to withdraw permission for its use at a later date. People can therefore use that software, confident that they will not be asked to stop using pieces of the code at a later date. -A __license__ grants "outbound" rights to the user of project. +A **license** grants "outbound" rights to the user of project. -A __CLA__ enables a contributor to grant "inbound" rights to a project. +A **CLA** enables a contributor to grant "inbound" rights to a project. diff --git a/Makefile b/Makefile index 114d15fa0..826655d97 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ MAKEFLAGS+="j " TARGET := emsesp BUILD := build SOURCES := src src/* lib_standalone lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src src/devices lib/ArduinoJson/src lib/PButton -INCLUDES := src lib_standalone lib/ArduinoJson/src lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/uuid-telnet/src lib/uuid-syslog/src lib/* src/devices +INCLUDES := src lib_standalone lib/ArduinoJson/src lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/uuid-telnet/src lib/uuid-syslog/src lib/* src/devices LIBRARIES := CPPCHECK = cppcheck @@ -33,7 +33,7 @@ CXX_STANDARD := -std=c++11 #---------------------------------------------------------------------- # Defined Symbols #---------------------------------------------------------------------- -DEFINES += -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_DEFAULT_BOARD_PROFILE=\"LOLIN\" +DEFINES += -DFACTORY_WIFI_HOSTNAME=\"ems-esp\" -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_PROGMEM=1 -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0 -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_DEFAULT_BOARD_PROFILE=\"LOLIN\" #---------------------------------------------------------------------- # Sources & Files diff --git a/README.md b/README.md index ae7419747..88bc0d6e1 100644 --- a/README.md +++ b/README.md @@ -33,16 +33,16 @@ Note, EMS-ESP requires a small hardware circuit that can convert the EMS bus dat # **Features** -- A multi-user secure web interface to change settings and monitor the data -- A console, accessible via Serial and Telnet for more monitoring -- Native support for Home Assistant via [MQTT Discovery](https://www.home-assistant.io/docs/mqtt/discovery/) +- A multi-user secure web interface to change settings and monitor incoming data +- A console, accessible via Serial and Telnet for more advanced monitoring +- Native support for Home Assistant and Domoticz via [MQTT Discovery](https://www.home-assistant.io/docs/mqtt/discovery/) - Can run standalone as an independent WiFi Access Point or join an existing WiFi network - Easy first-time configuration via a web Captive Portal - Support for more than [80 EMS devices](https://emsesp.github.io/docs/#/Supported-EMS-Devices) (boilers, thermostats, solar modules, mixer modules, heat pumps, gateways) ## **Demo** -See a live demo [here](https://ems-esp.derbyshire.nl) using fake data. Log in with any username/password. +See a demo [here](https://ems-esp.derbyshire.nl). Log in with any username/password. # **Screenshots** diff --git a/interface/.env b/interface/.env index f1fd70651..351f75643 100644 --- a/interface/.env +++ b/interface/.env @@ -1,3 +1,6 @@ +# This enables lint extensions +EXTEND_ESLINT=true + # This is the name of your project. It appears on the sign-in page and in the menu bar. REACT_APP_PROJECT_NAME=EMS-ESP diff --git a/interface/.env.development b/interface/.env.development deleted file mode 100644 index bcef73edc..000000000 --- a/interface/.env.development +++ /dev/null @@ -1,5 +0,0 @@ -# Change the IP address to that of your ESP device to enable local development of the UI - -# REACT_APP_HTTP_ROOT=http://localhost:3000 -# REACT_APP_WEB_SOCKET_ROOT=ws://localhost:3000 - diff --git a/interface/.eslintignore b/interface/.eslintignore deleted file mode 100644 index 965d55e2c..000000000 --- a/interface/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -# don't ever lint node_modules -node_modules diff --git a/interface/.eslintrc b/interface/.eslintrc deleted file mode 100644 index 3e31639f6..000000000 --- a/interface/.eslintrc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "rules": { - // 0 = ignore, 1 = warning, 2 = error - "no-console": 0, - "prettier/prettier": ["error", { endOfLine: "auto" }], - "explicit-function-return-type": 0, - "@typescript-eslint/explicit-module-boundary-types": 0, - "@typescript-eslint/no-var-requires": 0, - "@typescript-eslint/ban-types": 0, - "@typescript-eslint/no-non-null-asserted-optional-chain": 0, - "@typescript-eslint/no-non-null-assertion": 0, - "@typescript-eslint/no-explicit-any": 0 - } - } - \ No newline at end of file diff --git a/interface/.prettierrc b/interface/.prettierrc index 3fb844c3c..c9804b769 100644 --- a/interface/.prettierrc +++ b/interface/.prettierrc @@ -2,5 +2,5 @@ "singleQuote": true, "semi": true, "trailingComma": "none", - "printWidth": 80 + "printWidth": 120 } diff --git a/interface/config-overrides.js b/interface/config-overrides.js index 96e481183..130d7779b 100644 --- a/interface/config-overrides.js +++ b/interface/config-overrides.js @@ -1,52 +1,30 @@ -const ManifestPlugin = require('webpack-manifest-plugin'); -const WorkboxWebpackPlugin = require('workbox-webpack-plugin'); +const { WebpackManifestPlugin } = require('webpack-manifest-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const CompressionPlugin = require('compression-webpack-plugin'); const ProgmemGenerator = require('./progmem-generator.js'); +const TerserPlugin = require('terser-webpack-plugin'); module.exports = function override(config, env) { const hosted = process.env.REACT_APP_HOSTED; if (env === 'production' && !hosted) { - console.log('Custom webpack...'); - - // rename the output file, we need it's path to be short for LittleFS + // rename the ouput file, we need it's path to be short, for embedded FS config.output.filename = 'js/[id].[chunkhash:4].js'; config.output.chunkFilename = 'js/[id].[chunkhash:4].js'; - // take out the manifest and service worker plugins - config.plugins = config.plugins.filter( - (plugin) => !(plugin instanceof ManifestPlugin) - ); - config.plugins = config.plugins.filter( - (plugin) => !(plugin instanceof WorkboxWebpackPlugin.GenerateSW) - ); + // take out the manifest plugin + config.plugins = config.plugins.filter((plugin) => !(plugin instanceof WebpackManifestPlugin)); // shorten css filenames - const miniCssExtractPlugin = config.plugins.find( - (plugin) => plugin instanceof MiniCssExtractPlugin - ); + const miniCssExtractPlugin = config.plugins.find((plugin) => plugin instanceof MiniCssExtractPlugin); miniCssExtractPlugin.options.filename = 'css/[id].[contenthash:4].css'; - miniCssExtractPlugin.options.chunkFilename = - 'css/[id].[contenthash:4].c.css'; + miniCssExtractPlugin.options.chunkFilename = 'css/[id].[contenthash:4].c.css'; + + // don't emit license file + const terserPlugin = config.optimization.minimizer.find((plugin) => plugin instanceof TerserPlugin); + terserPlugin.options.extractComments = false; // build progmem data files - config.plugins.push( - new ProgmemGenerator({ - outputPath: '../lib/framework/WWWData.h', - bytesPerLine: 20 - }) - ); - - // add compression plugin, compress javascript - config.plugins.push( - new CompressionPlugin({ - filename: '[path].gz[query]', - algorithm: 'gzip', - test: /\.(js)$/, - deleteOriginalAssets: true - }) - ); + config.plugins.push(new ProgmemGenerator({ outputPath: '../lib/framework/WWWData.h', bytesPerLine: 20 })); } return config; }; diff --git a/interface/package-lock.json b/interface/package-lock.json index b664dc104..11fa8a19d 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -1,188 +1,230 @@ { - "name": "emsesp-react", - "version": "0.1.0", + "name": "EMS-ESP", + "version": "3.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "emsesp-react", - "version": "0.1.0", + "name": "EMS-ESP", + "version": "3.4.0", "dependencies": { - "@material-ui/core": "^4.12.3", - "@material-ui/icons": "^4.11.2", - "@msgpack/msgpack": "^2.7.0", - "@types/lodash": "^4.14.172", - "@types/node": "^12.20.20", - "@types/react": "^17.0.19", - "@types/react-dom": "^17.0.9", - "@types/react-material-ui-form-validator": "^2.1.0", - "@types/react-router": "^5.1.13", - "@types/react-router-dom": "^5.1.7", - "compression-webpack-plugin": "^5.0.2", - "env-cmd": "^10.1.0", - "express": "^4.17.1", + "@emotion/react": "^11.7.1", + "@emotion/styled": "^11.6.0", + "@msgpack/msgpack": "^2.7.1", + "@mui/icons-material": "^5.3.0", + "@mui/material": "^5.3.0", + "@types/lodash": "^4.14.178", + "@types/node": "^17.0.10", + "@types/react": "^17.0.38", + "@types/react-dom": "^17.0.11", + "@types/react-router-dom": "^5.3.3", + "async-validator": "^4.0.7", + "axios": "^0.25.0", + "http-proxy-middleware": "^2.0.1", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", - "mime-types": "^2.1.30", - "notistack": "^1.0.6", + "notistack": "^2.0.3", "parse-ms": "^3.0.0", "react": "^17.0.2", + "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^11.3.2", - "react-form-validator-core": "^1.1.1", - "react-material-ui-form-validator": "^2.1.4", - "react-router": "^5.2.0", - "react-router-dom": "^5.2.0", - "react-scripts": "4.0.3", + "react-dropzone": "^11.5.1", + "react-icons": "^4.3.1", + "react-router-dom": "^6.2.1", + "react-scripts": "5.0.0", "sockette": "^2.0.6", - "typescript": "4.3.5", - "zlib": "^1.0.5" + "typescript": "^4.5.5" }, "devDependencies": { - "concurrently": "^6.0.1", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^3.4.0", - "http-proxy-middleware": "^1.1.1", - "nodemon": "^2.0.7", - "npm-run-all": "^4.1.5", - "prettier": "^2.0.5", - "react-app-rewired": "^2.1.8" + "nodemon": "^2.0.15", + "npm-run-all": "^4.1.5" } }, "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==" + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", + "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", + "dependencies": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dependencies": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", "source-map": "^0.5.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dependencies": { - "ms": "2.1.2" + "@babel/types": "^7.16.7" }, "engines": { - "node": ">=6.0" - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dependencies": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "dependencies": { - "@babel/types": "^7.12.13" + "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dependencies": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz", + "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", - "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -192,201 +234,248 @@ "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dependencies": { - "ms": "2.1.2" + "@babel/types": "^7.16.7" }, "engines": { - "node": ">=6.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node": ">=6.9.0" } }, "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "dependencies": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dependencies": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dependencies": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", - "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "bin": { "parser": "bin/babel-parser.js" }, @@ -394,149 +483,283 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", - "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", + "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", - "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz", + "integrity": "sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.12.1" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", "dependencies": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" + "@babel/plugin-transform-parameters": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", - "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { @@ -545,6 +768,9 @@ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-bigint": { @@ -553,6 +779,9 @@ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { @@ -561,14 +790,37 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz", + "integrity": "sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-dynamic-import": { @@ -577,6 +829,9 @@ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { @@ -585,14 +840,23 @@ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", + "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-meta": { @@ -601,6 +865,9 @@ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { @@ -609,14 +876,23 @@ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { @@ -625,6 +901,9 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { @@ -633,6 +912,9 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { @@ -641,6 +923,9 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { @@ -649,6 +934,9 @@ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { @@ -657,6 +945,9 @@ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { @@ -665,428 +956,681 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", - "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", + "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-flow": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", + "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", "dependencies": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", - "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz", + "integrity": "sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", - "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", + "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.13.12" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", + "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.12.17" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", - "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/plugin-transform-react-jsx": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", + "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", "dependencies": { "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", "dependencies": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", - "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz", - "integrity": "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "dependencies": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.13.15", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -1096,156 +1640,171 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.14", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-react": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", - "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", + "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.13.12", - "@babel/plugin-transform-react-jsx-development": "^7.12.17", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", - "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "dependencies": { "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz", - "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", + "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", "dependencies": { - "core-js-pure": "^3.0.0", + "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", - "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.15", - "@babel/types": "^7.13.14", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { @@ -1253,78 +1812,182 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", + "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "dependencies": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } }, "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz", + "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==", + "dependencies": { + "@emotion/memoize": "^0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "node_modules/@emotion/react": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz", + "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.2", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", + "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", + "dependencies": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "node_modules/@emotion/styled": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz", + "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.3.0", + "@emotion/is-prop-valid": "^1.1.1", + "@emotion/serialize": "^1.0.2", + "@emotion/utils": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@emotion/utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", + "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, "node_modules/@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - } + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dependencies": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/eslintrc/node_modules/ignore": { @@ -1335,45 +1998,46 @@ "node": ">= 4" } }, - "node_modules/@eslint/eslintrc/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" - }, - "node_modules/@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, - "node_modules/@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "node_modules/@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "dependencies": { - "@hapi/hoek": "^8.3.0" + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1397,6 +2061,54 @@ "node": ">=6" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -1414,19 +2126,19 @@ } }, "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.6.tgz", + "integrity": "sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA==", "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", + "jest-message-util": "^27.4.6", + "jest-util": "^27.4.2", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/console/node_modules/ansi-styles": { @@ -1438,18 +2150,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/console/node_modules/color-convert": { @@ -1488,41 +2206,49 @@ } }, "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz", + "integrity": "sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg==", "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.6", + "@jest/reporters": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", + "jest-changed-files": "^27.4.2", + "jest-config": "^27.4.7", + "jest-haste-map": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.6", + "jest-resolve-dependencies": "^27.4.6", + "jest-runner": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "jest-watcher": "^27.4.6", + "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/@jest/core/node_modules/ansi-styles": { @@ -1534,18 +2260,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/core/node_modules/color-convert": { @@ -1572,59 +2304,6 @@ "node": ">=8" } }, - "node_modules/@jest/core/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/core/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1637,83 +2316,89 @@ } }, "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz", + "integrity": "sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg==", "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/fake-timers": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-mock": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz", + "integrity": "sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A==", "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^27.4.2", + "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^27.4.6", + "jest-mock": "^27.4.6", + "jest-util": "^27.4.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz", + "integrity": "sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw==", "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^27.4.6", + "@jest/types": "^27.4.2", + "expect": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz", + "integrity": "sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", + "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.4.6", + "jest-resolve": "^27.4.6", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.6", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" + "v8-to-istanbul": "^8.1.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, - "optionalDependencies": { - "node-notifier": "^8.0.0" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/@jest/reporters/node_modules/ansi-styles": { @@ -1725,18 +2410,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/color-convert": { @@ -1763,59 +2454,6 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/reporters/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/reporters/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1836,16 +2474,16 @@ } }, "node_modules/@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", + "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/source-map/node_modules/source-map": { @@ -1857,57 +2495,56 @@ } }, "node_modules/@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz", + "integrity": "sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ==", "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.6", + "@jest/types": "^27.4.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz", + "integrity": "sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw==", "dependencies": { - "@jest/test-result": "^26.6.2", + "@jest/test-result": "^27.4.6", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "jest-haste-map": "^27.4.6", + "jest-runtime": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz", + "integrity": "sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==", "dependencies": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", + "@jest/types": "^27.4.2", + "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", + "jest-haste-map": "^27.4.6", + "jest-regex-util": "^27.4.0", + "jest-util": "^27.4.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform/node_modules/ansi-styles": { @@ -1919,18 +2556,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/transform/node_modules/color-convert": { @@ -1977,18 +2620,18 @@ } }, "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", + "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/types/node_modules/ansi-styles": { @@ -2000,18 +2643,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/types/node_modules/color-convert": { @@ -2049,35 +2698,38 @@ "node": ">=8" } }, - "node_modules/@material-ui/core": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz", - "integrity": "sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw==", + "node_modules/@msgpack/msgpack": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.1.tgz", + "integrity": "sha512-ApwiSL2c9ObewdOE/sqt788P1C5lomBOHyO8nUBCr4ofErBCnYQ003NtJ8lS9OQZc11ximkbmgAZJjB8y6cCdA==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-alpha.65", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.65.tgz", + "integrity": "sha512-6LCTWVoSnEoQuWdxA+Z1qqmlNK4aZj7LvCuLJzq3RVS2PskRuo1O3caVFxAzRu7xrY3zsyL/sUsJI+rdcjhuXw==", "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.4", - "@material-ui/system": "^4.12.1", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.2", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", + "@babel/runtime": "^7.16.7", + "@emotion/is-prop-valid": "^1.1.1", + "@mui/utils": "^5.3.0", + "@popperjs/core": "^2.4.4", + "clsx": "^1.1.1", "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" + "react-is": "^17.0.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui" }, "peerDependencies": { "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "react": "^17.0.0", + "react-dom": "^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2085,78 +2737,94 @@ } } }, - "node_modules/@material-ui/icons": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", - "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "node_modules/@mui/icons-material": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.3.0.tgz", + "integrity": "sha512-1+dN2N8BgozmdMeHXQLrvSr1G/7Xc0NmAMLSvu8XA9RxhcTos/p66vrvpPASw2qvt14dkfeqyHwvbLRgAU9slw==", "dependencies": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.16.7" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@material-ui/styles": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", - "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "node_modules/@mui/material": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.3.0.tgz", + "integrity": "sha512-zLdlweBHrKpOwHFoMXA6FFgKQOONuX4sQhODcj9dk5uPeScuMDE26svcsrPam5Y1PKXZX78YEGHB5Jr5PHGpTA==", "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.2", - "clsx": "^1.0.4", - "csstype": "^2.5.2", + "@babel/runtime": "^7.16.7", + "@mui/base": "5.0.0-alpha.65", + "@mui/system": "^5.3.0", + "@mui/types": "^7.1.0", + "@mui/utils": "^5.3.0", + "@types/react-transition-group": "^4.4.4", + "clsx": "^1.1.1", + "csstype": "^3.0.10", "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" + "prop-types": "^15.7.2", + "react-is": "^17.0.2", + "react-transition-group": "^4.4.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui" }, "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "react": "^17.0.0", + "react-dom": "^17.0.0" }, "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@material-ui/system": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", - "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "node_modules/@mui/private-theming": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.3.0.tgz", + "integrity": "sha512-EBobUEyM9fMnteKrVPp8pTMUh81xXakyfdpkoh7Y19q9JpD2eh7QGAQVJVj0JBFlcUJD60NIE4K8rdokrRmLwg==", "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.2", - "csstype": "^2.5.2", + "@babel/runtime": "^7.16.7", + "@mui/utils": "^5.3.0", "prop-types": "^15.7.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui" }, "peerDependencies": { "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "react": "^17.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2164,10 +2832,79 @@ } } }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "node_modules/@mui/styled-engine": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.3.0.tgz", + "integrity": "sha512-I4YemFy9WnCLUdZ5T+6egpzc8e7Jq/uh9AJ3QInZHbyNu/9I2SWvNn7vHjWOT/D8Y8LMzIOhu5WwZbzjez7YRw==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "@emotion/cache": "^11.7.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.3.0.tgz", + "integrity": "sha512-mblz3EObrhhIMPwSEe2Az7MbMaXOFgrvItPOzZwcY5O9qERB7Rr8KQgbU8VouWLUqyV2i8BaFpLrkKPA6eX2Aw==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "@mui/private-theming": "^5.3.0", + "@mui/styled-engine": "^5.3.0", + "@mui/types": "^7.1.0", + "@mui/utils": "^5.3.0", + "clsx": "^1.1.1", + "csstype": "^3.0.10", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^17.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz", + "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==", "peerDependencies": { "@types/react": "*" }, @@ -2177,33 +2914,34 @@ } } }, - "node_modules/@material-ui/utils": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", - "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "node_modules/@mui/utils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.3.0.tgz", + "integrity": "sha512-O/E9IQKPMg0OrN7+gkn7Ga5o5WA2iXQGdyqNBFPNrYzxOvwzsEtM5K7MtTCGGYKFe8mhTRM0ZOjh5OM0dglw+Q==", "dependencies": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.16.7", + "@types/prop-types": "^15.7.4", + "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" + "react-is": "^17.0.2" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@msgpack/msgpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.0.tgz", - "integrity": "sha512-mlRYq9FSsOd4m+3wZWatemn3hGFZPWNJ4JQOdrir4rrMK2PyIk26idKBoUWrqF3HJJHl+5GpRU+M0wEruJwecg==", - "engines": { - "node": ">= 10" + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0" } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -2211,75 +2949,72 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", - "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz", + "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==", "dependencies": { - "ansi-html": "^0.0.7", + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.8.1", "error-stack-parser": "^2.0.6", - "html-entities": "^1.2.1", - "native-url": "^0.2.6", - "schema-utils": "^2.6.5", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", "source-map": "^0.7.3" }, "engines": { - "node": ">= 10.x" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "node": ">= 10.13" }, - "engines": { - "node": ">= 8.9.0" + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <3.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { @@ -2290,19 +3025,54 @@ "node": ">= 8" } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", - "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "node_modules/@popperjs/core": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", + "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", "dependencies": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.14.2" + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, "node_modules/@rollup/plugin-replace": { @@ -2312,6 +3082,9 @@ "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" } }, "node_modules/@rollup/pluginutils": { @@ -2325,6 +3098,9 @@ }, "engines": { "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { @@ -2332,6 +3108,11 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz", + "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==" + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -2350,20 +3131,22 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", - "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dependencies": { - "ejs": "^2.6.1", - "magic-string": "^0.25.0" + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { @@ -2372,6 +3155,10 @@ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { @@ -2380,6 +3167,10 @@ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { @@ -2388,6 +3179,10 @@ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { @@ -2396,6 +3191,10 @@ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { @@ -2404,6 +3203,10 @@ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { @@ -2412,6 +3215,10 @@ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { @@ -2420,6 +3227,10 @@ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { @@ -2428,6 +3239,10 @@ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/babel-preset": { @@ -2446,6 +3261,10 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/core": { @@ -2457,6 +3276,25 @@ "camelcase": "^6.2.0", "cosmiconfig": "^7.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, "engines": { "node": ">=10" } @@ -2470,6 +3308,10 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/plugin-jsx": { @@ -2484,6 +3326,10 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/plugin-svgo": { @@ -2495,6 +3341,25 @@ "deepmerge": "^4.2.2", "svgo": "^1.2.2" }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, "engines": { "node": ">=10" } @@ -2515,6 +3380,10 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@szmarczak/http-timer": { @@ -2529,15 +3398,26 @@ "node": ">=6" } }, - "node_modules/@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } }, "node_modules/@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", + "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -2547,51 +3427,106 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "dependencies": { "@babel/types": "^7.3.0" } }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "node_modules/@types/eslint": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.9.tgz", - "integrity": "sha512-SdAAXZNvWfhtf3X3y1cbbCZhP3xyPh7mfTvzV6CgfWc/ZhiHpyr9bVroe2/RCHIf7gczaNcprhaBLsx0CCJHQA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "node_modules/@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==" - }, - "node_modules/@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" } }, "node_modules/@types/graceful-fs": { @@ -2603,28 +3538,27 @@ } }, "node_modules/@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "node_modules/@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "node_modules/@types/http-proxy": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.5.tgz", - "integrity": "sha512-GNkDE7bTv6Sf8JbV2GksknKOsk7OznNYHSdrtvPJXO0qJ9odZig6IZKUi5RFGi6d1bf6dgIAe4uXi3DBc7069Q==", - "dev": true, + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", @@ -2635,17 +3569,17 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2653,33 +3587,19 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "node_modules/@types/lodash": { - "version": "4.14.173", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.173.tgz", - "integrity": "sha512-vv0CAYoaEjCw/mLy96GBTnRoZrSxkGE0BKzKimdR8P3OzrNYNvBgtW7p055A+E8C31vXNUhWKoFCbhq7gbyhFg==" + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" }, - "node_modules/@types/material-ui": { - "version": "0.21.8", - "resolved": "https://registry.npmjs.org/@types/material-ui/-/material-ui-0.21.8.tgz", - "integrity": "sha512-Rsx3tRNoYkidDKfMfh+cegtOHMl73akzKnQ5pzxTrbx5oaUXLtG6YVlvtS43uebOSTDf8GQNaseB52r3zVagEg==", - "dependencies": { - "@types/react": "*", - "@types/react-addons-linked-state-mixin": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "12.20.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", - "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", + "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2687,482 +3607,527 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz", + "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==" }, "node_modules/@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" }, "node_modules/@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.22.tgz", - "integrity": "sha512-kq/BMeaAVLJM6Pynh8C2rnr/drCK+/5ksH0ch9asz+8FW3DscYCIEFtCeYTFeIx/ubvOsMXmRfy7qEJ76gM96A==", + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", + "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, - "node_modules/@types/react-addons-linked-state-mixin": { - "version": "0.14.21", - "resolved": "https://registry.npmjs.org/@types/react-addons-linked-state-mixin/-/react-addons-linked-state-mixin-0.14.21.tgz", - "integrity": "sha512-3UF7Szd3JyuU+z90kqu8L4VdDWp7SUC0eRjV2QmMEliaHODGLi5XyO5ctS50K/lG6fjC0dSAPVbvnqv0nPoGMQ==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-dom": { - "version": "17.0.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz", - "integrity": "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==", + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", + "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/react-material-ui-form-validator": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/react-material-ui-form-validator/-/react-material-ui-form-validator-2.1.0.tgz", - "integrity": "sha512-izwjulCvMsN01H8oF8X1IN7QDMHeaGmjYoAxL/cmlUJLtFH0BLLUNmlmZERrjNM+MOJAXUaOkwoCqOHlCtqCzQ==", + "node_modules/@types/react-is": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", + "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", "dependencies": { - "@types/material-ui": "*", "@types/react": "*" } }, "node_modules/@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", + "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*" } }, "node_modules/@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/react/node_modules/csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" - }, "node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "node_modules/@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" }, - "node_modules/@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, - "node_modules/@types/tapable": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", - "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + "node_modules/@types/trusted-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", + "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, - "node_modules/@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "node_modules/@types/ws": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/@types/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@types/webpack": { - "version": "4.41.27", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.27.tgz", - "integrity": "sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA==", - "dependencies": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "source-map": "^0.6.0" - } - }, - "node_modules/@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - } - }, - "node_modules/@types/webpack-sources/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/webpack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz", - "integrity": "sha512-FPUyCPKZbVGexmbCFI3EQHzCZdy2/5f+jv6k2EDljGdXSRc0cKvbndd2nHZkSLqCNOPk0jB6lGzwIkglXcYVsQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", "dependencies": { - "@typescript-eslint/experimental-utils": "4.21.0", - "@typescript-eslint/scope-manager": "4.21.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/type-utils": "5.10.0", + "@typescript-eslint/utils": "5.10.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "ms": "2.1.2" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.0" + "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.21.0.tgz", - "integrity": "sha512-cEbgosW/tUFvKmkg3cU7LBoZhvUs+ZPVM9alb25XvR0dal4qHL3SiUqHNrzoWSxaXA9gsifrYrS1xdDV6w/gIA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz", + "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==", "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.21.0", - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/typescript-estree": "4.21.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/utils": "5.10.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.21.0.tgz", - "integrity": "sha512-eyNf7QmE5O/l1smaQgN0Lj2M/1jOuNg2NrBm1dqqQN0sVngTLyw8tdCbih96ixlhbF1oINoN8fDCyEH9SjLeIA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", + "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", "dependencies": { - "@typescript-eslint/scope-manager": "4.21.0", - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/typescript-estree": "4.21.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "debug": "^4.3.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=6.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/parser/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.21.0.tgz", - "integrity": "sha512-kfOjF0w1Ix7+a5T1knOw00f7uAP9Gx44+OEsNQi0PvvTPLYeXJlsCJ4tYnDj5PQEYfpcgOH5yBlw7K+UEI9Agw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", + "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", "dependencies": { - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/visitor-keys": "4.21.0" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", + "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", + "dependencies": { + "@typescript-eslint/utils": "5.10.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/types": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.21.0.tgz", - "integrity": "sha512-+OQaupjGVVc8iXbt6M1oZMwyKQNehAfLYJJ3SdvnofK2qcjfor9pEM62rVjBknhowTkh+2HF+/KdRAc/wGBN2w==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.21.0.tgz", - "integrity": "sha512-ZD3M7yLaVGVYLw4nkkoGKumb7Rog7QID9YOWobFDMQKNl+vPxqVIW/uDk+MDeGc+OHcoG2nJ2HphwiPNajKw3w==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", "dependencies": { - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/visitor-keys": "4.21.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "ms": "2.1.2" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.0" + "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/@typescript-eslint/utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", + "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.21.0.tgz", - "integrity": "sha512-dH22dROWGi5Z6p+Igc8bLVLmwy7vEe8r+8c+raPQU0LxgogPUrRAtRGtvBWmlr9waTu3n+QLt/qrS/hWzk1x5w==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", "dependencies": { - "@typescript-eslint/types": "4.21.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.10.0", + "eslint-visitor-keys": "^3.0.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, @@ -3200,9 +4165,9 @@ } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "bin": { "acorn": "bin/acorn" }, @@ -3219,10 +4184,53 @@ "acorn-walk": "^7.1.1" } }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, "node_modules/acorn-walk": { "version": "7.2.0", @@ -3241,9 +4249,9 @@ } }, "node_modules/adjust-sourcemap-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", - "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -3252,6 +4260,17 @@ "node": ">=8.9" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3273,17 +4292,55 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } }, "node_modules/alphanum-sort": { "version": "1.0.2", @@ -3291,70 +4348,12 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" + "string-width": "^4.1.0" } }, "node_modules/ansi-escapes": { @@ -3366,20 +4365,15 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "engines": [ "node >= 0.8.0" ], @@ -3388,9 +4382,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -3418,10 +4412,10 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" }, "node_modules/argparse": { "version": "1.0.10", @@ -3443,53 +4437,27 @@ "node": ">=6.0" } }, - "node_modules/arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" + "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-union": { @@ -3500,55 +4468,36 @@ "node": ">=8" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.19.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", - "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "function-bind": "^1.1.1" + "es-abstract": "^1.19.0" }, "engines": { "node": ">= 0.4" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "engines": { - "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/asap": { @@ -3556,81 +4505,11 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -3639,15 +4518,10 @@ "lodash": "^4.17.14" } }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "node_modules/async-validator": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", + "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -3662,17 +4536,6 @@ "node": ">= 4.0.0" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/attr-accept": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", @@ -3682,99 +4545,71 @@ } }, "node_modules/autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" }, "bin": { "autoprefixer": "bin/autoprefixer" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + }, "engines": { - "node": "*" + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "node_modules/axe-core": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.4.tgz", - "integrity": "sha512-Pdgfv6iP0gNx9ejRGa3zE7Xgkj/iclXqLfe7BnatdZz0QnLZ3jrRHUVH8wNSdN68w05Sk3ShGTb3ydktMTooig==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", + "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", "engines": { "node": ">=4" } }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, - "node_modules/babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "dependencies": { - "babylon": "^6.18.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.6.tgz", + "integrity": "sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==", "dependencies": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.4.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, "node_modules/babel-jest/node_modules/ansi-styles": { @@ -3786,18 +4621,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/babel-jest/node_modules/color-convert": { @@ -3836,18 +4677,21 @@ } }, "node_modules/babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", "dependencies": { - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "engines": { - "node": ">= 6.9" + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" } }, "node_modules/babel-loader/node_modules/json5": { @@ -3885,6 +4729,10 @@ }, "engines": { "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/babel-plugin-dynamic-import-node": { @@ -3896,14 +4744,14 @@ } }, "node_modules/babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, "engines": { @@ -3911,9 +4759,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", + "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -3921,7 +4769,7 @@ "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/babel-plugin-macros": { @@ -3934,73 +4782,48 @@ "resolve": "^1.12.0" } }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "peerDependencies": { + "@babel/core": "^7.1.0" + } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", - "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dependencies": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", - "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", + "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.0", - "core-js-compat": "^3.9.1" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.20.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", - "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.0" - } - }, - "node_modules/babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "node_modules/babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dependencies": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-transform-react-remove-prop-types": { @@ -4025,216 +4848,76 @@ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", + "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^27.4.0", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-react-app": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", - "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", "dependencies": { - "@babel/core": "7.12.3", - "@babel/plugin-proposal-class-properties": "7.12.1", - "@babel/plugin-proposal-decorators": "7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", - "@babel/plugin-proposal-numeric-separator": "7.12.1", - "@babel/plugin-proposal-optional-chaining": "7.12.1", - "@babel/plugin-transform-flow-strip-types": "7.12.1", - "@babel/plugin-transform-react-display-name": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/preset-react": "7.12.1", - "@babel/preset-typescript": "7.12.1", - "@babel/runtime": "7.12.1", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "node_modules/babel-preset-react-app/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "node_modules/babel-preset-react-app/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", - "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "dependencies": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/preset-react": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", - "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.12.1", - "@babel/plugin-transform-react-jsx": "^7.12.1", - "@babel/plugin-transform-react-jsx-development": "^7.12.1", - "@babel/plugin-transform-react-jsx-self": "^7.12.1", - "@babel/plugin-transform-react-jsx-source": "^7.12.1", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" - } - }, - "node_modules/babel-preset-react-app/node_modules/@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/babel-preset-react-app/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "hasInstallScript": true - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "bin": { - "babylon": "bin/babylon.js" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/balanced-match": { @@ -4242,87 +4925,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/bfj": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", @@ -4353,45 +4960,63 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" - }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" }, "engines": { "node": ">= 0.8" } }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -4405,33 +5030,31 @@ "multicast-dns-service-types": "^1.1.0" } }, - "node_modules/bonjour/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "dependencies": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boxen/node_modules/ansi-styles": { @@ -4444,28 +5067,25 @@ }, "engines": { "node": ">=8" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/boxen/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/boxen/node_modules/color-convert": { @@ -4507,6 +5127,18 @@ "node": ">=8" } }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4527,98 +5159,21 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dependencies": { - "pako": "~1.0.5" - } - }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" @@ -4639,114 +5194,35 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "node_modules/buffer/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/builtin-modules": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "engines": { "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "15.0.6", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz", - "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==", - "dependencies": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -4775,6 +5251,9 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cacheable-request/node_modules/lowercase-keys": { @@ -4802,36 +5281,9 @@ "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dependencies": { - "callsites": "^2.0.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { @@ -4852,11 +5304,22 @@ } }, "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" } }, "node_modules/caniuse-api": { @@ -4871,38 +5334,22 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001235", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz", - "integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==", + "version": "1.0.30001301", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", + "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" } }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", "engines": { "node": ">=4" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -4916,6 +5363,14 @@ "node": ">=4" } }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -4930,31 +5385,29 @@ "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" + "fsevents": "~2.3.2" } }, "node_modules/chrome-trace-event": { @@ -4966,58 +5419,24 @@ } }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" }, "node_modules/cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "node_modules/clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", + "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", "dependencies": { "source-map": "~0.6.0" }, "engines": { - "node": ">= 4.0" + "node": ">= 10.0" } }, "node_modules/clean-css/node_modules/source-map": { @@ -5043,16 +5462,19 @@ "dev": true, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "node_modules/clone-response": { @@ -5099,27 +5521,6 @@ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -5133,19 +5534,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "node_modules/colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" }, "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -5159,17 +5556,22 @@ } }, "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "engines": { - "node": ">= 6" + "node": ">= 12" } }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, "node_modules/common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "engines": { "node": ">=4.0.0" } @@ -5179,19 +5581,6 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "node_modules/compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dependencies": { - "arity-n": "^1.0.4" - } - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5220,333 +5609,24 @@ "node": ">= 0.8.0" } }, - "node_modules/compression-webpack-plugin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-5.0.2.tgz", - "integrity": "sha512-F2G4cQfsMZ6CiPlG22Q5EDUCqnfyZqTjyJP5cMgNYUbBg/dUzV3hto8yTFFIogDCTWooVbePHQE0qL6FrJUSsA==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "schema-utils": "^2.7.0", - "serialize-javascript": "^4.0.0", - "webpack-sources": "^1.4.3" - }, - "engines": { - "node": ">= 10.13.0" + "ms": "2.0.0" } }, - "node_modules/compression-webpack-plugin/node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/compression-webpack-plugin/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/compression-webpack-plugin/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/compression-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - } - }, - "node_modules/compression-webpack-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/compression-webpack-plugin/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/concurrently": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.0.1.tgz", - "integrity": "sha512-YCF/Wf31a910hXu7eGN9/SyHKD/usw3Shw4IPYuqIsxxC39v92engYlIlOs/zXnBJtX/6aVuhgzfhZeGJkhU4w==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.20", - "read-pkg": "^5.2.0", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "bin": { - "concurrently": "bin/concurrently.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/concurrently/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/concurrently/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/concurrently/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concurrently/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/concurrently/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/concurrently/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/concurrently/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/concurrently/node_modules/yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -5564,52 +5644,10 @@ "node": ">=8" } }, - "node_modules/configstore/node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/configstore/node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" }, "node_modules/connect-history-api-fallback": { "version": "1.6.0", @@ -5619,39 +5657,35 @@ "node": ">=0.8" } }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "node_modules/contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/content-type": { "version": "1.0.4", @@ -5662,22 +5696,17 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dependencies": { "safe-buffer": "~5.1.1" } }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { "node": ">= 0.6" } @@ -5687,51 +5716,27 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-concurrently/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/core-js": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz", - "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==", - "hasInstallScript": true + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, "node_modules/core-js-compat": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.1.tgz", - "integrity": "sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", + "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", "dependencies": { - "browserslist": "^4.16.3", + "browserslist": "^4.19.1", "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat/node_modules/semver": { @@ -5743,83 +5748,40 @@ } }, "node_modules/core-js-pure": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.10.1.tgz", - "integrity": "sha512-PeyJH2SE0KuxY5eCGNWA+W+CeDpB6M1PN3S7Am7jSv/Ttuxz2SnWbIiVQOn/TDaGaGtxo8CRWHkXwJscbUHtVw==", - "hasInstallScript": true + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.3.tgz", + "integrity": "sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dependencies": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", + "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.10.0" + "yaml": "^1.7.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-react-context": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", - "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", - "dependencies": { - "gud": "^1.0.0", - "warning": "^4.0.3" + "node": ">=8" } }, "node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -5835,181 +5797,227 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, "bin": { "semver": "bin/semver" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, "node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "engines": { - "node": ">=4" - } - }, - "node_modules/css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "node": ">=8" } }, "node_modules/css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.2.tgz", + "integrity": "sha512-hOb1LFjRR+8ocA071xUSmg5VslJ8NGo/I2qpUpdeAYyBVCgupS5O8SEVo4SxEMYyFBNodBkzG3T1iqW9HCXxew==", "dependencies": { - "postcss": "^7.0.5" + "postcss-selector-parser": "^6.0.8" }, "bin": { - "css-blank-pseudo": "cli.js" + "css-blank-pseudo": "dist/cli.cjs" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "engines": { - "node": "*" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" } }, "node_modules/css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", + "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", "dependencies": { - "postcss": "^7.0.1", "timsort": "^0.3.0" }, "engines": { - "node": ">4" + "node": ">= 10" + }, + "peerDependencies": { + "postcss": "^8.0.9" } }, "node_modules/css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.3.tgz", + "integrity": "sha512-0gDYWEKaGacwxCqvQ3Ypg6wGdD1AztbMm5h1JsactG2hP2eiflj808QITmuWBpE7sjSEVrAlZhPTVd/nNMj/hQ==", "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" + "postcss-selector-parser": "^6.0.8" }, "bin": { - "css-has-pseudo": "cli.js" + "css-has-pseudo": "dist/cli.cjs" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "bin": { - "cssesc": "bin/cssesc" + "node": "^12 || ^14 || >=16" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" + "peerDependencies": { + "postcss": "^8.3" } }, "node_modules/css-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dependencies": { - "camelcase": "^6.0.0", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^2.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.1", - "semver": "^7.3.2" + "semver": "^7.3.5" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/css-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 8.9.0" + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dependencies": { - "postcss": "^7.0.5" - }, + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", + "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", "bin": { - "css-prefers-color-scheme": "cli.js" + "css-prefers-color-scheme": "dist/cli.cjs" }, "engines": { - "node": ">=6.0.0" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" } }, "node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-select-base-adapter": { @@ -6037,35 +6045,21 @@ "node": ">=0.10.0" } }, - "node_modules/css-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, "node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "engines": { "node": ">= 6" - } - }, - "node_modules/css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==" }, "node_modules/cssesc": { "version": "3.0.0", @@ -6079,138 +6073,76 @@ } }, "node_modules/cssnano": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.15.tgz", + "integrity": "sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ==", "dependencies": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.8", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" + "cssnano-preset-default": "^5.1.10", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" }, "engines": { - "node": ">=6.9.0" + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, "node_modules/cssnano-preset-default": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.10.tgz", + "integrity": "sha512-BcpSzUVygHMOnp9uG5rfPzTOCb0GAHQkqtUQx8j1oMNF9A1Q8hziOOhiM4bdICpmrBIU85BE64RD5XGYsVQZNA==", "dependencies": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.3", - "postcss-unique-selectors": "^4.0.1" + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^3.0.0", + "postcss-calc": "^8.2.0", + "postcss-colormin": "^5.2.3", + "postcss-convert-values": "^5.0.2", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.2", + "postcss-merge-longhand": "^5.0.4", + "postcss-merge-rules": "^5.0.4", + "postcss-minify-font-values": "^5.0.2", + "postcss-minify-gradients": "^5.0.4", + "postcss-minify-params": "^5.0.3", + "postcss-minify-selectors": "^5.1.1", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.2", + "postcss-normalize-positions": "^5.0.2", + "postcss-normalize-repeat-style": "^5.0.2", + "postcss-normalize-string": "^5.0.2", + "postcss-normalize-timing-functions": "^5.0.2", + "postcss-normalize-unicode": "^5.0.2", + "postcss-normalize-url": "^5.0.4", + "postcss-normalize-whitespace": "^5.0.2", + "postcss-ordered-values": "^5.0.3", + "postcss-reduce-initial": "^5.0.2", + "postcss-reduce-transforms": "^5.0.2", + "postcss-svgo": "^5.0.3", + "postcss-unique-selectors": "^5.0.2" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dependencies": { - "postcss": "^7.0.0" + "node": "^10 || ^12 || >=14.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano/node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano/node_modules/resolve-from": { + "node_modules/cssnano-utils": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.0.tgz", + "integrity": "sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA==", "engines": { - "node": ">=4" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, "node_modules/csso": { @@ -6271,39 +6203,14 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "2.6.16", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.16.tgz", - "integrity": "sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q==" - }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "node_modules/damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "node_modules/data-urls": { "version": "2.0.0", @@ -6318,43 +6225,26 @@ "node": ">=10" } }, - "node_modules/date-fns": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.20.1.tgz", - "integrity": "sha512-8P5M8Kxbnovd0zfvOs7ipkiVJ3/zZQ0F/nrBW4x5E+I0uAZVZ80h6CKd24fSXQ5TLK5hXMtI4yb2O5rEZdUt2A==", - "dev": true, - "engines": { - "node": ">=0.11" - } - }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "ms": "2.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "engines": { - "node": ">=0.10" - } + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, "node_modules/decompress-response": { "version": "3.3.0", @@ -6384,6 +6274,9 @@ "object-is": "^1.0.1", "object-keys": "^1.1.1", "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/deep-extend": { @@ -6396,9 +6289,9 @@ } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge": { "version": "4.2.2", @@ -6409,15 +6302,14 @@ } }, "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">= 10" } }, "node_modules/defer-to-connect": { @@ -6426,6 +6318,14 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -6437,121 +6337,30 @@ "node": ">= 0.4" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { + "node_modules/defined": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dependencies": { - "array-uniq": "^1.0.1" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/delayed-stream": { @@ -6570,15 +6379,6 @@ "node": ">= 0.6" } }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -6593,9 +6393,9 @@ } }, "node_modules/detect-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", - "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-port-alt": { "version": "1.1.6", @@ -6613,28 +6413,47 @@ "node": ">= 4.2.1" } }, - "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "ms": "2.0.0" } }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff-sequences": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", + "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } }, "node_modules/dir-glob": { "version": "3.0.1", @@ -6647,6 +6466,11 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -6689,46 +6513,37 @@ } }, "node_modules/dom-helpers": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", - "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, - "node_modules/dom-helpers/node_modules/csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" - }, "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dependencies": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "engines": { - "node": ">=0.4", - "npm": ">=1.2" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, "node_modules/domexception": { "version": "2.0.1", @@ -6750,20 +6565,30 @@ } }, "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "dependencies": { - "domelementtype": "1" + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dot-case": { @@ -6779,6 +6604,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, "dependencies": { "is-obj": "^2.0.0" }, @@ -6787,11 +6613,11 @@ } }, "node_modules/dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/dotenv-expand": { @@ -6810,113 +6636,45 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexify/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "hasInstallScript": true, + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, "engines": { "node": ">=0.10.0" } }, "node_modules/electron-to-chromium": { - "version": "1.3.749", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.749.tgz", - "integrity": "sha512-F+v2zxZgw/fMwPz/VUGIggG4ZndDsYy0vlpthi3tjmDZlcfbhN5mYW0evXUsBr2sUtuDANFtle410A9u/sd/4A==" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/elliptic/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "1.4.51", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz", + "integrity": "sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ==" }, "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -6938,161 +6696,29 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enhanced-resolve/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/enhanced-resolve/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/enhanced-resolve/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/enhanced-resolve/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" + "node": ">=10.13.0" } }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "node_modules/env-cmd": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", - "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", - "dependencies": { - "commander": "^4.0.0", - "cross-spawn": "^7.0.0" - }, - "bin": { - "env-cmd": "bin/env-cmd.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/env-cmd/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/env-cmd/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/env-cmd/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/env-cmd/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/env-cmd/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/error-ex": { @@ -7112,31 +6738,43 @@ } }, "node_modules/es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "unbox-primitive": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -7148,35 +6786,9 @@ }, "engines": { "node": ">= 0.4" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/escalade": { @@ -7202,11 +6814,14 @@ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -7230,14 +6845,6 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -7295,45 +6902,43 @@ } }, "node_modules/eslint": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", - "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", + "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -7341,53 +6946,76 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-react-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", + "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", "dependencies": { - "confusing-browser-globals": "^1.0.10" + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dependencies": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", "dependencies": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" + "debug": "^3.2.7", + "find-up": "^2.1.0" }, "engines": { "node": ">=4" } }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-module-utils/node_modules/find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -7449,155 +7077,157 @@ "node": ">=4" } }, - "node_modules/eslint-module-utils/node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-flowtype": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.6.0.tgz", - "integrity": "sha512-XbeDejiL+SecDInj9On/9D4EM31kUp6B3uWYsBH6Vsb2CfaFWiUHvosAZx1TafVjp6izLC7D3kpix1DIpDF4Qw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", "dependencies": { - "lodash": "^4.17.15", + "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" } }, "node_modules/eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", "dependencies": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" }, "engines": { "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dependencies": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/eslint-plugin-jest": { - "version": "24.3.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.4.tgz", - "integrity": "sha512-3n5oY1+fictanuFkTWPwSlehugBTAgwLnYLFsCllzE3Pl1BwywHl5fL0HFxmMjoQY8xhUDk8uAWc3S4JOHGh3A==", + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", "dependencies": { - "@typescript-eslint/experimental-utils": "^4.0.1" + "@typescript-eslint/experimental-utils": "^5.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", - "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "aria-query": "^4.2.2", - "array-includes": "^3.1.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.0.2", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", - "has": "^1.0.3", - "jsx-ast-utils": "^3.1.0", - "language-tags": "^1.0.5" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "eslint-config-prettier": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { "optional": true } } }, - "node_modules/eslint-plugin-react": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz", - "integrity": "sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw==", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", + "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flatmap": "^1.2.4", - "doctrine": "^2.1.0", + "@babel/runtime": "^7.16.3", + "aria-query": "^4.2.2", + "array-includes": "^3.1.4", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.3.5", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", "has": "^1.0.3", + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", + "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.0.4", - "object.entries": "^1.1.3", - "object.fromentries": "^2.0.4", - "object.values": "^1.1.3", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.4" + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" }, "engines": { "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", + "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", "engines": { "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { @@ -7618,156 +7248,92 @@ "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/eslint-plugin-testing-library": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", - "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.4.tgz", + "integrity": "sha512-zA/NfAENCsJXujvwwiap5gsqLp2U6X7m2XA5nOksl4zzb6GpUmRNAleCll58rEP0brFVj7DZBprlIlMGIhoC7Q==", "dependencies": { - "@typescript-eslint/experimental-utils": "^3.10.1" + "@typescript-eslint/experimental-utils": "^5.9.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0", + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", "npm": ">=6" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/experimental-utils": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "dependencies": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-testing-library/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "engines": { "node": ">=10" } }, - "node_modules/eslint-webpack-plugin": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.3.tgz", - "integrity": "sha512-LewNevZf9ghDCxCGT6QltNWVi8KIYWc4LKcin8K9Azh1hypG7YAmobUDIU67fAPa+eMjRnU4rjEkLbYI1w5/UA==", - "dependencies": { - "@types/eslint": "^7.2.6", - "arrify": "^2.0.1", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "schema-utils": "^3.0.0" - }, + "node_modules/eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "engines": { - "node": ">= 10.13.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "node_modules/eslint-webpack-plugin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz", + "integrity": "sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==", "dependencies": { - "@babel/highlight": "^7.10.4" + "@types/eslint": "^7.28.2", + "jest-worker": "^27.3.1", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" } }, "node_modules/eslint/node_modules/ansi-styles": { @@ -7779,18 +7345,29 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/eslint/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/eslint/node_modules/color-convert": { @@ -7822,26 +7399,29 @@ "node": ">= 8" } }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dependencies": { - "ms": "2.1.2" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=6.0" + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/has-flag": { @@ -7852,19 +7432,17 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "engines": { - "node": ">= 4" + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/eslint/node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -7909,6 +7487,9 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/which": { @@ -7926,24 +7507,16 @@ } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dependencies": { - "acorn": "^7.4.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "eslint-visitor-keys": "^3.1.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/esprima": { @@ -7969,14 +7542,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7988,18 +7553,10 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { "node": ">=4.0" } @@ -8038,46 +7595,80 @@ "node": ">=0.8.x" } }, - "node_modules/eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dependencies": { - "original": "^1.0.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" - }, "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/exit": { @@ -8088,99 +7679,31 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz", + "integrity": "sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag==", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" + "@jest/types": "^27.4.2", + "jest-get-type": "^27.4.0", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/expect/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/expect/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", "dependencies": { "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -8194,13 +7717,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -8210,133 +7733,41 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "node_modules/express/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ] }, "node_modules/fast-deep-equal": { @@ -8344,26 +7775,19 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -8377,17 +7801,17 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -8403,11 +7827,6 @@ "bser": "2.1.1" } }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -8420,15 +7839,22 @@ } }, "node_modules/file-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "engines": { "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/file-selector": { @@ -8442,16 +7868,18 @@ "node": ">= 10" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true + "node_modules/filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dependencies": { + "minimatch": "^3.0.4" + } }, "node_modules/filesize": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", "engines": { "node": ">= 0.4.0" } @@ -8484,29 +7912,53 @@ "node": ">= 0.8" } }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" + "ms": "2.0.0" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -8522,301 +7974,113 @@ } }, "node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" - }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/flush-write-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/flush-write-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/flush-write-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/flush-write-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" }, "node_modules/follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { "node": ">=4.0" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", + "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", "dependencies": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" }, "engines": { - "node": ">=6.11.5", + "node": ">=10", "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "is-extendable": "^0.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/from2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fs-extra": { + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", @@ -8830,60 +8094,123 @@ "node": ">=10" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dependencies": { - "minipass": "^3.0.0" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" }, "engines": { - "node": ">= 8" + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/fs-write-stream-atomic/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/fs-write-stream-atomic/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } }, - "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dependencies": { - "safe-buffer": "~5.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8936,6 +8263,9 @@ "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-own-enumerable-property-symbols": { @@ -8952,36 +8282,35 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dependencies": { - "pump": "^3.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8992,6 +8321,9 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { @@ -9005,23 +8337,34 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "node_modules/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dev": true, "dependencies": { - "ini": "1.3.7" + "ini": "2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/global-dirs/node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/global-modules": { "version": "2.0.0", @@ -9056,19 +8399,22 @@ } }, "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/got": { @@ -9093,63 +8439,46 @@ "node": ">=8.6" } }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "optional": true - }, - "node_modules/gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, - "node_modules/gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "node_modules/got/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "dependencies": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "pump": "^3.0.0" }, "engines": { "node": ">=6" } }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "node_modules/has": { "version": "1.0.3", @@ -9165,7 +8494,10 @@ "node_modules/has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/has-flag": { "version": "3.0.0", @@ -9181,64 +8513,23 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { + "node_modules/has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-yarn": { @@ -9250,33 +8541,6 @@ "node": ">=8" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -9285,32 +8549,12 @@ "he": "bin/he" } }, - "node_modules/hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.2.0.tgz", + "integrity": "sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig==", "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@babel/runtime": "^7.7.6" } }, "node_modules/hoist-non-react-statics": { @@ -9337,7 +8581,8 @@ "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", @@ -9350,11 +8595,6 @@ "wbuf": "^1.1.0" } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -9369,11 +8609,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -9382,16 +8617,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "node_modules/hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -9404,9 +8629,9 @@ } }, "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" }, "node_modules/html-escaper": { "version": "2.0.2", @@ -9414,95 +8639,65 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", "he": "^1.2.0", - "param-case": "^3.0.3", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^4.6.3" + "terser": "^5.10.0" }, "bin": { "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=6" + "node": ">=12" } }, "node_modules/html-webpack-plugin": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", - "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" }, "engines": { - "node": ">=6.9" - } - }, - "node_modules/html-webpack-plugin/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" + "node": ">=10.13.0" }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "peerDependencies": { + "webpack": "^5.20.0" } }, "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, "node_modules/http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -9515,24 +8710,24 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, "node_modules/http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==" }, "node_modules/http-proxy": { "version": "1.18.1", @@ -9547,11 +8742,23 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-proxy-middleware": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.1.1.tgz", - "integrity": "sha512-FIDg9zPvOwMhQ3XKB2+vdxK6WWbVAH7s5QpqQCif7a1TNL76GNAATWA1sy6q2gSfss8UJ/Nwza3N6QnFkKclpA==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", "dependencies": { "@types/http-proxy": "^1.17.5", "http-proxy": "^1.18.1", @@ -9560,72 +8767,56 @@ "micromatch": "^4.0.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" } }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">= 6" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "engines": { - "node": ">=8.12.0" + "node": ">=10.17.0" } }, - "node_modules/hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dependencies": { - "postcss": "^7.0.14" - }, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, + "node_modules/idb": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", + "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" + }, "node_modules/identity-obj-proxy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", @@ -9637,20 +8828,10 @@ "node": ">=4" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "engines": { "node": ">= 4" } @@ -9662,19 +8843,12 @@ "dev": true }, "node_modules/immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" - }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dependencies": { - "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", + "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" } }, "node_modules/import-fresh": { @@ -9687,25 +8861,9 @@ }, "engines": { "node": ">=6" - } - }, - "node_modules/import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dependencies": { - "resolve-from": "^3.0.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-lazy": { @@ -9718,9 +8876,9 @@ } }, "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -9730,17 +8888,9 @@ }, "engines": { "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { @@ -9751,14 +8901,6 @@ "node": ">=0.8.19" } }, - "node_modules/indefinite-observable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-2.0.1.tgz", - "integrity": "sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ==", - "dependencies": { - "symbol-observable": "1.2.0" - } - }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -9767,16 +8909,6 @@ "node": ">=8" } }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -9787,27 +8919,15 @@ } }, "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -9826,61 +8946,27 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "engines": { - "node": ">=4" - } - }, "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { @@ -9889,9 +8975,15 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "node_modules/is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -9905,33 +8997,36 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, "dependencies": { "ci-info": "^2.0.0" }, @@ -9939,84 +9034,35 @@ "is-ci": "bin.js" } }, - "node_modules/is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dependencies": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true }, "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dependencies": { "has": "^1.0.3" - } - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-docker": { @@ -10028,14 +9074,9 @@ }, "engines": { "node": ">=8" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extglob": { @@ -10063,9 +9104,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -10073,31 +9114,20 @@ "node": ">=0.10.0" } }, - "node_modules/is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" - }, "node_modules/is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/is-installed-globally/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-module": { @@ -10106,20 +9136,26 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { @@ -10131,17 +9167,24 @@ } }, "node_modules/is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, "engines": { "node": ">=8" } @@ -10154,45 +9197,23 @@ "node": ">=6" } }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dependencies": { - "path-is-inside": "^1.0.2" - }, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-potential-custom-element-name": { @@ -10201,15 +9222,18 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "node_modules/is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dependencies": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-regexp": { @@ -10220,11 +9244,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, "node_modules/is-root": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", @@ -10233,31 +9252,51 @@ "node": ">=6" } }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dependencies": { - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typedarray": { @@ -10265,12 +9304,15 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "node_modules/is-windows": { + "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-wsl": { @@ -10291,58 +9333,38 @@ "dev": true }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", "dependencies": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -10364,25 +9386,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10395,34 +9398,18 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10432,9 +9419,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -10443,167 +9430,92 @@ "node": ">=8" } }, - "node_modules/jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", - "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", "dependencies": { - "@jest/core": "^26.6.0", + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "node_modules/jest": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.7.tgz", + "integrity": "sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg==", + "dependencies": { + "@jest/core": "^27.4.7", "import-local": "^3.0.2", - "jest-cli": "^26.6.0" + "jest-cli": "^27.4.7" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", + "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" + "@jest/types": "^27.4.2", + "execa": "^5.0.0", + "throat": "^6.0.1" }, "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-circus": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", - "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.6.tgz", + "integrity": "sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ==", "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", - "@types/babel__traverse": "^7.0.4", + "@jest/environment": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^26.6.0", + "expect": "^27.4.6", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-runner": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "pretty-format": "^26.6.0", - "stack-utils": "^2.0.2", - "throat": "^5.0.0" + "jest-each": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-circus/node_modules/ansi-styles": { @@ -10615,18 +9527,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-circus/node_modules/color-convert": { @@ -10664,32 +9582,141 @@ "node": ">=8" } }, - "node_modules/jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "node_modules/jest-cli": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.7.tgz", + "integrity": "sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw==", "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@jest/core": "^27.4.7", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.4.7", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.7.tgz", + "integrity": "sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw==", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.4.6", + "@jest/types": "^27.4.2", + "babel-jest": "^27.4.6", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" + "jest-circus": "^27.4.6", + "jest-environment-jsdom": "^27.4.6", + "jest-environment-node": "^27.4.6", + "jest-get-type": "^27.4.0", + "jest-jasmine2": "^27.4.6", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.6", + "jest-runner": "^27.4.6", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.6", + "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } } }, "node_modules/jest-config/node_modules/ansi-styles": { @@ -10701,18 +9728,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-config/node_modules/color-convert": { @@ -10739,59 +9772,6 @@ "node": ">=8" } }, - "node_modules/jest-config/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-config/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10804,17 +9784,17 @@ } }, "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz", + "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "diff-sequences": "^27.4.0", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-diff/node_modules/ansi-styles": { @@ -10826,18 +9806,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-diff/node_modules/color-convert": { @@ -10876,29 +9862,29 @@ } }, "node_modules/jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", + "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.6.tgz", + "integrity": "sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA==", "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.4.0", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-each/node_modules/ansi-styles": { @@ -10910,18 +9896,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-each/node_modules/color-convert": { @@ -10960,98 +9952,96 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz", + "integrity": "sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA==", "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "jest-mock": "^27.4.6", + "jest-util": "^27.4.2", + "jsdom": "^16.6.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.6.tgz", + "integrity": "sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ==", "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^27.4.6", + "jest-util": "^27.4.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", + "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.6.tgz", + "integrity": "sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ==", "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", + "jest-regex-util": "^27.4.0", + "jest-serializer": "^27.4.0", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.6", + "micromatch": "^4.0.4", "walker": "^1.0.7" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "optionalDependencies": { - "fsevents": "^2.1.2" + "fsevents": "^2.3.2" } }, "node_modules/jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz", + "integrity": "sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw==", "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.4.6", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.6.2", + "expect": "^27.4.6", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" + "jest-each": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.6", + "throat": "^6.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-jasmine2/node_modules/ansi-styles": { @@ -11063,18 +10053,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-jasmine2/node_modules/color-convert": { @@ -11113,29 +10109,29 @@ } }, "node_modules/jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz", + "integrity": "sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA==", "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz", + "integrity": "sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-diff": "^27.4.6", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { @@ -11147,18 +10143,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/color-convert": { @@ -11197,22 +10199,22 @@ } }, "node_modules/jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz", + "integrity": "sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.4.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.6", "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-message-util/node_modules/ansi-styles": { @@ -11224,18 +10226,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-message-util/node_modules/color-convert": { @@ -11274,15 +10282,15 @@ } }, "node_modules/jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.6.tgz", + "integrity": "sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw==", "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/node": "*" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-pnp-resolver": { @@ -11291,45 +10299,55 @@ "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "engines": { "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", + "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", - "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.6.tgz", + "integrity": "sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw==", "dependencies": { - "@jest/types": "^26.6.0", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.6", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.0", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz", + "integrity": "sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw==", "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "@jest/types": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-snapshot": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve/node_modules/ansi-styles": { @@ -11341,18 +10359,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-resolve/node_modules/color-convert": { @@ -11379,41 +10403,6 @@ "node": ">=8" } }, - "node_modules/jest-resolve/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11426,33 +10415,35 @@ } }, "node_modules/jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.6.tgz", + "integrity": "sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg==", "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.6", + "@jest/environment": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.7.1", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", + "jest-docblock": "^27.4.0", + "jest-environment-jsdom": "^27.4.6", + "jest-environment-node": "^27.4.6", + "jest-haste-map": "^27.4.6", + "jest-leak-detector": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-resolve": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.6", "source-map-support": "^0.5.6", - "throat": "^5.0.0" + "throat": "^6.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner/node_modules/ansi-styles": { @@ -11464,18 +10455,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runner/node_modules/color-convert": { @@ -11502,59 +10499,6 @@ "node": ">=8" } }, - "node_modules/jest-runner/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runner/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11567,43 +10511,35 @@ } }, "node_modules/jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.6.tgz", + "integrity": "sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ==", "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", + "@jest/globals": "^27.4.6", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", + "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-haste-map": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-mock": "^27.4.6", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" + "strip-bom": "^4.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runtime/node_modules/ansi-styles": { @@ -11615,18 +10551,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runtime/node_modules/color-convert": { @@ -11653,67 +10595,6 @@ "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11726,41 +10607,47 @@ } }, "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", + "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.4" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.6.tgz", + "integrity": "sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ==", "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^26.6.2", + "expect": "^27.4.6", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", + "jest-diff": "^27.4.6", + "jest-get-type": "^27.4.0", + "jest-haste-map": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-util": "^27.4.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", + "pretty-format": "^27.4.6", "semver": "^7.3.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-snapshot/node_modules/ansi-styles": { @@ -11772,18 +10659,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/color-convert": { @@ -11810,57 +10703,18 @@ "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/jest-snapshot/node_modules/supports-color": { @@ -11875,19 +10729,19 @@ } }, "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", + "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "picomatch": "^2.2.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-util/node_modules/ansi-styles": { @@ -11899,18 +10753,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-util/node_modules/color-convert": { @@ -11949,19 +10809,19 @@ } }, "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.6.tgz", + "integrity": "sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ==", "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", + "@jest/types": "^27.4.2", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^27.4.0", "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "pretty-format": "^27.4.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-validate/node_modules/ansi-styles": { @@ -11973,18 +10833,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-validate/node_modules/color-convert": { @@ -12023,20 +10889,34 @@ } }, "node_modules/jest-watch-typeahead": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", - "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz", + "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==", "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", - "jest-regex-util": "^26.0.0", - "jest-watcher": "^26.3.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0" + "jest-regex-util": "^27.0.0", + "jest-watcher": "^27.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { @@ -12048,18 +10928,32 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/char-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.0.tgz", + "integrity": "sha512-oGu2QekBMXgyQNWPDRQ001bjvDnZe4/zBTz37TMbiKz1NbNiyiH5hRkobe7npRN6GfbGbxMYFck/vQ1r9c1VMA==", + "engines": { + "node": ">=12.20" } }, "node_modules/jest-watch-typeahead/node_modules/color-convert": { @@ -12086,6 +10980,46 @@ "node": ">=8" } }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/jest-watch-typeahead/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12098,20 +11032,20 @@ } }, "node_modules/jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.6.tgz", + "integrity": "sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw==", "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.2", + "jest-util": "^27.4.2", "string-length": "^4.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-watcher/node_modules/ansi-styles": { @@ -12123,18 +11057,24 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-watcher/node_modules/color-convert": { @@ -12173,13 +11113,13 @@ } }, "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "engines": { "node": ">= 10.13.0" @@ -12194,98 +11134,17 @@ } }, "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" - } - }, - "node_modules/jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest/node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-tokens": { @@ -12305,18 +11164,13 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "node_modules/jsdom": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.2.tgz", - "integrity": "sha512-JxNtPt9C1ut85boCbJmffaQ06NBnzkQY/MWO3YxPW8IWS38A26z+B1oBvA9LwKrytewdfymnhi4UNH3/RAgZrg==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dependencies": { "abab": "^2.0.5", - "acorn": "^8.1.0", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", @@ -12324,12 +11178,13 @@ "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", "parse5": "6.0.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", @@ -12339,22 +11194,19 @@ "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", - "ws": "^7.4.4", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "engines": { "node": ">=10" - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", - "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==", - "bin": { - "acorn": "bin/acorn" }, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, "node_modules/jsesc": { @@ -12385,9 +11237,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -12399,16 +11251,6 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -12428,118 +11270,26 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/jss": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.6.0.tgz", - "integrity": "sha512-n7SHdCozmxnzYGXBHe0NsO0eUf9TvsHVq2MXvi4JmTn3x5raynodDVE/9VQmBdWFyyj9HpHZ2B4xNZ7MMy7lkw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "indefinite-observable": "^2.0.1", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/jss-plugin-camel-case": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.6.0.tgz", - "integrity": "sha512-JdLpA3aI/npwj3nDMKk308pvnhoSzkW3PXlbgHAzfx0yHWnPPVUjPhXFtLJzgKZge8lsfkUxvYSQ3X2OYIFU6A==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.6.0" + "node_modules/jsonpointer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jss-plugin-default-unit": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.6.0.tgz", - "integrity": "sha512-7y4cAScMHAxvslBK2JRK37ES9UT0YfTIXWgzUWD5euvR+JR3q+o8sQKzBw7GmkQRfZijrRJKNTiSt1PBsLI9/w==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0" - } - }, - "node_modules/jss-plugin-global": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.6.0.tgz", - "integrity": "sha512-I3w7ji/UXPi3VuWrTCbHG9rVCgB4yoBQLehGDTmsnDfXQb3r1l3WIdcO8JFp9m0YMmyy2CU7UOV6oPI7/Tmu+w==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0" - } - }, - "node_modules/jss-plugin-nested": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.6.0.tgz", - "integrity": "sha512-fOFQWgd98H89E6aJSNkEh2fAXquC9aZcAVjSw4q4RoQ9gU++emg18encR4AT4OOIFl4lQwt5nEyBBRn9V1Rk8g==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-props-sort": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.6.0.tgz", - "integrity": "sha512-oMCe7hgho2FllNc60d9VAfdtMrZPo9n1Iu6RNa+3p9n0Bkvnv/XX5San8fTPujrTBScPqv9mOE0nWVvIaohNuw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0" - } - }, - "node_modules/jss-plugin-rule-value-function": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.6.0.tgz", - "integrity": "sha512-TKFqhRTDHN1QrPTMYRlIQUOC2FFQb271+AbnetURKlGvRl/eWLswcgHQajwuxI464uZk91sPiTtdGi7r7XaWfA==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.6.0.tgz", - "integrity": "sha512-doJ7MouBXT1lypLLctCwb4nJ6lDYqrTfVS3LtXgox42Xz0gXusXIIDboeh6UwnSmox90QpVnub7au8ybrb0krQ==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.6.0" - } - }, - "node_modules/jss/node_modules/csstype": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" - }, "node_modules/jsx-ast-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", - "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", "dependencies": { - "array-includes": "^3.1.2", + "array-includes": "^3.1.3", "object.assign": "^4.1.2" }, "engines": { @@ -12560,11 +11310,6 @@ "json-buffer": "3.0.0" } }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -12582,9 +11327,9 @@ } }, "node_modules/klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "engines": { "node": ">= 8" } @@ -12602,15 +11347,6 @@ "language-subtag-registry": "~0.3.2" } }, - "node_modules/last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dependencies": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, "node_modules/latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -12643,19 +11379,28 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "engines": { + "node": ">=10" + } + }, "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "engines": { @@ -12663,36 +11408,39 @@ } }, "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, "dependencies": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=6.11.5" } }, "node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -12703,14 +11451,17 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -12718,66 +11469,31 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, - "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -12826,60 +11542,25 @@ } }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dependencies": { - "tmpl": "1.0.x" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "tmpl": "1.0.5" } }, "node_modules/mdn-data": { @@ -12895,45 +11576,15 @@ "node": ">= 0.6" } }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "node_modules/memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/memory-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/memory-fs/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" } }, "node_modules/memorystream": { @@ -12971,11 +11622,6 @@ "node": ">= 0.6" } }, - "node_modules/microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" - }, "node_modules/micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -12988,23 +11634,6 @@ "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -13017,19 +11646,19 @@ } }, "node_modules/mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dependencies": { - "mime-db": "1.47.0" + "mime-db": "1.51.0" }, "engines": { "node": ">= 0.6" @@ -13052,64 +11681,71 @@ "node": ">=4" } }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - } - }, "node_modules/mini-css-extract-plugin": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", - "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz", + "integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==", "dependencies": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dependencies": { - "minimist": "^1.2.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "bin": { - "json5": "lib/cli.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">=4.0.0" + "peerDependencies": { + "ajv": "^8.8.2" } }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">= 4" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/minimalistic-assert": { @@ -13117,11 +11753,6 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -13138,105 +11769,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -13248,34 +11780,10 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/move-concurrently/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "6.2.3", @@ -13294,16 +11802,10 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true - }, "node_modules/nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13311,35 +11813,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/native-url": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", - "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", - "dependencies": { - "querystring": "^0.2.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -13358,15 +11831,11 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, "node_modules/no-case": { "version": "3.0.4", @@ -13378,11 +11847,11 @@ } }, "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", "engines": { - "node": ">= 6.0.0" + "node": ">= 6.13.0" } }, "node_modules/node-int64": { @@ -13390,138 +11859,38 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "node_modules/node-libs-browser/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/node-libs-browser/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "node_modules/nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "dev": true, "hasInstallScript": true, "dependencies": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "bin": { "nodemon": "bin/nodemon.js" }, "engines": { "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" } }, "node_modules/nodemon/node_modules/debug": { @@ -13533,12 +11902,6 @@ "ms": "^2.1.1" } }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/nodemon/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -13558,12 +11921,16 @@ }, "bin": { "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" } }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -13575,6 +11942,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -13596,23 +11964,20 @@ } }, "node_modules/normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dependencies": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - }, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/notistack": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-1.0.6.tgz", - "integrity": "sha512-/p7W9b3r3/LDXUpUjNgZqnYj+NYG3/4htZcyucOFftrDKEpveEMPFdPlvmoT9+N1L4GgcKEY9Vr9+Dxyk2FQcQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz", + "integrity": "sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==", "dependencies": { "clsx": "^1.1.0", "hoist-non-react-statics": "^3.3.0" @@ -13622,9 +11987,19 @@ "url": "https://opencollective.com/notistack" }, "peerDependencies": { - "@material-ui/core": "^4.0.0", + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "@mui/material": "^5.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } } }, "node_modules/npm-run-all": { @@ -13652,106 +12027,41 @@ "node": ">= 4" } }, - "node_modules/npm-run-all/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dependencies": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" } }, "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dependencies": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -13760,45 +12070,21 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/object-is": { "version": "1.1.5", @@ -13810,6 +12096,9 @@ }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { @@ -13820,17 +12109,6 @@ "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -13843,72 +12121,82 @@ }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "node_modules/object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", "dependencies": { - "isobject": "^3.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/obuf": { @@ -13952,46 +12240,25 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dependencies": { - "is-wsl": "^1.1.0" + "node": ">=12" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/optimize-css-assets-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", - "dependencies": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { @@ -14010,19 +12277,6 @@ "node": ">= 0.8.0" } }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dependencies": { - "url-parse": "^1.4.3" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -14032,42 +12286,32 @@ "node": ">=6" } }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -14079,17 +12323,21 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dependencies": { - "retry": "^0.12.0" + "@types/retry": "^0.12.0", + "retry": "^0.13.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/p-try": { @@ -14115,62 +12363,6 @@ "node": ">=8" } }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/parallel-transform/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/parallel-transform/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/parallel-transform/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/parallel-transform/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -14191,18 +12383,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -14215,6 +12395,9 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse-ms": { @@ -14223,6 +12406,9 @@ "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse5": { @@ -14247,24 +12433,6 @@ "tslib": "^2.0.3" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -14281,15 +12449,11 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, "engines": { "node": ">=4" } @@ -14312,32 +12476,25 @@ "node": ">=8" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pidtree": { @@ -14353,94 +12510,79 @@ } }, "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/pkg-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/pkg-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/pkg-up": { @@ -14477,6 +12619,20 @@ "node": ">=6" } }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -14496,22 +12652,6 @@ "node": ">=4" } }, - "node_modules/pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", - "dependencies": { - "ts-pnp": "^1.1.6" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" - }, "node_modules/portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -14533,1102 +12673,14 @@ "ms": "^2.1.1" } }, - "node_modules/portfinder/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - } - }, - "node_modules/postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "dependencies": { - "postcss": "^7" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dependencies": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dependencies": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dependencies": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-colormin/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dependencies": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-selectors/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dependencies": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", - "dependencies": { - "postcss": "^7.0.26" - } - }, - "node_modules/postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "dependencies": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-load-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dependencies": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/postcss-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-loader/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dependencies": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dependencies": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dependencies": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", - "dependencies": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dependencies": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "node_modules/postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "dependencies": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dependencies": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dependencies": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dependencies": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dependencies": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-safe-parser": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", - "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", - "dependencies": { - "postcss": "^8.1.0" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/postcss-safe-parser/node_modules/postcss": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", - "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", - "dependencies": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15638,32 +12690,929 @@ "url": "https://opencollective.com/postcss/" } }, - "node_modules/postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", "dependencies": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" + "postcss-selector-parser": "^6.0.2" + }, + "peerDependencies": { + "postcss": "^8.0.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz", + "integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==", + "dependencies": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.1.tgz", + "integrity": "sha512-62OBIXCjRXpQZcFOYIXwXBlpAVWrYk8ek1rcjvMING4Q2cf0ipyN9qT+BhHA6HmftGSEnFQu2qgKO3gMscl3Rw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.2.tgz", + "integrity": "sha512-gyx8RgqSmGVK156NAdKcsfkY3KPGHhKqvHTL3hhveFrBBToguKFzhyiuk3cljH6L4fJ0Kv+JENuPXs1Wij27Zw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-colormin": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.3.tgz", + "integrity": "sha512-dra4xoAjub2wha6RUXAgadHEn2lGxbj8drhFcIGLOMn914Eu7DkPUurugDXgstwttCYkJtZ/+PkWRWdp3UHRIA==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", + "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.3.tgz", + "integrity": "sha512-rtu3otIeY532PnEuuBrIIe+N+pcdbX/7JMZfrcL09wc78YayrHw5E8UkDfvnlOhEUrI4ptCuzXQfj+Or6spbGA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.2" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.3.tgz", + "integrity": "sha512-qiPm+CNAlgXiMf0J5IbBBEXA9l/Q5HGsNGkL3znIwT2ZFRLGY9U2fTUpa4lqCUXQOxaLimpacHeQC80BD2qbDw==", + "dependencies": { + "postcss-selector-parser": "^6.0.8" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.2.tgz", + "integrity": "sha512-+56BLP6NSSUuWUXjRgAQuho1p5xs/hU5Sw7+xt9S3JSg+7R6+WMGnJW7Hre/6tTuZ2xiXMB42ObkiZJ2hy/Pew==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.4.tgz", + "integrity": "sha512-qz+s5vhKJlsHw8HjSs+HVk2QGFdRyC68KGRQGX3i+GcnUjhWhXQEmCXW6siOJkZ1giu0ddPwSO6I6JdVVVPoog==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.4.tgz", + "integrity": "sha512-0ltahRTPtXSIlEZFv7zIvdEib7HN0ZbUQxrxIKn8KbiRyhALo854I/CggU5lyZe6ZBvSTJ6Al2vkZecI2OhneQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.3.tgz", + "integrity": "sha512-ozOsg+L1U8S+rxSHnJJiET6dNLyADcPHhEarhhtCI9DBLGOPG/2i4ddVoFch9LzrBgb8uDaaRI4nuid2OM82ZA==", + "dependencies": { + "postcss-selector-parser": "^6.0.8" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.3.tgz", + "integrity": "sha512-fk9y2uFS6/Kpp7/A9Hz9Z4rlFQ8+tzgBcQCXAFSrXFGAbKx+4ZZOmmfHuYjCOMegPWoz0pnC6fNzi8j7Xyqp5Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.8" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", + "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.4.tgz", + "integrity": "sha512-BlEo9gSTj66lXjRNByvkMK9dEdEGFXRfGjKRi9fo8s0/P3oEk74cAoonl/utiM50E2OPVb/XSu+lWvdW4KtE/Q==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.3.tgz", + "integrity": "sha512-MH4tymWmefdZQ7uVG/4icfLjAQmH6o2NRYyVh2mKoB4RXJp9PjsyhZwhH4ouaCQHvg+qJVj3RzeAR1EQpIlXZA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", + "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", + "dependencies": { + "lilconfig": "^2.0.4", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", + "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz", + "integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==", + "dependencies": { + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.4.tgz", + "integrity": "sha512-yOj7bW3NxlQxaERBB0lEY1sH5y+RzevjbdH4DBJurjKERNpknRByFNdNe+V72i5pIZL12woM9uGdS5xbSB+kDQ==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.0.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.2.tgz", + "integrity": "sha512-R6MJZryq28Cw0AmnyhXrM7naqJZZLoa1paBltIzh2wM7yb4D45TLur+eubTQ4jCmZU9SGeZdWsc5KcSoqTMeTg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.4.tgz", + "integrity": "sha512-RVwZA7NC4R4J76u8X0Q0j+J7ItKUWAeBUJ8oEEZWmtv3Xoh19uNJaJwzNpsydQjk6PkuhRrK+YwwMf+c+68EYg==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.3.tgz", + "integrity": "sha512-NY92FUikE+wralaiVexFd5gwb7oJTIDhgTNeIw89i1Ymsgt4RWiPXfz3bg7hDy4NL6gepcThJwOYNtZO/eNi7Q==", + "dependencies": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.6", + "cssnano-utils": "^3.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.1.tgz", + "integrity": "sha512-TOzqOPXt91O2luJInaVPiivh90a2SIK5Nf1Ea7yEIM/5w+XA5BGrZGUSW8aEx9pJ/oNj7ZJBhjvigSiBV+bC1Q==", + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", + "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.8" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz", + "integrity": "sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.2.tgz", + "integrity": "sha512-tqghWFVDp2btqFg1gYob1etPNxXLNh3uVeWgZE2AQGh6b2F8AK2Gj36v5Vhyh+APwIzNjmt6jwZ9pTBP+/OM8g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.2.tgz", + "integrity": "sha512-/rIZn8X9bBzC7KvY4iKUhXUGW3MmbXwfPF23jC9wT9xTi7kAvgj8sEgwxjixBmoL6MVa4WOgxNz2hAR6wTK8tw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.2.tgz", + "integrity": "sha512-zaI1yzwL+a/FkIzUWMQoH25YwCYxi917J4pYm1nRXtdgiCdnlTkx5eRzqWEC64HtRa06WCJ9TIutpb6GmW4gFw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz", + "integrity": "sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.2.tgz", + "integrity": "sha512-3y/V+vjZ19HNcTizeqwrbZSUsE69ZMRHfiiyLAJb7C7hJtYmM4Gsbajy7gKagu97E8q5rlS9k8FhojA8cpGhWw==", + "dependencies": { + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz", + "integrity": "sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.2.tgz", + "integrity": "sha512-CXBx+9fVlzSgbk0IXA/dcZn9lXixnQRndnsPC5ht3HxlQ1bVh77KQDL1GffJx1LTzzfae8ftMulsjYmO2yegxA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.3.tgz", + "integrity": "sha512-T9pDS+P9bWeFvqivXd5ACzQmrCmHjv3ZP+djn8E1UZY7iK79pFSm7i3WbKw2VSmFmdbMm8sQ12OPcNpzBo3Z2w==", + "dependencies": { + "cssnano-utils": "^3.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", + "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.3.tgz", + "integrity": "sha512-tDQ3m+GYoOar+KoQgj+pwPAvGHAp/Sby6vrFiyrELrMKQJ4AejL0NcS0mm296OKKYA2SRg9ism/hlT/OLhBrdQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", + "dependencies": { + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.2.tgz", + "integrity": "sha512-CG35J1COUH7OOBgpw5O+0koOLUd5N4vUGKUqSAuIe4GiuLHWU96Pqp+UPC8QITTd12zYAFx76pV7qWT/0Aj/TA==", + "dependencies": { + "postcss-selector-parser": "^6.0.8" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz", + "integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.2.tgz", + "integrity": "sha512-25HeDeFsgiPSUx69jJXZn8I06tMxLQJJNF5h7i9gsUg8iP4KOOJ8EX8fj3seeoLt3SLU2YDD6UPnDYVGUO7DEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "peerDependencies": { + "postcss": "^8.0.3" } }, "node_modules/postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", "dependencies": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" + "balanced-match": "^1.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", "dependencies": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" }, "engines": { @@ -15671,55 +13620,46 @@ } }, "node_modules/postcss-svgo": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", + "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" + "postcss-value-parser": "^4.1.0", + "svgo": "^2.7.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/postcss-svgo/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } }, - "node_modules/postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dependencies": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.0.0" } }, - "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, - "node_modules/postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=6.14.4" - } - }, - "node_modules/postcss/node_modules/source-map": { + "node_modules/postcss-svgo/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", @@ -15727,17 +13667,46 @@ "node": ">=0.10.0" } }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dependencies": { - "has-flag": "^3.0.0" + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" }, "engines": { - "node": ">=6" + "node": ">=10.13.0" } }, + "node_modules/postcss-unique-selectors": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz", + "integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==", + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -15747,35 +13716,12 @@ } }, "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, "node_modules/pretty-bytes": { @@ -15784,64 +13730,42 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dependencies": { "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "renderkid": "^3.0.0" } }, "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", + "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "engines": { - "node": ">= 10" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "engines": { - "node": ">= 0.6.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/process-nextick-args": { @@ -15849,14 +13773,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -15865,20 +13781,10 @@ "asap": "~2.0.6" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "node_modules/promise-polyfill": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz", - "integrity": "sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA==" - }, "node_modules/prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -15888,13 +13794,13 @@ } }, "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "node_modules/prop-types/node_modules/react-is": { @@ -15903,21 +13809,24 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { "node": ">= 0.10" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } }, "node_modules/psl": { "version": "1.8.0", @@ -15930,47 +13839,11 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -16006,50 +13879,45 @@ } }, "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "engines": { "node": ">=0.6" - } - }, - "node_modules/query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dependencies": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/raf": { "version": "3.4.1", @@ -16067,15 +13935,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -16085,12 +13944,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -16098,6 +13957,25 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -16135,101 +14013,122 @@ } }, "node_modules/react-app-polyfill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", - "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", "dependencies": { - "core-js": "^3.6.5", + "core-js": "^3.19.2", "object-assign": "^4.1.1", "promise": "^8.1.0", "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "whatwg-fetch": "^3.4.1" + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" }, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/react-app-rewired": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.8.tgz", - "integrity": "sha512-wjXPdKPLscA7mn0I1de1NHrbfWdXz4S1ladaGgHVKdn1hTgKK5N6EdGIJM0KrS6bKnJBj7WuqJroDTsPKKr66Q==", - "dev": true, + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.11.tgz", + "integrity": "sha512-zRIqJUPsCoPnfYtea3xgPbKR42vx0NoH5oo8R8FELXqzkjJHa39V6zD8CAdkLJoYL8V3JScWHAfKMZOzi1Ydmw==", "dependencies": { "semver": "^5.6.0" }, "bin": { "react-app-rewired": "bin/index.js" + }, + "peerDependencies": { + "react-scripts": ">=2.1.3" } }, "node_modules/react-app-rewired/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/react-dev-utils": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", + "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", "dependencies": { - "@babel/code-frame": "7.10.4", - "address": "1.1.2", - "browserslist": "4.14.2", - "chalk": "2.4.2", - "cross-spawn": "7.0.3", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.1.0", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "4.1.6", - "global-modules": "2.0.0", - "globby": "11.0.1", - "gzip-size": "5.1.1", - "immer": "8.0.1", - "is-root": "2.1.0", - "loader-utils": "2.0.0", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "prompts": "2.4.0", - "react-error-overlay": "^6.0.9", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.10", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" - } - }, - "node_modules/react-dev-utils/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/react-dev-utils/node_modules/browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", - "dependencies": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", - "node-releases": "^1.1.61" }, - "bin": { - "browserslist": "cli.js" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=7.0.0" } }, + "node_modules/react-dev-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/react-dev-utils/node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -16243,28 +14142,20 @@ "node": ">= 8" } }, - "node_modules/react-dev-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/react-dev-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, - "node_modules/react-dev-utils/node_modules/globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", "engines": { - "node": ">=10" + "node": ">= 12.13.0" } }, "node_modules/react-dev-utils/node_modules/path-key": { @@ -16294,6 +14185,17 @@ "node": ">=8" } }, + "node_modules/react-dev-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/react-dev-utils/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -16316,12 +14218,15 @@ "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" } }, "node_modules/react-dropzone": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.3.2.tgz", - "integrity": "sha512-Z0l/YHcrNK1r85o6RT77Z5XgTARmlZZGfEKBl3tqTXL9fZNQDuIdRx/J0QjvR60X+yYu26dnHeaG2pWU+1HHvw==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.5.1.tgz", + "integrity": "sha512-eNhttdq4ZDe3eKbXAe54Opt+sbtqmNK5NWTHf/l5d+1TdZqShJ8gMjBrya00qx5zkI//TYxRhu1d9pemTgaWwg==", "dependencies": { "attr-accept": "^2.2.1", "file-selector": "^0.2.2", @@ -16329,22 +14234,22 @@ }, "engines": { "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 16.8" } }, "node_modules/react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", + "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" }, - "node_modules/react-form-validator-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/react-form-validator-core/-/react-form-validator-core-1.1.1.tgz", - "integrity": "sha512-5SG9pKrRptrhrt/dZg0bL28VvyGeuXftfhx6qwJLNdUqs2GgEnrV07BBtGpWyoBKXmO+fplD+O70DbI03CMqUQ==", - "dependencies": { - "create-react-context": "^0.3.0", - "promise-polyfill": "8.1.0", - "prop-types": "^15.0.0", - "react-lifecycles-compat": "^3.0.2" + "node_modules/react-icons": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz", + "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==", + "peerDependencies": { + "react": "*" } }, "node_modules/react-is": { @@ -16352,262 +14257,165 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-material-ui-form-validator": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/react-material-ui-form-validator/-/react-material-ui-form-validator-2.1.4.tgz", - "integrity": "sha512-XoZQxhtSRoHjQgIxSV8cF7q+Ep5Uwt0OtDDJELAq9/E2NSXH6Hbw/yAiw8eaDmCEaeQpKT+HbIavCtJ51GJIvw==", - "dependencies": { - "prop-types": "^15.0.0", - "react-form-validator-core": "1.1.1" - } - }, "node_modules/react-refresh": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", - "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.1.tgz", + "integrity": "sha512-2fG0udBtxou9lXtK97eJeET2ki5//UWfQSl1rlJ7quwe6jrktK9FCCc8dQb5QY6jAv3jua8bBQRhhDOM/kVRsg==", "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "history": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.1.tgz", + "integrity": "sha512-I6Zax+/TH/cZMDpj3/4Fl2eaNdcvoxxHoH1tYOREsQ22OKDYofGebrNm6CTPUcvLvZm63NL/vzCYdjf9CUhqmA==", "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "history": "^5.2.0", + "react-router": "6.2.1" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/react-scripts": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", - "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", + "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", "dependencies": { - "@babel/core": "7.12.3", - "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", - "@svgr/webpack": "5.5.0", - "@typescript-eslint/eslint-plugin": "^4.5.0", - "@typescript-eslint/parser": "^4.5.0", - "babel-eslint": "^10.1.0", - "babel-jest": "^26.6.0", - "babel-loader": "8.1.0", - "babel-plugin-named-asset-import": "^0.3.7", - "babel-preset-react-app": "^10.0.0", + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", "bfj": "^7.0.2", - "camelcase": "^6.1.0", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "4.3.0", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^7.11.0", - "eslint-config-react-app": "^6.0.0", - "eslint-plugin-flowtype": "^5.2.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jest": "^24.1.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.21.5", - "eslint-plugin-react-hooks": "^4.2.0", - "eslint-plugin-testing-library": "^3.9.2", - "eslint-webpack-plugin": "^2.5.2", - "file-loader": "6.1.1", - "fs-extra": "^9.0.1", - "html-webpack-plugin": "4.5.0", - "identity-obj-proxy": "3.0.0", - "jest": "26.6.0", - "jest-circus": "26.6.0", - "jest-resolve": "26.6.0", - "jest-watch-typeahead": "0.6.1", - "mini-css-extract-plugin": "0.11.3", - "optimize-css-assets-webpack-plugin": "5.0.4", - "pnp-webpack-plugin": "1.6.4", - "postcss-flexbugs-fixes": "4.2.1", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "5.0.2", - "prompts": "2.4.0", - "react-app-polyfill": "^2.0.0", - "react-dev-utils": "^11.0.3", - "react-refresh": "^0.8.3", - "resolve": "1.18.1", - "resolve-url-loader": "^3.1.2", - "sass-loader": "^10.0.5", - "semver": "7.3.2", - "style-loader": "1.3.0", - "terser-webpack-plugin": "4.2.3", - "ts-pnp": "1.2.0", - "url-loader": "4.1.1", - "webpack": "4.44.2", - "webpack-dev-server": "3.11.1", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "5.1.4" + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.0", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.0", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" }, "bin": { "react-scripts": "bin/react-scripts.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=14.0.0" }, "optionalDependencies": { - "fsevents": "^2.1.3" + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, "engines": { "node": ">=4" } }, "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "dependencies": { - "pify": "^2.0.0" + "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -16622,9 +14430,9 @@ } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -16649,20 +14457,20 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", "dependencies": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { "version": "0.14.5", @@ -16672,54 +14480,48 @@ "@babel/runtime": "^7.8.4" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "dependencies": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" @@ -16755,9 +14557,9 @@ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "node_modules/regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "dependencies": { "jsesc": "~0.5.0" }, @@ -16781,150 +14583,16 @@ "node": ">= 0.10" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, "node_modules/renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dependencies": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/request-promise-native/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" } }, "node_modules/require-directory": { @@ -16943,23 +14611,25 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "node_modules/resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dependencies": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { @@ -16989,74 +14659,52 @@ "node": ">=4" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, "node_modules/resolve-url-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", - "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", "dependencies": { - "adjust-sourcemap-loader": "3.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.36", - "rework": "1.0.1", - "rework-visit": "1.0.0", + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", "source-map": "0.6.1" }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, "engines": { "node": ">=6.0.0" - } - }, - "node_modules/resolve-url-loader/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/resolve-url-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve-url-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, "node_modules/resolve-url-loader/node_modules/source-map": { @@ -17067,6 +14715,14 @@ "node": ">=0.10.0" } }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -17076,18 +14732,10 @@ "lowercase-keys": "^1.0.0" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "engines": { "node": ">= 4" } @@ -17101,35 +14749,6 @@ "node": ">=0.10.0" } }, - "node_modules/rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dependencies": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - } - }, - "node_modules/rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" - }, - "node_modules/rework/node_modules/convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" - }, - "node_modules/rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "node_modules/rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -17139,61 +14758,58 @@ }, "bin": { "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", - "dependencies": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - }, + "version": "2.66.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", + "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", "bin": { "rollup": "dist/bin/rollup" - } - }, - "node_modules/rollup-plugin-babel": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.8.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-terser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", - "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dependencies": { - "@babel/code-frame": "^7.5.5", - "jest-worker": "^24.9.0", - "rollup-pluginutils": "^2.8.2", + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", "serialize-javascript": "^4.0.0", - "terser": "^4.6.2" + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dependencies": { + "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "supports-color": "^7.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 10.13.0" } }, "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { @@ -17205,262 +14821,84 @@ } }, "node_modules/rollup-plugin-terser/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "engines": { - "node": "6.* || >= 7.*" + "node": ">=8" } }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { "queue-microtask": "^1.2.2" } }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dependencies": { - "aproba": "^1.1.1" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dependencies": { - "ret": "~0.1.10" - } + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, "node_modules/sass-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", - "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", "dependencies": { "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "neo-async": "^2.6.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } } }, "node_modules/sax": { @@ -17489,16 +14927,20 @@ } }, "node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, "engines": { "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/select-hose": { @@ -17507,24 +14949,24 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "node_modules/selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", + "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", "dependencies": { - "node-forge": "^0.10.0" - } - }, - "node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "bin": { - "semver": "bin/semver.js" + "node-forge": "^1.2.0" }, "engines": { "node": ">=10" } }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", @@ -17537,19 +14979,10 @@ "node": ">=8" } }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", @@ -17558,9 +14991,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -17569,15 +15002,28 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dependencies": { "randombytes": "^2.1.0" } @@ -17599,6 +15045,14 @@ "node": ">= 0.8.0" } }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -17613,81 +15067,45 @@ "node": ">= 0.6" } }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "dependencies": { "shebang-regex": "^1.0.0" }, @@ -17699,20 +15117,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "optional": true + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" }, "node_modules/side-channel": { "version": "1.0.4", @@ -17722,25 +15135,15 @@ "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -17755,232 +15158,21 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sockette": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/sockette/-/sockette-2.0.6.tgz", "integrity": "sha512-W6iG8RGV6Zife3Cj+FhuyHV447E6fqFM2hKmnaQrTvg3OydINV3Msj3WPFbX76blUlUxvQSMMMdrJxce8NqI5Q==" }, "node_modules/sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, - "node_modules/sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", - "dependencies": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" - } - }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/sockjs-client/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/sockjs-client/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/sockjs/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -17995,29 +15187,37 @@ } }, "node_modules/source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "node_modules/source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -18034,23 +15234,19 @@ "node_modules/source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -18059,21 +15255,24 @@ "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true }, "node_modules/spdy": { "version": "4.0.2", @@ -18103,93 +15302,20 @@ "wbuf": "^1.7.3" } }, - "node_modules/spdy-transport/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/spdy-transport/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/spdy/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/spdy/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -18210,29 +15336,6 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -18241,121 +15344,6 @@ "node": ">= 0.6" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-browserify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-browserify/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/stream-browserify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-http/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-http/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/stream-http/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -18364,6 +15352,25 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -18382,44 +15389,56 @@ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/string.prototype.matchall": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", - "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", + "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has-symbols": "^1.0.1", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.3.1", "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.padend": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", - "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", + "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { @@ -18429,6 +15448,9 @@ "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { @@ -18438,6 +15460,9 @@ "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/stringify-object": { @@ -18462,42 +15487,30 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "dependencies": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - }, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, "node_modules/strip-final-newline": { @@ -18514,58 +15527,45 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - }, + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "engines": { - "node": ">= 8.9.0" - } - }, - "node_modules/style-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "node": ">= 12.13.0" }, - "engines": { - "node": ">= 8.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, "node_modules/stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", "dependencies": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">=6.9.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/stylehacks/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" }, "node_modules/supports-color": { "version": "5.5.0", @@ -18609,6 +15609,17 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -18618,6 +15629,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -18640,12 +15652,57 @@ "node": ">=4.0.0" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "engines": { - "node": ">=0.10.0" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" } }, "node_modules/symbol-tree": { @@ -18653,114 +15710,178 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, - "node_modules/table": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", - "integrity": "sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ==", + "node_modules/tailwindcss": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.15.tgz", + "integrity": "sha512-bT2iy7FtjwgsXik4ZoJnHXR+SRCiGR1W95fVqpLZebr64m4ahwUwRbIAc5w5+2fzr1YF4Ct2eI7dojMRRl8sVQ==", "dependencies": { - "ajv": "^8.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "arg": "^5.0.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color-name": "^1.1.4", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.8", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.21.0" }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.5.tgz", - "integrity": "sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { - "mkdirp": "bin/cmd.js" + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tailwindcss/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tailwindcss/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tailwindcss/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/tailwindcss/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { "node": ">=10" } }, - "node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/tempy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "node_modules/tailwindcss/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "temp-dir": "^1.0.0", - "type-fest": "^0.3.1", - "unique-string": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "engines": { "node": ">=6" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "engines": { "node": ">=8" } }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -18771,100 +15892,66 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dependencies": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "peerDependencies": { + "acorn": "^8.5.0" + }, + "peerDependenciesMeta": { + "acorn": { + "optional": true + } } }, "node_modules/terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" + "terser": "^5.7.2" }, "engines": { "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" + "peerDependencies": { + "webpack": "^5.1.0" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, "node_modules/terser-webpack-plugin/node_modules/source-map": { @@ -18875,41 +15962,17 @@ "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz", - "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/test-exclude": { @@ -18931,91 +15994,24 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, - "node_modules/tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/to-fast-properties": { "version": "2.0.0", @@ -19025,28 +16021,6 @@ "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -19056,20 +16030,6 @@ "node": ">=6" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -19082,9 +16042,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -19123,9 +16083,9 @@ } }, "node_modules/tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dependencies": { "punycode": "^2.1.1" }, @@ -19133,32 +16093,15 @@ "node": ">=8" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, - "node_modules/ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "engines": { - "node": ">=6" - } - }, "node_modules/tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", @@ -19177,10 +16120,18 @@ "json5": "lib/cli.js" } }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -19191,6 +16142,9 @@ }, "engines": { "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/tsutils/node_modules/tslib": { @@ -19198,32 +16152,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -19244,11 +16172,14 @@ } }, "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { @@ -19263,11 +16194,6 @@ "node": ">= 0.6" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -19277,9 +16203,9 @@ } }, "node_modules/typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19297,102 +16223,62 @@ "has-bigints": "^1.0.1", "has-symbols": "^1.0.2", "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "dependencies": { - "debug": "^2.2.0" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "engines": { "node": ">=4" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "node_modules/uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, "node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dependencies": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/universalify": { @@ -19416,55 +16302,6 @@ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -19475,27 +16312,31 @@ } }, "node_modules/update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dev": true, "dependencies": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, "node_modules/update-notifier/node_modules/ansi-styles": { @@ -19508,19 +16349,25 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/update-notifier/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/update-notifier/node_modules/color-convert": { @@ -19550,6 +16397,21 @@ "node": ">=8" } }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/update-notifier/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -19570,42 +16432,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -19618,44 +16444,6 @@ "node": ">=4" } }, - "node_modules/url-parse-lax/node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "node_modules/url/node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dependencies": { - "inherits": "2.0.3" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -19670,6 +16458,9 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/utila": { @@ -19689,7 +16480,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, "bin": { "uuid": "dist/bin/uuid" } @@ -19700,16 +16490,16 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "node_modules/v8-to-istanbul": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz", - "integrity": "sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" }, "engines": { - "node": ">=10.10.0" + "node": ">=10.12.0" } }, "node_modules/v8-to-istanbul/node_modules/source-map": { @@ -19724,16 +16514,12 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -19742,29 +16528,6 @@ "node": ">= 0.8" } }, - "node_modules/vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -19785,32 +16548,23 @@ } }, "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dependencies": { - "makeerror": "1.0.x" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" + "makeerror": "1.0.12" } }, "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dependencies": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, - "optionalDependencies": { - "watchpack-chokidar2": "^2.0.1" + "engines": { + "node": ">=10.13.0" } }, "node_modules/wbuf": { @@ -19830,1045 +16584,329 @@ } }, "node_modules/webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "5.67.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", + "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { - "node": ">=6.11.5" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, "node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "bin": { - "mime": "cli.js" + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpack-dev-server": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", - "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", "dependencies": { - "ansi-html": "0.0.7", + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", + "default-gateway": "^6.0.3", + "del": "^6.0.0", "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.0", "serve-index": "^1.9.1", "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.0", + "ws": "^8.1.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 6.11.5" + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dependencies": { - "remove-trailing-separator": "^1.0.1" + "node": ">=12" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/webpack-dev-server/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dependencies": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/isarray": { + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/webpack-dev-server/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/webpack-dev-server/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/webpack-dev-server/node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack-dev-server/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/webpack-dev-server/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "node": ">= 12.13.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" + "node": ">=12" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "engines": { + "node": ">=10.0.0" }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-log/node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-log/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", "dependencies": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" }, "engines": { - "node": ">=6.11.5" + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" } }, - "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" }, "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" + "node": ">=10.13.0" } }, "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/webpack/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/webpack/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.0.0" } }, - "node_modules/webpack/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/webpack/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/webpack/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/webpack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/webpack/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -20898,6 +16936,17 @@ "iconv-lite": "0.4.24" } }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", @@ -20909,12 +16958,12 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "node_modules/whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dependencies": { "lodash": "^4.7.0", - "tr46": "^2.0.2", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" }, "engines": { @@ -20942,13 +16991,11 @@ "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -20970,242 +17017,315 @@ } }, "node_modules/workbox-background-sync": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", - "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.4.2.tgz", + "integrity": "sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==", "dependencies": { - "workbox-core": "^5.1.4" + "idb": "^6.1.4", + "workbox-core": "6.4.2" } }, "node_modules/workbox-broadcast-update": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", - "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.4.2.tgz", + "integrity": "sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" } }, "node_modules/workbox-build": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", - "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.4.2.tgz", + "integrity": "sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==", "dependencies": { - "@babel/core": "^7.8.4", - "@babel/preset-env": "^7.8.4", - "@babel/runtime": "^7.8.4", - "@hapi/joi": "^15.1.0", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-replace": "^2.3.1", - "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", "common-tags": "^1.8.0", "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^8.1.0", + "fs-extra": "^9.0.1", "glob": "^7.1.6", - "lodash.template": "^4.5.0", + "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", - "rollup": "^1.31.1", - "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-terser": "^5.3.1", - "source-map": "^0.7.3", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", "source-map-url": "^0.4.0", "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "tempy": "^0.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "^5.1.4", - "workbox-broadcast-update": "^5.1.4", - "workbox-cacheable-response": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-expiration": "^5.1.4", - "workbox-google-analytics": "^5.1.4", - "workbox-navigation-preload": "^5.1.4", - "workbox-precaching": "^5.1.4", - "workbox-range-requests": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4", - "workbox-streams": "^5.1.4", - "workbox-sw": "^5.1.4", - "workbox-window": "^5.1.4" + "workbox-background-sync": "6.4.2", + "workbox-broadcast-update": "6.4.2", + "workbox-cacheable-response": "6.4.2", + "workbox-core": "6.4.2", + "workbox-expiration": "6.4.2", + "workbox-google-analytics": "6.4.2", + "workbox-navigation-preload": "6.4.2", + "workbox-precaching": "6.4.2", + "workbox-range-requests": "6.4.2", + "workbox-recipes": "6.4.2", + "workbox-routing": "6.4.2", + "workbox-strategies": "6.4.2", + "workbox-streams": "6.4.2", + "workbox-sw": "6.4.2", + "workbox-window": "6.4.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz", + "integrity": "sha512-JdEazx7qiVqTBzzBl5rolRwl5cmhihjfIcpqRzIZjtT6b18liVmDn/VlWpqW4C/qP2hrFFMLRV1wlex8ZVBPTg==", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/workbox-build/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=10" } }, - "node_modules/workbox-build/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/workbox-build/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, "engines": { "node": ">= 8" } }, - "node_modules/workbox-build/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "node_modules/workbox-cacheable-response": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", - "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.2.tgz", + "integrity": "sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" } }, "node_modules/workbox-core": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", - "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.2.tgz", + "integrity": "sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw==" }, "node_modules/workbox-expiration": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", - "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.2.tgz", + "integrity": "sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==", "dependencies": { - "workbox-core": "^5.1.4" + "idb": "^6.1.4", + "workbox-core": "6.4.2" } }, "node_modules/workbox-google-analytics": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", - "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.4.2.tgz", + "integrity": "sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==", "dependencies": { - "workbox-background-sync": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4" + "workbox-background-sync": "6.4.2", + "workbox-core": "6.4.2", + "workbox-routing": "6.4.2", + "workbox-strategies": "6.4.2" } }, "node_modules/workbox-navigation-preload": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", - "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.4.2.tgz", + "integrity": "sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" } }, "node_modules/workbox-precaching": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", - "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.2.tgz", + "integrity": "sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2", + "workbox-routing": "6.4.2", + "workbox-strategies": "6.4.2" } }, "node_modules/workbox-range-requests": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", - "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.4.2.tgz", + "integrity": "sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" + } + }, + "node_modules/workbox-recipes": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.4.2.tgz", + "integrity": "sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==", + "dependencies": { + "workbox-cacheable-response": "6.4.2", + "workbox-core": "6.4.2", + "workbox-expiration": "6.4.2", + "workbox-precaching": "6.4.2", + "workbox-routing": "6.4.2", + "workbox-strategies": "6.4.2" } }, "node_modules/workbox-routing": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", - "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.2.tgz", + "integrity": "sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" } }, "node_modules/workbox-strategies": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", - "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.2.tgz", + "integrity": "sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==", "dependencies": { - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4" + "workbox-core": "6.4.2" } }, "node_modules/workbox-streams": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", - "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.4.2.tgz", + "integrity": "sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==", "dependencies": { - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4" + "workbox-core": "6.4.2", + "workbox-routing": "6.4.2" } }, "node_modules/workbox-sw": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", - "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.4.2.tgz", + "integrity": "sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg==" }, "node_modules/workbox-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.4.2.tgz", + "integrity": "sha512-CiEwM6kaJRkx1cP5xHksn13abTzUqMHiMMlp5Eh/v4wRcedgDTyv6Uo8+Hg9MurRbHDosO5suaPyF9uwVr4/CQ==", "dependencies": { - "@babel/runtime": "^7.5.5", - "fast-json-stable-stringify": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", "source-map-url": "^0.4.0", - "upath": "^1.1.2", - "webpack-sources": "^1.3.0", - "workbox-build": "^5.1.4" + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.4.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, "node_modules/workbox-window": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", - "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.4.2.tgz", + "integrity": "sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==", "dependencies": { - "workbox-core": "^5.1.4" - } - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dependencies": { - "microevent.ts": "~0.1.1" + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.4.2" } }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -21217,6 +17337,9 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/color-convert": { @@ -21252,9 +17375,9 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", "engines": { "node": ">=8.3.0" }, @@ -21299,9 +17422,12 @@ } }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "4.0.0", @@ -21317,44 +17443,28 @@ } }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/yocto-queue": { @@ -21363,144 +17473,144 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "engines": { "node": ">=10" - } - }, - "node_modules/zlib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=", - "engines": { - "node": ">=0.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } }, "dependencies": { "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.16.7" } }, "@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==" + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" }, "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" + } + }, + "@babel/eslint-parser": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", + "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", + "requires": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "ms": "2.1.2" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" } } }, "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "requires": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz", + "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^4.7.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", - "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -21510,338 +17620,355 @@ "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "requires": { + "@babel/types": "^7.16.7" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "requires": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "requires": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", - "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==" + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", - "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", + "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", - "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz", + "integrity": "sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.12.1" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.16.7" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" + "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", - "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-async-generators": { @@ -21868,12 +17995,20 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz", + "integrity": "sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-dynamic-import": { @@ -21893,11 +18028,11 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", + "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-import-meta": { @@ -21917,11 +18052,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -21972,425 +18107,418 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", - "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", + "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-flow": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", + "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", - "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz", + "integrity": "sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", - "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", + "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.13.12" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", + "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.12.17" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", - "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/plugin-transform-react-jsx": "^7.16.7" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", + "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", - "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz", - "integrity": "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.13.15", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -22400,59 +18528,53 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.14", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -22462,91 +18584,78 @@ } }, "@babel/preset-react": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", - "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", + "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.13.12", - "@babel/plugin-transform-react-jsx-development": "^7.12.17", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" } }, "@babel/preset-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", - "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" } }, "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz", - "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", + "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", "requires": { - "core-js-pure": "^3.0.0", + "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", - "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.15", - "@babel/types": "^7.13.14", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -22555,60 +18664,145 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "@csstools/normalize.css": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" + }, + "@emotion/babel-plugin": { + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", + "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" } }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" - }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + "@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "requires": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } }, "@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, + "@emotion/is-prop-valid": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz", + "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==", + "requires": { + "@emotion/memoize": "^0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "@emotion/react": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz", + "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.2", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", + "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", + "requires": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "@emotion/styled": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz", + "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.3.0", + "@emotion/is-prop-valid": "^1.1.1", + "@emotion/serialize": "^1.0.2", + "@emotion/utils": "^1.0.0" + } + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", + "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + }, + "@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, "@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "ignore": { @@ -22616,46 +18810,35 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" } } }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "requires": { - "@hapi/hoek": "^8.3.0" - } + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -22674,6 +18857,39 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -22687,15 +18903,15 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" }, "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.6.tgz", + "integrity": "sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA==", "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", + "jest-message-util": "^27.4.6", + "jest-util": "^27.4.2", "slash": "^3.0.0" }, "dependencies": { @@ -22708,9 +18924,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22745,35 +18961,35 @@ } }, "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz", + "integrity": "sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg==", "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.6", + "@jest/reporters": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", + "jest-changed-files": "^27.4.2", + "jest-config": "^27.4.7", + "jest-haste-map": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.6", + "jest-resolve-dependencies": "^27.4.6", + "jest-runner": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "jest-watcher": "^27.4.6", + "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" @@ -22788,9 +19004,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22814,49 +19030,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22868,69 +19041,69 @@ } }, "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz", + "integrity": "sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg==", "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/fake-timers": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-mock": "^27.4.6" } }, "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz", + "integrity": "sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A==", "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^27.4.2", + "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^27.4.6", + "jest-mock": "^27.4.6", + "jest-util": "^27.4.2" } }, "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz", + "integrity": "sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw==", "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^27.4.6", + "@jest/types": "^27.4.2", + "expect": "^27.4.6" } }, "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz", + "integrity": "sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ==", "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", + "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.4.6", + "jest-resolve": "^27.4.6", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.6", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" + "v8-to-istanbul": "^8.1.0" }, "dependencies": { "ansi-styles": { @@ -22942,9 +19115,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22968,49 +19141,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -23027,9 +19157,9 @@ } }, "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", + "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.2.4", @@ -23044,45 +19174,44 @@ } }, "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz", + "integrity": "sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ==", "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.6", + "@jest/types": "^27.4.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz", + "integrity": "sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw==", "requires": { - "@jest/test-result": "^26.6.2", + "@jest/test-result": "^27.4.6", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "jest-haste-map": "^27.4.6", + "jest-runtime": "^27.4.6" } }, "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz", + "integrity": "sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==", "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", + "@jest/types": "^27.4.2", + "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", + "jest-haste-map": "^27.4.6", + "jest-regex-util": "^27.4.0", + "jest-util": "^27.4.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" @@ -23097,9 +19226,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -23139,14 +19268,14 @@ } }, "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", + "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" }, "dependencies": { @@ -23159,9 +19288,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -23195,150 +19324,144 @@ } } }, - "@material-ui/core": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz", - "integrity": "sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw==", + "@msgpack/msgpack": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.1.tgz", + "integrity": "sha512-ApwiSL2c9ObewdOE/sqt788P1C5lomBOHyO8nUBCr4ofErBCnYQ003NtJ8lS9OQZc11ximkbmgAZJjB8y6cCdA==" + }, + "@mui/base": { + "version": "5.0.0-alpha.65", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.65.tgz", + "integrity": "sha512-6LCTWVoSnEoQuWdxA+Z1qqmlNK4aZj7LvCuLJzq3RVS2PskRuo1O3caVFxAzRu7xrY3zsyL/sUsJI+rdcjhuXw==", "requires": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.4", - "@material-ui/system": "^4.12.1", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.2", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", + "@babel/runtime": "^7.16.7", + "@emotion/is-prop-valid": "^1.1.1", + "@mui/utils": "^5.3.0", + "@popperjs/core": "^2.4.4", + "clsx": "^1.1.1", "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" + "react-is": "^17.0.2" } }, - "@material-ui/icons": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", - "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "@mui/icons-material": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.3.0.tgz", + "integrity": "sha512-1+dN2N8BgozmdMeHXQLrvSr1G/7Xc0NmAMLSvu8XA9RxhcTos/p66vrvpPASw2qvt14dkfeqyHwvbLRgAU9slw==", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.16.7" } }, - "@material-ui/styles": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", - "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "@mui/material": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.3.0.tgz", + "integrity": "sha512-zLdlweBHrKpOwHFoMXA6FFgKQOONuX4sQhODcj9dk5uPeScuMDE26svcsrPam5Y1PKXZX78YEGHB5Jr5PHGpTA==", "requires": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.2", - "clsx": "^1.0.4", - "csstype": "^2.5.2", + "@babel/runtime": "^7.16.7", + "@mui/base": "5.0.0-alpha.65", + "@mui/system": "^5.3.0", + "@mui/types": "^7.1.0", + "@mui/utils": "^5.3.0", + "@types/react-transition-group": "^4.4.4", + "clsx": "^1.1.1", + "csstype": "^3.0.10", "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" + "prop-types": "^15.7.2", + "react-is": "^17.0.2", + "react-transition-group": "^4.4.2" } }, - "@material-ui/system": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", - "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "@mui/private-theming": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.3.0.tgz", + "integrity": "sha512-EBobUEyM9fMnteKrVPp8pTMUh81xXakyfdpkoh7Y19q9JpD2eh7QGAQVJVj0JBFlcUJD60NIE4K8rdokrRmLwg==", "requires": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.2", - "csstype": "^2.5.2", + "@babel/runtime": "^7.16.7", + "@mui/utils": "^5.3.0", "prop-types": "^15.7.2" } }, - "@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "@mui/styled-engine": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.3.0.tgz", + "integrity": "sha512-I4YemFy9WnCLUdZ5T+6egpzc8e7Jq/uh9AJ3QInZHbyNu/9I2SWvNn7vHjWOT/D8Y8LMzIOhu5WwZbzjez7YRw==", + "requires": { + "@babel/runtime": "^7.16.7", + "@emotion/cache": "^11.7.1", + "prop-types": "^15.7.2" + } + }, + "@mui/system": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.3.0.tgz", + "integrity": "sha512-mblz3EObrhhIMPwSEe2Az7MbMaXOFgrvItPOzZwcY5O9qERB7Rr8KQgbU8VouWLUqyV2i8BaFpLrkKPA6eX2Aw==", + "requires": { + "@babel/runtime": "^7.16.7", + "@mui/private-theming": "^5.3.0", + "@mui/styled-engine": "^5.3.0", + "@mui/types": "^7.1.0", + "@mui/utils": "^5.3.0", + "clsx": "^1.1.1", + "csstype": "^3.0.10", + "prop-types": "^15.7.2" + } + }, + "@mui/types": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz", + "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==", "requires": {} }, - "@material-ui/utils": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", - "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "@mui/utils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.3.0.tgz", + "integrity": "sha512-O/E9IQKPMg0OrN7+gkn7Ga5o5WA2iXQGdyqNBFPNrYzxOvwzsEtM5K7MtTCGGYKFe8mhTRM0ZOjh5OM0dglw+Q==", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.16.7", + "@types/prop-types": "^15.7.4", + "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" + "react-is": "^17.0.2" } }, - "@msgpack/msgpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.0.tgz", - "integrity": "sha512-mlRYq9FSsOd4m+3wZWatemn3hGFZPWNJ4JQOdrir4rrMK2PyIk26idKBoUWrqF3HJJHl+5GpRU+M0wEruJwecg==" - }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", - "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz", + "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==", "requires": { - "ansi-html": "^0.0.7", + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.8.1", "error-stack-parser": "^2.0.6", - "html-entities": "^1.2.1", - "native-url": "^0.2.6", - "schema-utils": "^2.6.5", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", "source-map": "^0.7.3" }, "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -23346,16 +19469,31 @@ } } }, - "@rollup/plugin-node-resolve": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", - "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "@popperjs/core": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==" + }, + "@rollup/plugin-babel": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", + "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", "requires": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", "is-module": "^1.0.0", - "resolve": "^1.14.2" + "resolve": "^1.19.0" } }, "@rollup/plugin-replace": { @@ -23384,6 +19522,11 @@ } } }, + "@rushstack/eslint-patch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz", + "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -23399,20 +19542,22 @@ } }, "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "requires": { "@sinonjs/commons": "^1.7.0" } }, "@surma/rollup-plugin-off-main-thread": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", - "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "requires": { - "ejs": "^2.6.1", - "magic-string": "^0.25.0" + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" } }, "@svgr/babel-plugin-add-jsx-attribute": { @@ -23478,6 +19623,20 @@ "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + } } }, "@svgr/hast-util-to-babel-ast": { @@ -23507,6 +19666,20 @@ "cosmiconfig": "^7.0.0", "deepmerge": "^4.2.2", "svgo": "^1.2.2" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + } } }, "@svgr/webpack": { @@ -23533,15 +19706,20 @@ "defer-to-connect": "^1.0.1" } }, - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", + "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -23551,51 +19729,106 @@ } }, "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "requires": { "@babel/types": "^7.3.0" } }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "@types/eslint": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.9.tgz", - "integrity": "sha512-SdAAXZNvWfhtf3X3y1cbbCZhP3xyPh7mfTvzV6CgfWc/ZhiHpyr9bVroe2/RCHIf7gczaNcprhaBLsx0CCJHQA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", "requires": { "@types/estree": "*", "@types/json-schema": "*" } }, - "@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==" - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", "requires": { - "@types/minimatch": "*", - "@types/node": "*" + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" } }, "@types/graceful-fs": { @@ -23607,28 +19840,27 @@ } }, "@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "@types/http-proxy": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.5.tgz", - "integrity": "sha512-GNkDE7bTv6Sf8JbV2GksknKOsk7OznNYHSdrtvPJXO0qJ9odZig6IZKUi5RFGi6d1bf6dgIAe4uXi3DBc7069Q==", - "dev": true, + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "requires": { "@types/node": "*" } }, "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" }, "@types/istanbul-lib-report": { "version": "3.0.0", @@ -23639,17 +19871,17 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "requires": { "@types/istanbul-lib-report": "*" } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, "@types/json5": { "version": "0.0.29", @@ -23657,33 +19889,19 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "@types/lodash": { - "version": "4.14.173", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.173.tgz", - "integrity": "sha512-vv0CAYoaEjCw/mLy96GBTnRoZrSxkGE0BKzKimdR8P3OzrNYNvBgtW7p055A+E8C31vXNUhWKoFCbhq7gbyhFg==" + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" }, - "@types/material-ui": { - "version": "0.21.8", - "resolved": "https://registry.npmjs.org/@types/material-ui/-/material-ui-0.21.8.tgz", - "integrity": "sha512-Rsx3tRNoYkidDKfMfh+cegtOHMl73akzKnQ5pzxTrbx5oaUXLtG6YVlvtS43uebOSTDf8GQNaseB52r3zVagEg==", - "requires": { - "@types/react": "*", - "@types/react-addons-linked-state-mixin": "*" - } - }, - "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "12.20.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", - "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==" - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", + "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==" }, "@types/parse-json": { "version": "4.0.0", @@ -23691,457 +19909,416 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz", + "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==" }, "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" }, "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.22.tgz", - "integrity": "sha512-kq/BMeaAVLJM6Pynh8C2rnr/drCK+/5ksH0ch9asz+8FW3DscYCIEFtCeYTFeIx/ubvOsMXmRfy7qEJ76gM96A==", + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", + "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" - } - } - }, - "@types/react-addons-linked-state-mixin": { - "version": "0.14.21", - "resolved": "https://registry.npmjs.org/@types/react-addons-linked-state-mixin/-/react-addons-linked-state-mixin-0.14.21.tgz", - "integrity": "sha512-3UF7Szd3JyuU+z90kqu8L4VdDWp7SUC0eRjV2QmMEliaHODGLi5XyO5ctS50K/lG6fjC0dSAPVbvnqv0nPoGMQ==", - "requires": { - "@types/react": "*" } }, "@types/react-dom": { - "version": "17.0.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz", - "integrity": "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==", + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", + "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==", "requires": { "@types/react": "*" } }, - "@types/react-material-ui-form-validator": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/react-material-ui-form-validator/-/react-material-ui-form-validator-2.1.0.tgz", - "integrity": "sha512-izwjulCvMsN01H8oF8X1IN7QDMHeaGmjYoAxL/cmlUJLtFH0BLLUNmlmZERrjNM+MOJAXUaOkwoCqOHlCtqCzQ==", + "@types/react-is": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", + "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", "requires": { - "@types/material-ui": "*", "@types/react": "*" } }, "@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", + "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", "requires": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*" } }, "@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "requires": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } }, "@types/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", "requires": { "@types/react": "*" } }, "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "requires": { "@types/node": "*" } }, - "@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "requires": { + "@types/node": "*" + } }, "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, - "@types/tapable": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", - "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + "@types/trusted-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", + "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, - "@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "@types/ws": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@types/webpack": { - "version": "4.41.27", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.27.tgz", - "integrity": "sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA==", - "requires": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } + "@types/node": "*" } }, "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" }, "@typescript-eslint/eslint-plugin": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz", - "integrity": "sha512-FPUyCPKZbVGexmbCFI3EQHzCZdy2/5f+jv6k2EDljGdXSRc0cKvbndd2nHZkSLqCNOPk0jB6lGzwIkglXcYVsQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", "requires": { - "@typescript-eslint/experimental-utils": "4.21.0", - "@typescript-eslint/scope-manager": "4.21.0", - "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/type-utils": "5.10.0", + "@typescript-eslint/utils": "5.10.0", + "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { - "ms": "2.1.2" + "lru-cache": "^6.0.0" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@typescript-eslint/experimental-utils": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.21.0.tgz", - "integrity": "sha512-cEbgosW/tUFvKmkg3cU7LBoZhvUs+ZPVM9alb25XvR0dal4qHL3SiUqHNrzoWSxaXA9gsifrYrS1xdDV6w/gIA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz", + "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==", "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.21.0", - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/typescript-estree": "4.21.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/utils": "5.10.0" } }, "@typescript-eslint/parser": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.21.0.tgz", - "integrity": "sha512-eyNf7QmE5O/l1smaQgN0Lj2M/1jOuNg2NrBm1dqqQN0sVngTLyw8tdCbih96ixlhbF1oINoN8fDCyEH9SjLeIA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", + "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", "requires": { - "@typescript-eslint/scope-manager": "4.21.0", - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/typescript-estree": "4.21.0", - "debug": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.21.0.tgz", - "integrity": "sha512-kfOjF0w1Ix7+a5T1knOw00f7uAP9Gx44+OEsNQi0PvvTPLYeXJlsCJ4tYnDj5PQEYfpcgOH5yBlw7K+UEI9Agw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", + "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", "requires": { - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/visitor-keys": "4.21.0" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", + "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", + "requires": { + "@typescript-eslint/utils": "5.10.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.21.0.tgz", - "integrity": "sha512-+OQaupjGVVc8iXbt6M1oZMwyKQNehAfLYJJ3SdvnofK2qcjfor9pEM62rVjBknhowTkh+2HF+/KdRAc/wGBN2w==" + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==" }, "@typescript-eslint/typescript-estree": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.21.0.tgz", - "integrity": "sha512-ZD3M7yLaVGVYLw4nkkoGKumb7Rog7QID9YOWobFDMQKNl+vPxqVIW/uDk+MDeGc+OHcoG2nJ2HphwiPNajKw3w==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", "requires": { - "@typescript-eslint/types": "4.21.0", - "@typescript-eslint/visitor-keys": "4.21.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { - "ms": "2.1.2" + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", + "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" } } }, "@typescript-eslint/visitor-keys": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.21.0.tgz", - "integrity": "sha512-dH22dROWGi5Z6p+Igc8bLVLmwy7vEe8r+8c+raPQU0LxgogPUrRAtRGtvBWmlr9waTu3n+QLt/qrS/hWzk1x5w==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", "requires": { - "@typescript-eslint/types": "4.21.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.10.0", + "eslint-visitor-keys": "^3.0.0" } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, @@ -24176,9 +20353,9 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" }, "acorn-globals": { "version": "6.0.0", @@ -24187,12 +20364,43 @@ "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } } }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} + }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } }, "acorn-walk": { "version": "7.2.0", @@ -24205,14 +20413,22 @@ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" }, "adjust-sourcemap-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", - "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "requires": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" } }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -24233,15 +20449,37 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "alphanum-sort": { "version": "1.0.2", @@ -24249,83 +20487,31 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.1.0" } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "requires": { "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - } } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -24344,10 +20530,10 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" }, "argparse": { "version": "1.0.10", @@ -24366,41 +20552,21 @@ "@babel/runtime-corejs3": "^7.10.2" } }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" + "is-string": "^1.0.7" } }, "array-union": { @@ -24408,117 +20574,36 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.19.0" } }, "array.prototype.flatmap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", - "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "function-bind": "^1.1.1" + "es-abstract": "^1.19.0" } }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -24527,15 +20612,10 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "async-validator": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", + "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" }, "asynckit": { "version": "0.4.0", @@ -24547,88 +20627,52 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, "attr-accept": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "axe-core": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.4.tgz", - "integrity": "sha512-Pdgfv6iP0gNx9ejRGa3zE7Xgkj/iclXqLfe7BnatdZz0QnLZ3jrRHUVH8wNSdN68w05Sk3ShGTb3ydktMTooig==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", + "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==" + }, + "axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "requires": { + "follow-redirects": "^1.14.7" + } }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - } - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "requires": { - "babylon": "^6.18.0" - } - }, "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.6.tgz", + "integrity": "sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==", "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.4.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" @@ -24643,9 +20687,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24680,14 +20724,13 @@ } }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", "requires": { - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { @@ -24730,21 +20773,21 @@ } }, "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", + "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -24760,73 +20803,39 @@ "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - } } }, "babel-plugin-named-asset-import": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "requires": {} }, "babel-plugin-polyfill-corejs2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", - "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", - "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", + "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.0", - "core-js-compat": "^3.9.1" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.20.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", - "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.0" - } - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "babel-plugin-transform-react-remove-prop-types": { @@ -24854,282 +20863,71 @@ } }, "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", + "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", "requires": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^27.4.0", "babel-preset-current-node-syntax": "^1.0.0" } }, "babel-preset-react-app": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", - "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", "requires": { - "@babel/core": "7.12.3", - "@babel/plugin-proposal-class-properties": "7.12.1", - "@babel/plugin-proposal-decorators": "7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", - "@babel/plugin-proposal-numeric-separator": "7.12.1", - "@babel/plugin-proposal-optional-chaining": "7.12.1", - "@babel/plugin-transform-flow-strip-types": "7.12.1", - "@babel/plugin-transform-react-display-name": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/preset-react": "7.12.1", - "@babel/preset-typescript": "7.12.1", - "@babel/runtime": "7.12.1", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" }, "dependencies": { - "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", - "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" - } - }, - "@babel/preset-react": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", - "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.12.1", - "@babel/plugin-transform-react-jsx": "^7.12.1", - "@babel/plugin-transform-react-jsx-development": "^7.12.1", - "@babel/plugin-transform-react-jsx-self": "^7.12.1", - "@babel/plugin-transform-react-jsx-source": "^7.12.1", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" - } - }, - "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, "bfj": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", @@ -25151,40 +20949,54 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" - }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" + }, + "dependencies": { + "bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "bonjour": { @@ -25198,13 +21010,6 @@ "dns-txt": "^2.0.2", "multicast-dns": "^6.0.1", "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - } } }, "boolbase": { @@ -25213,19 +21018,19 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "requires": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-styles": { @@ -25237,16 +21042,10 @@ "color-convert": "^2.0.1" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -25282,6 +21081,12 @@ "requires": { "has-flag": "^4.0.0" } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true } } }, @@ -25302,100 +21107,21 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" } }, "bser": { @@ -25406,99 +21132,25 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } - } - }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, "builtin-modules": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cacache": { - "version": "15.0.6", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz", - "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==", - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacheable-request": { "version": "6.1.0", @@ -25547,29 +21199,6 @@ "get-intrinsic": "^1.0.2" } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -25585,9 +21214,14 @@ } }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "caniuse-api": { "version": "3.0.0", @@ -25601,27 +21235,14 @@ } }, "caniuse-lite": { - "version": "1.0.30001235", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz", - "integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==" - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } + "version": "1.0.30001301", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", + "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==" }, "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" }, "chalk": { "version": "2.4.2", @@ -25631,6 +21252,13 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } } }, "char-regex": { @@ -25644,74 +21272,39 @@ "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" }, "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", + "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", "requires": { "source-map": "~0.6.0" }, @@ -25735,13 +21328,13 @@ "dev": true }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "clone-response": { @@ -25778,24 +21371,6 @@ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -25809,19 +21384,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" }, "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" }, "combined-stream": { "version": "1.0.8", @@ -25832,33 +21403,25 @@ } }, "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" }, "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "requires": { - "arity-n": "^1.0.4" - } - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -25881,78 +21444,18 @@ "vary": "~1.1.2" }, "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "compression-webpack-plugin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-5.0.2.tgz", - "integrity": "sha512-F2G4cQfsMZ6CiPlG22Q5EDUCqnfyZqTjyJP5cMgNYUbBg/dUzV3hto8yTFFIogDCTWooVbePHQE0qL6FrJUSsA==", - "requires": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "schema-utils": "^2.7.0", - "serialize-javascript": "^4.0.0", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "ms": "2.0.0" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -25961,197 +21464,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "concurrently": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.0.1.tgz", - "integrity": "sha512-YCF/Wf31a910hXu7eGN9/SyHKD/usw3Shw4IPYuqIsxxC39v92engYlIlOs/zXnBJtX/6aVuhgzfhZeGJkhU4w==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.20", - "read-pkg": "^5.2.0", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - } - } - }, "configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -26164,77 +21476,30 @@ "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - } } }, "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -26244,69 +21509,34 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "requires": { "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, "core-js": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz", - "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==" + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==" }, "core-js-compat": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.1.tgz", - "integrity": "sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", + "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", "requires": { - "browserslist": "^4.16.3", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "dependencies": { @@ -26318,81 +21548,32 @@ } }, "core-js-pure": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.10.1.tgz", - "integrity": "sha512-PeyJH2SE0KuxY5eCGNWA+W+CeDpB6M1PN3S7Am7jSv/Ttuxz2SnWbIiVQOn/TDaGaGtxo8CRWHkXwJscbUHtVw==" + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.3.tgz", + "integrity": "sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA==" }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", + "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-react-context": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", - "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", - "requires": { - "gud": "^1.0.0", - "warning": "^4.0.3" + "yaml": "^1.7.2" } }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -26404,44 +21585,113 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-blank-pseudo": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.2.tgz", + "integrity": "sha512-hOb1LFjRR+8ocA071xUSmg5VslJ8NGo/I2qpUpdeAYyBVCgupS5O8SEVo4SxEMYyFBNodBkzG3T1iqW9HCXxew==", "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "postcss-selector-parser": "^6.0.8" } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "css-declaration-sorter": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", + "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.3.tgz", + "integrity": "sha512-0gDYWEKaGacwxCqvQ3Ypg6wGdD1AztbMm5h1JsactG2hP2eiflj808QITmuWBpE7sjSEVrAlZhPTVd/nNMj/hQ==", + "requires": { + "postcss-selector-parser": "^6.0.8" + } + }, + "css-loader": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" }, "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "requires": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -26449,102 +21699,22 @@ } } }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "requires": { - "postcss": "^7.0.5" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "css-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", - "requires": { - "camelcase": "^6.0.0", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^2.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.1", - "semver": "^7.3.2" - }, - "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } - }, "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "requires": { - "postcss": "^7.0.5" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", + "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", + "requires": {} }, "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "requires": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" } }, "css-select-base-adapter": { @@ -26568,24 +21738,15 @@ } } }, - "css-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "requires": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" }, "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==" }, "cssesc": { "version": "3.0.0", @@ -26593,111 +21754,56 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.15.tgz", + "integrity": "sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ==", "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.8", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } + "cssnano-preset-default": "^5.1.10", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.10.tgz", + "integrity": "sha512-BcpSzUVygHMOnp9uG5rfPzTOCb0GAHQkqtUQx8j1oMNF9A1Q8hziOOhiM4bdICpmrBIU85BE64RD5XGYsVQZNA==", "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.3", - "postcss-unique-selectors": "^4.0.1" + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^3.0.0", + "postcss-calc": "^8.2.0", + "postcss-colormin": "^5.2.3", + "postcss-convert-values": "^5.0.2", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.2", + "postcss-merge-longhand": "^5.0.4", + "postcss-merge-rules": "^5.0.4", + "postcss-minify-font-values": "^5.0.2", + "postcss-minify-gradients": "^5.0.4", + "postcss-minify-params": "^5.0.3", + "postcss-minify-selectors": "^5.1.1", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.2", + "postcss-normalize-positions": "^5.0.2", + "postcss-normalize-repeat-style": "^5.0.2", + "postcss-normalize-string": "^5.0.2", + "postcss-normalize-timing-functions": "^5.0.2", + "postcss-normalize-unicode": "^5.0.2", + "postcss-normalize-url": "^5.0.4", + "postcss-normalize-whitespace": "^5.0.2", + "postcss-ordered-values": "^5.0.3", + "postcss-reduce-initial": "^5.0.2", + "postcss-reduce-transforms": "^5.0.2", + "postcss-svgo": "^5.0.3", + "postcss-unique-selectors": "^5.0.2" } }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + "cssnano-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.0.tgz", + "integrity": "sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA==", + "requires": {} }, "csso": { "version": "4.2.0", @@ -26749,36 +21855,14 @@ } }, "csstype": { - "version": "2.6.16", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.16.tgz", - "integrity": "sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q==" - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "data-urls": { "version": "2.0.0", @@ -26790,34 +21874,18 @@ "whatwg-url": "^8.0.0" } }, - "date-fns": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.20.1.tgz", - "integrity": "sha512-8P5M8Kxbnovd0zfvOs7ipkiVJ3/zZQ0F/nrBW4x5E+I0uAZVZ80h6CKd24fSXQ5TLK5hXMtI4yb2O5rEZdUt2A==", - "dev": true - }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, "decompress-response": { "version": "3.3.0", @@ -26853,9 +21921,9 @@ "dev": true }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "deepmerge": { "version": "4.2.2", @@ -26863,12 +21931,11 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" } }, "defer-to-connect": { @@ -26877,6 +21944,11 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -26885,97 +21957,24 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" } }, "delayed-stream": { @@ -26988,15 +21987,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -27008,9 +21998,9 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" }, "detect-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", - "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "detect-port-alt": { "version": "1.1.6", @@ -27019,30 +22009,43 @@ "requires": { "address": "^1.0.1", "debug": "^2.6.0" - } - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" }, "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "diff-sequences": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", + "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -27051,6 +22054,11 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -27090,46 +22098,28 @@ } }, "dom-helpers": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", - "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "requires": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" - } } }, "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domexception": { "version": "2.0.1", @@ -27147,20 +22137,21 @@ } }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "requires": { - "domelementtype": "1" + "domelementtype": "^2.2.0" } }, "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "dot-case": { @@ -27176,14 +22167,15 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, "requires": { "is-obj": "^2.0.0" } }, "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" }, "dotenv-expand": { "version": "5.1.0", @@ -27201,110 +22193,33 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" - }, - "electron-to-chromium": { - "version": "1.3.749", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.749.tgz", - "integrity": "sha512-F+v2zxZgw/fMwPz/VUGIggG4ZndDsYy0vlpthi3tjmDZlcfbhN5mYW0evXUsBr2sUtuDANFtle410A9u/sd/4A==" - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } + "jake": "^10.6.1" } }, + "electron-to-chromium": { + "version": "1.4.51", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz", + "integrity": "sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ==" + }, "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==" }, "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "emojis-list": { "version": "3.0.0", @@ -27320,69 +22235,18 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "requires": { - "ansi-colors": "^4.1.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "entities": { @@ -27390,61 +22254,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, - "env-cmd": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", - "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", - "requires": { - "commander": "^4.0.0", - "cross-spawn": "^7.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -27462,28 +22271,37 @@ } }, "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "unbox-primitive": "^1.0.1" } }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -27494,35 +22312,6 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -27540,9 +22329,9 @@ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "escodegen": { "version": "2.0.0", @@ -27556,11 +22345,6 @@ "source-map": "~0.6.1" }, "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -27605,57 +22389,47 @@ } }, "eslint": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", - "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", + "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -27664,10 +22438,15 @@ "color-convert": "^2.0.1" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -27696,18 +22475,18 @@ "which": "^2.0.1" } }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "requires": { - "ms": "2.1.2" + "is-glob": "^4.0.3" } }, "globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "requires": { "type-fest": "^0.20.2" } @@ -27717,15 +22496,13 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } }, "path-key": { "version": "3.1.1", @@ -27768,39 +22545,63 @@ } } }, - "eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true, - "requires": {} - }, "eslint-config-react-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", + "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", "requires": { - "confusing-browser-globals": "^1.0.10" + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" } }, "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } } }, "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", + "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" + "debug": "^3.2.7", + "find-up": "^2.1.0" }, "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -27843,121 +22644,107 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - } } } }, "eslint-plugin-flowtype": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.6.0.tgz", - "integrity": "sha512-XbeDejiL+SecDInj9On/9D4EM31kUp6B3uWYsBH6Vsb2CfaFWiUHvosAZx1TafVjp6izLC7D3kpix1DIpDF4Qw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", "requires": { - "lodash": "^4.17.15", + "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" } }, "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.25.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", + "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.12.0" }, "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "ms": "2.0.0" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "eslint-plugin-jest": { - "version": "24.3.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.4.tgz", - "integrity": "sha512-3n5oY1+fictanuFkTWPwSlehugBTAgwLnYLFsCllzE3Pl1BwywHl5fL0HFxmMjoQY8xhUDk8uAWc3S4JOHGh3A==", + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", "requires": { - "@typescript-eslint/experimental-utils": "^4.0.1" + "@typescript-eslint/experimental-utils": "^5.0.0" } }, "eslint-plugin-jsx-a11y": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", - "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", + "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", "requires": { - "@babel/runtime": "^7.11.2", + "@babel/runtime": "^7.16.3", "aria-query": "^4.2.2", - "array-includes": "^3.1.1", + "array-includes": "^3.1.4", "ast-types-flow": "^0.0.7", - "axe-core": "^4.0.2", + "axe-core": "^4.3.5", "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.1.0", - "language-tags": "^1.0.5" - }, - "dependencies": { - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - } - } - }, - "eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" } }, "eslint-plugin-react": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz", - "integrity": "sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", + "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", "requires": { - "array-includes": "^3.1.3", - "array.prototype.flatmap": "^1.2.4", + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", "doctrine": "^2.1.0", - "has": "^1.0.3", + "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.0.4", - "object.entries": "^1.1.3", - "object.fromentries": "^2.0.4", - "object.values": "^1.1.3", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.4" + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" }, "dependencies": { "doctrine": { @@ -27980,134 +22767,68 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", + "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "requires": {} }, "eslint-plugin-testing-library": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", - "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.4.tgz", + "integrity": "sha512-zA/NfAENCsJXujvwwiap5gsqLp2U6X7m2XA5nOksl4zzb6GpUmRNAleCll58rEP0brFVj7DZBprlIlMGIhoC7Q==", "requires": { - "@typescript-eslint/experimental-utils": "^3.10.1" - }, - "dependencies": { - "@typescript-eslint/experimental-utils": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==" - }, - "@typescript-eslint/typescript-estree": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "requires": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "@typescript-eslint/experimental-utils": "^5.9.0" } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" } } }, "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==" }, "eslint-webpack-plugin": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.3.tgz", - "integrity": "sha512-LewNevZf9ghDCxCGT6QltNWVi8KIYWc4LKcin8K9Azh1hypG7YAmobUDIU67fAPa+eMjRnU4rjEkLbYI1w5/UA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz", + "integrity": "sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==", "requires": { - "@types/eslint": "^7.2.6", - "arrify": "^2.0.1", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "schema-utils": "^3.0.0" + "@types/eslint": "^7.28.2", + "jest-worker": "^27.3.1", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1" } }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "requires": { - "acorn": "^7.4.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - } + "eslint-visitor-keys": "^3.1.0" } }, "esprima": { @@ -28121,13 +22842,6 @@ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } } }, "esrecurse": { @@ -28136,19 +22850,12 @@ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" }, "estree-walker": { "version": "1.0.1", @@ -28175,40 +22882,58 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" - }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } } }, "exit": { @@ -28216,85 +22941,28 @@ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz", + "integrity": "sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag==", "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } + "@jest/types": "^27.4.2", + "jest-get-type": "^27.4.0", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6" } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -28308,151 +22976,59 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -28466,17 +23042,17 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "requires": { "reusify": "^1.0.4" } }, "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "requires": { "websocket-driver": ">=0.5.1" } @@ -28489,11 +23065,6 @@ "bser": "2.1.1" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -28503,9 +23074,9 @@ } }, "file-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -28519,16 +23090,18 @@ "tslib": "^2.0.3" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "requires": { + "minimatch": "^3.0.4" + } }, "filesize": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" }, "fill-range": { "version": "7.0.1", @@ -28550,24 +23123,44 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "requires": { "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -28581,323 +23174,153 @@ } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" }, "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", + "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", "requires": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" }, "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "color-convert": "^2.0.1" } }, - "fill-range": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "lru-cache": "^6.0.0" } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" } } }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } + "fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" }, "fs.realpath": { "version": "1.0.0", @@ -28951,30 +23374,23 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "requires": { - "assert-plus": "^1.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -28992,19 +23408,24 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dev": true, "requires": { - "ini": "1.3.7" + "ini": "2.0.0" }, "dependencies": { "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true } } @@ -29033,15 +23454,15 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -29062,31 +23483,30 @@ "p-cancelable": "^1.0.0", "to-readable-stream": "^1.0.0", "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "optional": true - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "duplexer": "^0.1.2" } }, "handle-thing": { @@ -29094,24 +23514,10 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "has": { "version": "1.0.3", @@ -29136,51 +23542,12 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, - "has-value": { + "has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "has-symbols": "^1.0.2" } }, "has-yarn": { @@ -29189,63 +23556,17 @@ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.2.0.tgz", + "integrity": "sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig==", "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@babel/runtime": "^7.7.6" } }, "hoist-non-react-statics": { @@ -29271,7 +23592,8 @@ "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "hpack.js": { "version": "2.1.6", @@ -29284,11 +23606,6 @@ "wbuf": "^1.1.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -29303,11 +23620,6 @@ "util-deprecate": "~1.0.1" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -29318,16 +23630,6 @@ } } }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -29337,9 +23639,9 @@ } }, "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" }, "html-escaper": { "version": "2.0.2", @@ -29347,82 +23649,40 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", "he": "^1.2.0", - "param-case": "^3.0.3", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^4.6.3" + "terser": "^5.10.0" } }, "html-webpack-plugin": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", - "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "requires": { - "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", - "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - } + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, "http-cache-semantics": { @@ -29437,21 +23697,21 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" } }, "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==" }, "http-proxy": { "version": "1.18.1", @@ -29463,67 +23723,60 @@ "requires-port": "^1.0.0" } }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, "http-proxy-middleware": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.1.1.tgz", - "integrity": "sha512-FIDg9zPvOwMhQ3XKB2+vdxK6WWbVAH7s5QpqQCif7a1TNL76GNAATWA1sy6q2gSfss8UJ/Nwza3N6QnFkKclpA==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", "requires": { "@types/http-proxy": "^1.17.5", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" - }, - "dependencies": { - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "agent-base": "6", + "debug": "4" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "requires": { - "postcss": "^7.0.14" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "idb": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", + "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" }, "identity-obj-proxy": { "version": "3.0.0", @@ -29533,20 +23786,10 @@ "harmony-reflect": "^1.4.6" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "ignore-by-default": { "version": "1.0.1", @@ -29555,17 +23798,9 @@ "dev": true }, "immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", + "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==" }, "import-fresh": { "version": "3.3.0", @@ -29576,21 +23811,6 @@ "resolve-from": "^4.0.0" } }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -29598,22 +23818,12 @@ "dev": true }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - } } }, "imurmurhash": { @@ -29621,29 +23831,11 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, - "indefinite-observable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-2.0.1.tgz", - "integrity": "sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ==", - "requires": { - "symbol-observable": "1.2.0" - } - }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -29654,24 +23846,15 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -29687,45 +23870,18 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" }, "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-arrayish": { @@ -29734,9 +23890,12 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } }, "is-binary-path": { "version": "2.1.0", @@ -29747,107 +23906,57 @@ } }, "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, "requires": { "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + } } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "requires": { "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "has-tostringtag": "^1.0.0" } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -29864,34 +23973,21 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, - "is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" - }, "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "dependencies": { - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - } + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, "is-module": { @@ -29900,14 +23996,14 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "dev": true }, "is-number": { @@ -29916,48 +24012,33 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "requires": { - "is-path-inside": "^2.1.0" - } - }, "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "requires": { - "path-is-inside": "^1.0.2" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" }, "is-potential-custom-element-name": { "version": "1.0.1", @@ -29965,12 +24046,12 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, "is-regexp": { @@ -29978,32 +24059,35 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, "is-root": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "is-typedarray": { @@ -30011,10 +24095,13 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-windows": { + "is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } }, "is-wsl": { "version": "2.2.0", @@ -30031,46 +24118,30 @@ "dev": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" }, "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", "requires": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "istanbul-lib-report": { @@ -30088,19 +24159,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -30112,28 +24170,15 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -30142,22 +24187,76 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, - "jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", - "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", "requires": { - "@jest/core": "^26.6.0", + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + }, + "jest": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.7.tgz", + "integrity": "sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg==", + "requires": { + "@jest/core": "^27.4.7", "import-local": "^3.0.2", - "jest-cli": "^26.6.0" + "jest-cli": "^27.4.7" + } + }, + "jest-changed-files": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", + "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", + "requires": { + "@jest/types": "^27.4.2", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.6.tgz", + "integrity": "sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ==", + "requires": { + "@jest/environment": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.4.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -30169,9 +24268,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30195,26 +24294,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -30225,117 +24304,23 @@ } } }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "jest-cli": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.7.tgz", + "integrity": "sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw==", "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-circus": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", - "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", - "@types/babel__traverse": "^7.0.4", - "@types/node": "*", + "@jest/core": "^27.4.7", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^26.6.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-runner": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "pretty-format": "^26.6.0", - "stack-utils": "^2.0.2", - "throat": "^5.0.0" + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.4.7", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "prompts": "^2.0.1", + "yargs": "^16.2.0" }, "dependencies": { "ansi-styles": { @@ -30347,9 +24332,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30384,28 +24369,32 @@ } }, "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.7.tgz", + "integrity": "sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw==", "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.4.6", + "@jest/types": "^27.4.2", + "babel-jest": "^27.4.6", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" + "jest-circus": "^27.4.6", + "jest-environment-jsdom": "^27.4.6", + "jest-environment-node": "^27.4.6", + "jest-get-type": "^27.4.0", + "jest-jasmine2": "^27.4.6", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.6", + "jest-runner": "^27.4.6", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.6", + "slash": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -30417,9 +24406,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30443,49 +24432,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -30497,14 +24443,14 @@ } }, "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz", + "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==", "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "diff-sequences": "^27.4.0", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.6" }, "dependencies": { "ansi-styles": { @@ -30516,9 +24462,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30553,23 +24499,23 @@ } }, "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", + "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.6.tgz", + "integrity": "sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA==", "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.4.0", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.6" }, "dependencies": { "ansi-styles": { @@ -30581,9 +24527,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30618,81 +24564,79 @@ } }, "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz", + "integrity": "sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA==", "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "jest-mock": "^27.4.6", + "jest-util": "^27.4.2", + "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.6.tgz", + "integrity": "sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ==", "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^27.4.6", + "jest-util": "^27.4.2" } }, "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", + "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==" }, "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.6.tgz", + "integrity": "sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ==", "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", + "fsevents": "^2.3.2", "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", + "jest-regex-util": "^27.4.0", + "jest-serializer": "^27.4.0", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.6", + "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz", + "integrity": "sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw==", "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^27.4.6", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.6.2", + "expect": "^27.4.6", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" + "jest-each": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", + "pretty-format": "^27.4.6", + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -30704,9 +24648,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30741,23 +24685,23 @@ } }, "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz", + "integrity": "sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA==", "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.6" } }, "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz", + "integrity": "sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==", "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-diff": "^27.4.6", + "jest-get-type": "^27.4.0", + "pretty-format": "^27.4.6" }, "dependencies": { "ansi-styles": { @@ -30769,9 +24713,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30806,19 +24750,19 @@ } }, "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz", + "integrity": "sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==", "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.4.2", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^27.4.6", "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "stack-utils": "^2.0.3" }, "dependencies": { "ansi-styles": { @@ -30830,9 +24774,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30867,36 +24811,39 @@ } }, "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.6.tgz", + "integrity": "sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw==", "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/node": "*" } }, "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} }, "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", + "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==" }, "jest-resolve": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", - "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.6.tgz", + "integrity": "sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw==", "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.4.6", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.0", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", + "jest-util": "^27.4.2", + "jest-validate": "^27.4.6", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", "slash": "^3.0.0" }, "dependencies": { @@ -30909,9 +24856,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30935,34 +24882,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -30974,40 +24893,42 @@ } }, "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz", + "integrity": "sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw==", "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "@jest/types": "^27.4.2", + "jest-regex-util": "^27.4.0", + "jest-snapshot": "^27.4.6" } }, "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.6.tgz", + "integrity": "sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg==", "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^27.4.6", + "@jest/environment": "^27.4.6", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.7.1", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", + "jest-docblock": "^27.4.0", + "jest-environment-jsdom": "^27.4.6", + "jest-environment-node": "^27.4.6", + "jest-haste-map": "^27.4.6", + "jest-leak-detector": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-resolve": "^27.4.6", + "jest-runtime": "^27.4.6", + "jest-util": "^27.4.2", + "jest-worker": "^27.4.6", "source-map-support": "^0.5.6", - "throat": "^5.0.0" + "throat": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -31019,9 +24940,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31045,49 +24966,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -31099,37 +24977,32 @@ } }, "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.6.tgz", + "integrity": "sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ==", "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", + "@jest/environment": "^27.4.6", + "@jest/fake-timers": "^27.4.6", + "@jest/globals": "^27.4.6", + "@jest/source-map": "^27.4.0", + "@jest/test-result": "^27.4.6", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", + "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", + "jest-haste-map": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-mock": "^27.4.6", + "jest-regex-util": "^27.4.0", + "jest-resolve": "^27.4.6", + "jest-snapshot": "^27.4.6", + "jest-util": "^27.4.2", "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" + "strip-bom": "^4.0.0" }, "dependencies": { "ansi-styles": { @@ -31141,9 +25014,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31167,54 +25040,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -31226,34 +25051,40 @@ } }, "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", + "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", "requires": { "@types/node": "*", "graceful-fs": "^4.2.4" } }, "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.6.tgz", + "integrity": "sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ==", "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", + "@jest/transform": "^27.4.6", + "@jest/types": "^27.4.2", "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^26.6.2", + "expect": "^27.4.6", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", + "jest-diff": "^27.4.6", + "jest-get-type": "^27.4.0", + "jest-haste-map": "^27.4.6", + "jest-matcher-utils": "^27.4.6", + "jest-message-util": "^27.4.6", + "jest-util": "^27.4.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", + "pretty-format": "^27.4.6", "semver": "^7.3.2" }, "dependencies": { @@ -31266,9 +25097,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31292,47 +25123,12 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "lru-cache": "^6.0.0" } }, "supports-color": { @@ -31346,16 +25142,16 @@ } }, "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", + "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^27.4.2", "@types/node": "*", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "picomatch": "^2.2.3" }, "dependencies": { "ansi-styles": { @@ -31367,9 +25163,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31404,16 +25200,16 @@ } }, "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.6.tgz", + "integrity": "sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ==", "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", + "@jest/types": "^27.4.2", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^27.4.0", "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "pretty-format": "^27.4.6" }, "dependencies": { "ansi-styles": { @@ -31425,9 +25221,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31462,19 +25258,24 @@ } }, "jest-watch-typeahead": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", - "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz", + "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==", "requires": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", - "jest-regex-util": "^26.0.0", - "jest-watcher": "^26.3.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0" + "jest-regex-util": "^27.0.0", + "jest-watcher": "^27.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" }, "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -31484,14 +25285,19 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, + "char-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.0.tgz", + "integrity": "sha512-oGu2QekBMXgyQNWPDRQ001bjvDnZe4/zBTz37TMbiKz1NbNiyiH5hRkobe7npRN6GfbGbxMYFck/vQ1r9c1VMA==" + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -31510,6 +25316,28 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + }, + "string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "requires": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -31521,16 +25349,16 @@ } }, "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.6.tgz", + "integrity": "sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw==", "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/test-result": "^27.4.6", + "@jest/types": "^27.4.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.2", + "jest-util": "^27.4.2", "string-length": "^4.0.1" }, "dependencies": { @@ -31543,9 +25371,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31580,13 +25408,13 @@ } }, "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { @@ -31595,9 +25423,9 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "requires": { "has-flag": "^4.0.0" } @@ -31618,18 +25446,13 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "jsdom": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.2.tgz", - "integrity": "sha512-JxNtPt9C1ut85boCbJmffaQ06NBnzkQY/MWO3YxPW8IWS38A26z+B1oBvA9LwKrytewdfymnhi4UNH3/RAgZrg==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "requires": { "abab": "^2.0.5", - "acorn": "^8.1.0", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", @@ -31637,12 +25460,13 @@ "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", "parse5": "6.0.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", @@ -31652,15 +25476,8 @@ "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", - "ws": "^7.4.4", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", - "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==" - } } }, "jsesc": { @@ -31685,9 +25502,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -31699,16 +25516,6 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -31726,109 +25533,17 @@ "universalify": "^2.0.0" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jss": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.6.0.tgz", - "integrity": "sha512-n7SHdCozmxnzYGXBHe0NsO0eUf9TvsHVq2MXvi4JmTn3x5raynodDVE/9VQmBdWFyyj9HpHZ2B4xNZ7MMy7lkw==", - "requires": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "indefinite-observable": "^2.0.1", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" - } - } - }, - "jss-plugin-camel-case": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.6.0.tgz", - "integrity": "sha512-JdLpA3aI/npwj3nDMKk308pvnhoSzkW3PXlbgHAzfx0yHWnPPVUjPhXFtLJzgKZge8lsfkUxvYSQ3X2OYIFU6A==", - "requires": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.6.0" - } - }, - "jss-plugin-default-unit": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.6.0.tgz", - "integrity": "sha512-7y4cAScMHAxvslBK2JRK37ES9UT0YfTIXWgzUWD5euvR+JR3q+o8sQKzBw7GmkQRfZijrRJKNTiSt1PBsLI9/w==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0" - } - }, - "jss-plugin-global": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.6.0.tgz", - "integrity": "sha512-I3w7ji/UXPi3VuWrTCbHG9rVCgB4yoBQLehGDTmsnDfXQb3r1l3WIdcO8JFp9m0YMmyy2CU7UOV6oPI7/Tmu+w==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0" - } - }, - "jss-plugin-nested": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.6.0.tgz", - "integrity": "sha512-fOFQWgd98H89E6aJSNkEh2fAXquC9aZcAVjSw4q4RoQ9gU++emg18encR4AT4OOIFl4lQwt5nEyBBRn9V1Rk8g==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-props-sort": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.6.0.tgz", - "integrity": "sha512-oMCe7hgho2FllNc60d9VAfdtMrZPo9n1Iu6RNa+3p9n0Bkvnv/XX5San8fTPujrTBScPqv9mOE0nWVvIaohNuw==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0" - } - }, - "jss-plugin-rule-value-function": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.6.0.tgz", - "integrity": "sha512-TKFqhRTDHN1QrPTMYRlIQUOC2FFQb271+AbnetURKlGvRl/eWLswcgHQajwuxI464uZk91sPiTtdGi7r7XaWfA==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.6.0", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-vendor-prefixer": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.6.0.tgz", - "integrity": "sha512-doJ7MouBXT1lypLLctCwb4nJ6lDYqrTfVS3LtXgox42Xz0gXusXIIDboeh6UwnSmox90QpVnub7au8ybrb0krQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.6.0" - } + "jsonpointer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==" }, "jsx-ast-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", - "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", "requires": { - "array-includes": "^3.1.2", + "array-includes": "^3.1.3", "object.assign": "^4.1.2" } }, @@ -31846,11 +25561,6 @@ "json-buffer": "3.0.0" } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -31862,9 +25572,9 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" }, "language-subtag-registry": { "version": "0.3.21", @@ -31879,15 +25589,6 @@ "language-subtag-registry": "~0.3.2" } }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, "latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -31911,46 +25612,55 @@ "type-check": "~0.4.0" } }, + "lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==" + }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "dependencies": { "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true } } }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==" }, "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -31958,11 +25668,11 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -31970,63 +25680,31 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -32066,50 +25744,19 @@ } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "semver": "^6.0.0" } }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "tmpl": "1.0.5" } }, "mdn-data": { @@ -32122,47 +25769,12 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "fs-monkey": "1.0.3" } }, "memorystream": { @@ -32191,11 +25803,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" - }, "micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -32205,38 +25812,22 @@ "picomatch": "^2.2.3" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "requires": { - "mime-db": "1.47.0" + "mime-db": "1.51.0" } }, "mimic-fn": { @@ -32250,52 +25841,47 @@ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, - "mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "requires": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - } - }, "mini-css-extract-plugin": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", - "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz", + "integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==", "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "requires": { - "minimist": "^1.2.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "fast-deep-equal": "^3.1.3" } }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } @@ -32305,11 +25891,6 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -32323,83 +25904,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -32408,33 +25912,10 @@ "minimist": "^1.2.5" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -32450,42 +25931,10 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true - }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "native-url": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", - "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", - "requires": { - "querystring": "^0.2.0" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" }, "natural-compare": { "version": "1.4.0", @@ -32502,15 +25951,11 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, "no-case": { "version": "3.0.4", @@ -32522,137 +25967,36 @@ } }, "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==" }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "dev": true, "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "dependencies": { "debug": { @@ -32664,12 +26008,6 @@ "ms": "^2.1.1" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -32691,6 +26029,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -32701,7 +26040,8 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -32716,20 +26056,14 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "notistack": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-1.0.6.tgz", - "integrity": "sha512-/p7W9b3r3/LDXUpUjNgZqnYj+NYG3/4htZcyucOFftrDKEpveEMPFdPlvmoT9+N1L4GgcKEY9Vr9+Dxyk2FQcQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz", + "integrity": "sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==", "requires": { "clsx": "^1.1.0", "hoist-non-react-statics": "^3.3.0" @@ -32750,126 +26084,50 @@ "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - } } }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" + }, + "dependencies": { + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + } } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, "object-is": { "version": "1.1.5", @@ -32885,14 +26143,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -32905,54 +26155,52 @@ } }, "object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.19.1" } }, "object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.19.1" } }, "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", "requires": { - "isobject": "^3.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, "object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.19.1" } }, "obuf": { @@ -32990,36 +26238,13 @@ } }, "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - } - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", - "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, "optionator": { @@ -33035,49 +26260,26 @@ "word-wrap": "^1.2.3" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-map": { @@ -33089,11 +26291,12 @@ } }, "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "requires": { - "retry": "^0.12.0" + "@types/retry": "^0.12.0", + "retry": "^0.13.1" } }, "p-try": { @@ -33111,63 +26314,6 @@ "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "param-case": { @@ -33187,18 +26333,6 @@ "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -33234,21 +26368,6 @@ "tslib": "^2.0.3" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -33259,15 +26378,11 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-parse": { "version": "1.0.7", @@ -33284,27 +26399,20 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pidtree": { "version": "0.3.1", @@ -33313,68 +26421,56 @@ "dev": true }, "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==" }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" }, "dependencies": { "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, @@ -33403,6 +26499,14 @@ "path-exists": "^3.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -33418,19 +26522,6 @@ } } }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", - "requires": { - "ts-pnp": "^1.1.6" - } - }, - "popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -33448,1008 +26539,639 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" } }, "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", "requires": { - "postcss": "^7.0.2", "postcss-selector-parser": "^6.0.2" } }, "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", - "requires": { - "postcss": "^7" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "requires": {} }, "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz", + "integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==", "requires": { - "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.0.2" } }, "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.1.tgz", + "integrity": "sha512-62OBIXCjRXpQZcFOYIXwXBlpAVWrYk8ek1rcjvMING4Q2cf0ipyN9qT+BhHA6HmftGSEnFQu2qgKO3gMscl3Rw==", "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.2.tgz", + "integrity": "sha512-gyx8RgqSmGVK156NAdKcsfkY3KPGHhKqvHTL3hhveFrBBToguKFzhyiuk3cljH6L4fJ0Kv+JENuPXs1Wij27Zw==", "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.3.tgz", + "integrity": "sha512-dra4xoAjub2wha6RUXAgadHEn2lGxbj8drhFcIGLOMn914Eu7DkPUurugDXgstwttCYkJtZ/+PkWRWdp3UHRIA==", "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", + "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.1.0" } }, "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "requires": { - "postcss": "^7.0.14" - } + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "requires": {} }, "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.3.tgz", + "integrity": "sha512-rtu3otIeY532PnEuuBrIIe+N+pcdbX/7JMZfrcL09wc78YayrHw5E8UkDfvnlOhEUrI4ptCuzXQfj+Or6spbGA==", "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" + "postcss-value-parser": "^4.2.0" } }, "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.4" } }, "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.3.tgz", + "integrity": "sha512-qiPm+CNAlgXiMf0J5IbBBEXA9l/Q5HGsNGkL3znIwT2ZFRLGY9U2fTUpa4lqCUXQOxaLimpacHeQC80BD2qbDw==", "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.8" } }, "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "requires": { - "postcss": "^7.0.0" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "requires": {} }, "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "requires": { - "postcss": "^7.0.0" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "requires": {} }, "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "requires": { - "postcss": "^7.0.0" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "requires": {} }, "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "requires": { - "postcss": "^7.0.0" - } + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.2.tgz", + "integrity": "sha512-+56BLP6NSSUuWUXjRgAQuho1p5xs/hU5Sw7+xt9S3JSg+7R6+WMGnJW7Hre/6tTuZ2xiXMB42ObkiZJ2hy/Pew==", + "requires": {} }, "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.4.tgz", + "integrity": "sha512-qz+s5vhKJlsHw8HjSs+HVk2QGFdRyC68KGRQGX3i+GcnUjhWhXQEmCXW6siOJkZ1giu0ddPwSO6I6JdVVVPoog==", "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.4.tgz", + "integrity": "sha512-0ltahRTPtXSIlEZFv7zIvdEib7HN0ZbUQxrxIKn8KbiRyhALo854I/CggU5lyZe6ZBvSTJ6Al2vkZecI2OhneQ==", "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-flexbugs-fixes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", - "requires": { - "postcss": "^7.0.26" - } + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "requires": {} }, "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.3.tgz", + "integrity": "sha512-ozOsg+L1U8S+rxSHnJJiET6dNLyADcPHhEarhhtCI9DBLGOPG/2i4ddVoFch9LzrBgb8uDaaRI4nuid2OM82ZA==", "requires": { - "postcss": "^7.0.2" + "postcss-selector-parser": "^6.0.8" } }, "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.3.tgz", + "integrity": "sha512-fk9y2uFS6/Kpp7/A9Hz9Z4rlFQ8+tzgBcQCXAFSrXFGAbKx+4ZZOmmfHuYjCOMegPWoz0pnC6fNzi8j7Xyqp5Q==", "requires": { - "postcss": "^7.0.2" + "postcss-selector-parser": "^6.0.8" } }, "postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "requires": { - "postcss": "^7.0.2" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "requires": {} }, "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "requires": { - "postcss": "^7.0.2" - } + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", + "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", + "requires": {} }, "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.4.tgz", + "integrity": "sha512-BlEo9gSTj66lXjRNByvkMK9dEdEGFXRfGjKRi9fo8s0/P3oEk74cAoonl/utiM50E2OPVb/XSu+lWvdW4KtE/Q==", "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "requires": {} + }, + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "requires": { - "postcss": "^7.0.2" + "camelcase-css": "^2.0.1" } }, "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.3.tgz", + "integrity": "sha512-MH4tymWmefdZQ7uVG/4icfLjAQmH6o2NRYyVh2mKoB4RXJp9PjsyhZwhH4ouaCQHvg+qJVj3RzeAR1EQpIlXZA==", "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", + "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } + "lilconfig": "^2.0.4", + "yaml": "^1.10.2" } }, "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "requires": { - "minimist": "^1.2.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "lru-cache": "^6.0.0" } } } }, "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "requires": { - "postcss": "^7.0.2" - } + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", + "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", + "requires": {} }, "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "requires": { - "postcss": "^7.0.2" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "requires": {} }, "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz", + "integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==", "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" } }, "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.4.tgz", + "integrity": "sha512-yOj7bW3NxlQxaERBB0lEY1sH5y+RzevjbdH4DBJurjKERNpknRByFNdNe+V72i5pIZL12woM9uGdS5xbSB+kDQ==", "requires": { - "browserslist": "^4.0.0", + "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "cssnano-utils": "^3.0.0", + "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.2.tgz", + "integrity": "sha512-R6MJZryq28Cw0AmnyhXrM7naqJZZLoa1paBltIzh2wM7yb4D45TLur+eubTQ4jCmZU9SGeZdWsc5KcSoqTMeTg==", "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.4.tgz", + "integrity": "sha512-RVwZA7NC4R4J76u8X0Q0j+J7ItKUWAeBUJ8oEEZWmtv3Xoh19uNJaJwzNpsydQjk6PkuhRrK+YwwMf+c+68EYg==", "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "colord": "^2.9.1", + "cssnano-utils": "^3.0.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.3.tgz", + "integrity": "sha512-NY92FUikE+wralaiVexFd5gwb7oJTIDhgTNeIw89i1Ymsgt4RWiPXfz3bg7hDy4NL6gepcThJwOYNtZO/eNi7Q==", "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.6", + "cssnano-utils": "^3.0.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.1.tgz", + "integrity": "sha512-TOzqOPXt91O2luJInaVPiivh90a2SIK5Nf1Ea7yEIM/5w+XA5BGrZGUSW8aEx9pJ/oNj7ZJBhjvigSiBV+bC1Q==", "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" } }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "requires": { - "postcss": "^7.0.5" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} }, "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", + "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "requires": { + "postcss-selector-parser": "^6.0.6" } }, "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", + "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", "requires": { - "postcss": "^7.0.2" + "postcss-selector-parser": "^6.0.8" } }, "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" } }, "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "requires": { - "postcss": "^7.0.0" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "requires": {} }, "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz", + "integrity": "sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==", "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.2.tgz", + "integrity": "sha512-tqghWFVDp2btqFg1gYob1etPNxXLNh3uVeWgZE2AQGh6b2F8AK2Gj36v5Vhyh+APwIzNjmt6jwZ9pTBP+/OM8g==", "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.2.tgz", + "integrity": "sha512-/rIZn8X9bBzC7KvY4iKUhXUGW3MmbXwfPF23jC9wT9xTi7kAvgj8sEgwxjixBmoL6MVa4WOgxNz2hAR6wTK8tw==", "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.2.tgz", + "integrity": "sha512-zaI1yzwL+a/FkIzUWMQoH25YwCYxi917J4pYm1nRXtdgiCdnlTkx5eRzqWEC64HtRa06WCJ9TIutpb6GmW4gFw==", "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz", + "integrity": "sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==", "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.2.tgz", + "integrity": "sha512-3y/V+vjZ19HNcTizeqwrbZSUsE69ZMRHfiiyLAJb7C7hJtYmM4Gsbajy7gKagu97E8q5rlS9k8FhojA8cpGhWw==", "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz", + "integrity": "sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==", "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.2.tgz", + "integrity": "sha512-CXBx+9fVlzSgbk0IXA/dcZn9lXixnQRndnsPC5ht3HxlQ1bVh77KQDL1GffJx1LTzzfae8ftMulsjYmO2yegxA==", "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.2.0" } }, "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.3.tgz", + "integrity": "sha512-T9pDS+P9bWeFvqivXd5ACzQmrCmHjv3ZP+djn8E1UZY7iK79pFSm7i3WbKw2VSmFmdbMm8sQ12OPcNpzBo3Z2w==", "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "cssnano-utils": "^3.0.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "requires": { - "postcss": "^7.0.2" - } + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", + "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", + "requires": {} }, "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "requires": { - "postcss": "^7.0.2" - } + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "requires": {} }, "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.3.tgz", + "integrity": "sha512-tDQ3m+GYoOar+KoQgj+pwPAvGHAp/Sby6vrFiyrELrMKQJ4AejL0NcS0mm296OKKYA2SRg9ism/hlT/OLhBrdQ==", "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" } }, "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.2.tgz", + "integrity": "sha512-CG35J1COUH7OOBgpw5O+0koOLUd5N4vUGKUqSAuIe4GiuLHWU96Pqp+UPC8QITTd12zYAFx76pV7qWT/0Aj/TA==", "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.8" } }, "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz", + "integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==", "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" } }, "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.2.tgz", + "integrity": "sha512-25HeDeFsgiPSUx69jJXZn8I06tMxLQJJNF5h7i9gsUg8iP4KOOJ8EX8fj3seeoLt3SLU2YDD6UPnDYVGUO7DEA==", "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss-value-parser": "^4.2.0" } }, "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-safe-parser": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", - "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", - "requires": { - "postcss": "^8.1.0" - }, - "dependencies": { - "postcss": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", - "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", - "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" - } - } - } - }, - "postcss-selector-matches": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "requires": {} }, "postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" + "balanced-match": "^1.0.0" } }, "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", "requires": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" } }, "postcss-svgo": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", + "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" + "postcss-value-parser": "^4.1.0", + "svgo": "^2.7.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } } } }, "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz", + "integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==", "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "prelude-ls": { "version": "1.2.1", @@ -34457,88 +27179,47 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" }, "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "requires": { "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "renderkid": "^3.0.0" } }, "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", + "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==", "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "dependencies": { "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" } } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, "promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -34547,33 +27228,23 @@ "asap": "~2.0.6" } }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "promise-polyfill": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz", - "integrity": "sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA==" - }, "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" }, "dependencies": { "react-is": { @@ -34584,19 +27255,21 @@ } }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -34608,56 +27281,16 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -34678,39 +27311,20 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -34727,29 +27341,35 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "rc": { @@ -34782,23 +27402,22 @@ } }, "react-app-polyfill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", - "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", "requires": { - "core-js": "^3.6.5", + "core-js": "^3.19.2", "object-assign": "^4.1.1", "promise": "^8.1.0", "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "whatwg-fetch": "^3.4.1" + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" } }, "react-app-rewired": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.8.tgz", - "integrity": "sha512-wjXPdKPLscA7mn0I1de1NHrbfWdXz4S1ladaGgHVKdn1hTgKK5N6EdGIJM0KrS6bKnJBj7WuqJroDTsPKKr66Q==", - "dev": true, + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.11.tgz", + "integrity": "sha512-zRIqJUPsCoPnfYtea3xgPbKR42vx0NoH5oo8R8FELXqzkjJHa39V6zD8CAdkLJoYL8V3JScWHAfKMZOzi1Ydmw==", "requires": { "semver": "^5.6.0" }, @@ -34806,61 +27425,71 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "react-dev-utils": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", + "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", "requires": { - "@babel/code-frame": "7.10.4", - "address": "1.1.2", - "browserslist": "4.14.2", - "chalk": "2.4.2", - "cross-spawn": "7.0.3", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.1.0", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "4.1.6", - "global-modules": "2.0.0", - "globby": "11.0.1", - "gzip-size": "5.1.1", - "immer": "8.0.1", - "is-root": "2.1.0", - "loader-utils": "2.0.0", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "prompts": "2.4.0", - "react-error-overlay": "^6.0.9", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.10", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@babel/highlight": "^7.10.4" + "color-convert": "^2.0.1" } }, - "browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", - "node-releases": "^1.1.61" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -34871,23 +27500,15 @@ "which": "^2.0.1" } }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } + "loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" }, "path-key": { "version": "3.1.1", @@ -34907,6 +27528,14 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -34928,9 +27557,9 @@ } }, "react-dropzone": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.3.2.tgz", - "integrity": "sha512-Z0l/YHcrNK1r85o6RT77Z5XgTARmlZZGfEKBl3tqTXL9fZNQDuIdRx/J0QjvR60X+yYu26dnHeaG2pWU+1HHvw==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.5.1.tgz", + "integrity": "sha512-eNhttdq4ZDe3eKbXAe54Opt+sbtqmNK5NWTHf/l5d+1TdZqShJ8gMjBrya00qx5zkI//TYxRhu1d9pemTgaWwg==", "requires": { "attr-accept": "^2.2.1", "file-selector": "^0.2.2", @@ -34938,161 +27567,112 @@ } }, "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", + "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" }, - "react-form-validator-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/react-form-validator-core/-/react-form-validator-core-1.1.1.tgz", - "integrity": "sha512-5SG9pKrRptrhrt/dZg0bL28VvyGeuXftfhx6qwJLNdUqs2GgEnrV07BBtGpWyoBKXmO+fplD+O70DbI03CMqUQ==", - "requires": { - "create-react-context": "^0.3.0", - "promise-polyfill": "8.1.0", - "prop-types": "^15.0.0", - "react-lifecycles-compat": "^3.0.2" - } + "react-icons": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz", + "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==", + "requires": {} }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-material-ui-form-validator": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/react-material-ui-form-validator/-/react-material-ui-form-validator-2.1.4.tgz", - "integrity": "sha512-XoZQxhtSRoHjQgIxSV8cF7q+Ep5Uwt0OtDDJELAq9/E2NSXH6Hbw/yAiw8eaDmCEaeQpKT+HbIavCtJ51GJIvw==", - "requires": { - "prop-types": "^15.0.0", - "react-form-validator-core": "1.1.1" - } - }, "react-refresh": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", - "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, "react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.1.tgz", + "integrity": "sha512-2fG0udBtxou9lXtK97eJeET2ki5//UWfQSl1rlJ7quwe6jrktK9FCCc8dQb5QY6jAv3jua8bBQRhhDOM/kVRsg==", "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "dependencies": { - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } + "history": "^5.2.0" } }, "react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.1.tgz", + "integrity": "sha512-I6Zax+/TH/cZMDpj3/4Fl2eaNdcvoxxHoH1tYOREsQ22OKDYofGebrNm6CTPUcvLvZm63NL/vzCYdjf9CUhqmA==", "requires": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "history": "^5.2.0", + "react-router": "6.2.1" } }, "react-scripts": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", - "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", + "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", "requires": { - "@babel/core": "7.12.3", - "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", - "@svgr/webpack": "5.5.0", - "@typescript-eslint/eslint-plugin": "^4.5.0", - "@typescript-eslint/parser": "^4.5.0", - "babel-eslint": "^10.1.0", - "babel-jest": "^26.6.0", - "babel-loader": "8.1.0", - "babel-plugin-named-asset-import": "^0.3.7", - "babel-preset-react-app": "^10.0.0", + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", "bfj": "^7.0.2", - "camelcase": "^6.1.0", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "4.3.0", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^7.11.0", - "eslint-config-react-app": "^6.0.0", - "eslint-plugin-flowtype": "^5.2.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jest": "^24.1.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.21.5", - "eslint-plugin-react-hooks": "^4.2.0", - "eslint-plugin-testing-library": "^3.9.2", - "eslint-webpack-plugin": "^2.5.2", - "file-loader": "6.1.1", - "fs-extra": "^9.0.1", - "fsevents": "^2.1.3", - "html-webpack-plugin": "4.5.0", - "identity-obj-proxy": "3.0.0", - "jest": "26.6.0", - "jest-circus": "26.6.0", - "jest-resolve": "26.6.0", - "jest-watch-typeahead": "0.6.1", - "mini-css-extract-plugin": "0.11.3", - "optimize-css-assets-webpack-plugin": "5.0.4", - "pnp-webpack-plugin": "1.6.4", - "postcss-flexbugs-fixes": "4.2.1", - "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "5.0.2", - "prompts": "2.4.0", - "react-app-polyfill": "^2.0.0", - "react-dev-utils": "^11.0.3", - "react-refresh": "^0.8.3", - "resolve": "1.18.1", - "resolve-url-loader": "^3.1.2", - "sass-loader": "^10.0.5", - "semver": "7.3.2", - "style-loader": "1.3.0", - "terser-webpack-plugin": "4.2.3", - "ts-pnp": "1.2.0", - "url-loader": "4.1.1", - "webpack": "4.44.2", - "webpack-dev-server": "3.11.1", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "5.1.4" + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.0", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "fsevents": "^2.3.2", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.0", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -35101,81 +27681,24 @@ } }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, "requires": { - "load-json-file": "^2.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" }, "dependencies": { "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } } } }, @@ -35190,9 +27713,9 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } @@ -35211,17 +27734,17 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.14.5", @@ -35231,45 +27754,36 @@ "@babel/runtime": "^7.8.4" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "registry-auth-token": { @@ -35296,9 +27810,9 @@ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "requires": { "jsesc": "~0.5.0" }, @@ -35315,123 +27829,16 @@ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" } }, "require-directory": { @@ -35444,23 +27851,19 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "requires": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -35483,59 +27886,30 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, "resolve-url-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", - "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", "requires": { - "adjust-sourcemap-loader": "3.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.36", - "rework": "1.0.1", - "rework-visit": "1.0.0", + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", "source-map": "0.6.1" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" } }, "source-map": { @@ -35545,6 +27919,11 @@ } } }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" + }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -35554,52 +27933,16 @@ "lowercase-keys": "^1.0.0" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -35608,53 +27951,38 @@ "glob": "^7.1.3" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "rollup": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "version": "2.66.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", + "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - } - }, - "rollup-plugin-babel": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.8.1" + "fsevents": "~2.3.2" } }, "rollup-plugin-terser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", - "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "requires": { - "@babel/code-frame": "^7.5.5", - "jest-worker": "^24.9.0", - "rollup-pluginutils": "^2.8.2", + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", "serialize-javascript": "^4.0.0", - "terser": "^4.6.2" + "terser": "^5.0.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "supports-color": "^7.0.0" } }, "serialize-javascript": { @@ -35666,35 +27994,15 @@ } }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - } - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -35703,194 +28011,28 @@ "queue-microtask": "^1.2.2" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, "sass-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", - "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", "requires": { "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "neo-async": "^2.6.2" } }, "sax": { @@ -35916,11 +28058,11 @@ } }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -35931,17 +28073,17 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", + "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", "requires": { - "node-forge": "^0.10.0" + "node-forge": "^1.2.0" } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "semver-diff": { "version": "3.1.1", @@ -35950,20 +28092,12 @@ "dev": true, "requires": { "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -35972,25 +28106,40 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "requires": { "randombytes": "^2.1.0" } @@ -36009,6 +28158,14 @@ "parseurl": "~1.3.2" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -36020,6 +28177,16 @@ "statuses": ">= 1.4.0 < 2" } }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -36028,65 +28195,26 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -36094,18 +28222,13 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "optional": true + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" }, "side-channel": { "version": "1.0.4", @@ -36118,24 +28241,9 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } - } + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "sisteransi": { "version": "1.0.5", @@ -36147,197 +28255,19 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "sockette": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/sockette/-/sockette-2.0.6.tgz", "integrity": "sha512-W6iG8RGV6Zife3Cj+FhuyHV447E6fqFM2hKmnaQrTvg3OydINV3Msj3WPFbX76blUlUxvQSMMMdrJxce8NqI5Q==" }, "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "requires": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -36351,26 +28281,24 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -36393,16 +28321,11 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -36411,21 +28334,24 @@ "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true }, "spdy": { "version": "4.0.2", @@ -36437,21 +28363,6 @@ "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "spdy-transport": { @@ -36465,29 +28376,6 @@ "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -36495,39 +28383,15 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "requires": { - "minipass": "^3.1.1" - } - }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "requires": { "escape-string-regexp": "^2.0.0" }, @@ -36544,149 +28408,24 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "string-length": { @@ -36704,38 +28443,46 @@ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + } } }, "string.prototype.matchall": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", - "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", + "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has-symbols": "^1.0.1", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.3.1", "side-channel": "^1.0.4" } }, "string.prototype.padend": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", - "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", + "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" } }, "string.prototype.trimend": { @@ -36774,31 +28521,22 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" }, "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" }, "strip-final-newline": { "version": "2.0.0", @@ -36811,48 +28549,25 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" - }, - "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } - } + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "requires": {} }, "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" } }, + "stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -36885,6 +28600,11 @@ } } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -36908,105 +28628,184 @@ "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + } + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + } } }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, - "table": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.9.tgz", - "integrity": "sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ==", + "tailwindcss": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.15.tgz", + "integrity": "sha512-bT2iy7FtjwgsXik4ZoJnHXR+SRCiGR1W95fVqpLZebr64m4ahwUwRbIAc5w5+2fzr1YF4Ct2eI7dojMRRl8sVQ==", "requires": { - "ajv": "^8.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "arg": "^5.0.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color-name": "^1.1.4", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.8", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.21.0" }, "dependencies": { - "ajv": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.5.tgz", - "integrity": "sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "color-convert": "^2.0.1" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" }, "tempy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "requires": { - "temp-dir": "^1.0.0", - "type-fest": "^0.3.1", - "unique-string": "^1.0.0" + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" }, "dependencies": { "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" } } }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -37017,13 +28816,13 @@ } }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "dependencies": { "commander": { @@ -37032,93 +28831,28 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" } } }, "terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "requires": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" + "terser": "^5.7.2" }, "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "terser": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz", - "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } } } }, @@ -37138,131 +28872,36 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "requires": { - "setimmediate": "^1.0.4" - } - }, "timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, - "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -37272,9 +28911,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "touch": { "version": "3.1.0", @@ -37303,33 +28942,22 @@ } }, "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "requires": { "punycode": "^2.1.1" } }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" - }, "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", @@ -37344,13 +28972,18 @@ "requires": { "minimist": "^1.2.0" } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "tsutils": { "version": "3.21.0", @@ -37367,29 +29000,6 @@ } } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -37404,9 +29014,9 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" }, "type-is": { "version": "1.6.18", @@ -37417,11 +29027,6 @@ "mime-types": "~2.1.24" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -37431,9 +29036,9 @@ } }, "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==" }, "unbox-primitive": { "version": "1.0.1", @@ -37447,81 +29052,41 @@ } }, "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqs": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "requires": { - "imurmurhash": "^0.1.4" - } + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "^2.0.0" } }, "universalify": { @@ -37539,69 +29104,29 @@ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } - } - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dev": true, "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, @@ -37616,9 +29141,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -37646,6 +29171,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -37665,51 +29199,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - } - } - }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - } - }, - "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -37717,27 +29206,6 @@ "dev": true, "requires": { "prepend-http": "^2.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" } }, "util-deprecate": { @@ -37769,8 +29237,7 @@ "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", @@ -37778,9 +29245,9 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "v8-to-istanbul": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz", - "integrity": "sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", "requires": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", @@ -37798,41 +29265,17 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -37850,30 +29293,20 @@ } }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "requires": { - "makeerror": "1.0.x" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" + "makeerror": "1.0.12" } }, "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "wbuf": { @@ -37890,856 +29323,223 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "5.67.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", + "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" } } }, "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } } } }, "webpack-dev-server": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", - "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", "requires": { - "ansi-html": "0.0.7", + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", + "default-gateway": "^6.0.3", + "del": "^6.0.0", "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.0", "serve-index": "^1.9.1", "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.0", + "ws": "^8.1.0" }, "dependencies": { + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isarray": { + "json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ansi-regex": "^6.0.1" } }, "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "requires": {} } } }, "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } } } }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + }, "websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -38761,6 +29561,16 @@ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "requires": { "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "whatwg-fetch": { @@ -38774,12 +29584,12 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "requires": { "lodash": "^4.7.0", - "tr46": "^2.0.2", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, @@ -38803,11 +29613,6 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -38823,222 +29628,281 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workbox-background-sync": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", - "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.4.2.tgz", + "integrity": "sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==", "requires": { - "workbox-core": "^5.1.4" + "idb": "^6.1.4", + "workbox-core": "6.4.2" } }, "workbox-broadcast-update": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", - "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.4.2.tgz", + "integrity": "sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==", "requires": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" } }, "workbox-build": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", - "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.4.2.tgz", + "integrity": "sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==", "requires": { - "@babel/core": "^7.8.4", - "@babel/preset-env": "^7.8.4", - "@babel/runtime": "^7.8.4", - "@hapi/joi": "^15.1.0", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-replace": "^2.3.1", - "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", "common-tags": "^1.8.0", "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^8.1.0", + "fs-extra": "^9.0.1", "glob": "^7.1.6", - "lodash.template": "^4.5.0", + "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", - "rollup": "^1.31.1", - "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-terser": "^5.3.1", - "source-map": "^0.7.3", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", "source-map-url": "^0.4.0", "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "tempy": "^0.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "^5.1.4", - "workbox-broadcast-update": "^5.1.4", - "workbox-cacheable-response": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-expiration": "^5.1.4", - "workbox-google-analytics": "^5.1.4", - "workbox-navigation-preload": "^5.1.4", - "workbox-precaching": "^5.1.4", - "workbox-range-requests": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4", - "workbox-streams": "^5.1.4", - "workbox-sw": "^5.1.4", - "workbox-window": "^5.1.4" + "workbox-background-sync": "6.4.2", + "workbox-broadcast-update": "6.4.2", + "workbox-cacheable-response": "6.4.2", + "workbox-core": "6.4.2", + "workbox-expiration": "6.4.2", + "workbox-google-analytics": "6.4.2", + "workbox-navigation-preload": "6.4.2", + "workbox-precaching": "6.4.2", + "workbox-range-requests": "6.4.2", + "workbox-recipes": "6.4.2", + "workbox-routing": "6.4.2", + "workbox-strategies": "6.4.2", + "workbox-streams": "6.4.2", + "workbox-sw": "6.4.2", + "workbox-window": "6.4.2" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "@apideck/better-ajv-errors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz", + "integrity": "sha512-JdEazx7qiVqTBzzBl5rolRwl5cmhihjfIcpqRzIZjtT6b18liVmDn/VlWpqW4C/qP2hrFFMLRV1wlex8ZVBPTg==", "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "requires": { - "graceful-fs": "^4.1.6" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } } } }, "workbox-cacheable-response": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", - "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.2.tgz", + "integrity": "sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==", "requires": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" } }, "workbox-core": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", - "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.2.tgz", + "integrity": "sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw==" }, "workbox-expiration": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", - "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.2.tgz", + "integrity": "sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==", "requires": { - "workbox-core": "^5.1.4" + "idb": "^6.1.4", + "workbox-core": "6.4.2" } }, "workbox-google-analytics": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", - "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.4.2.tgz", + "integrity": "sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==", "requires": { - "workbox-background-sync": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4" + "workbox-background-sync": "6.4.2", + "workbox-core": "6.4.2", + "workbox-routing": "6.4.2", + "workbox-strategies": "6.4.2" } }, "workbox-navigation-preload": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", - "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.4.2.tgz", + "integrity": "sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==", "requires": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" } }, "workbox-precaching": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", - "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.2.tgz", + "integrity": "sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==", "requires": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2", + "workbox-routing": "6.4.2", + "workbox-strategies": "6.4.2" } }, "workbox-range-requests": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", - "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.4.2.tgz", + "integrity": "sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==", "requires": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" + } + }, + "workbox-recipes": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.4.2.tgz", + "integrity": "sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==", + "requires": { + "workbox-cacheable-response": "6.4.2", + "workbox-core": "6.4.2", + "workbox-expiration": "6.4.2", + "workbox-precaching": "6.4.2", + "workbox-routing": "6.4.2", + "workbox-strategies": "6.4.2" } }, "workbox-routing": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", - "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.2.tgz", + "integrity": "sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==", "requires": { - "workbox-core": "^5.1.4" + "workbox-core": "6.4.2" } }, "workbox-strategies": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", - "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.2.tgz", + "integrity": "sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==", "requires": { - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4" + "workbox-core": "6.4.2" } }, "workbox-streams": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", - "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.4.2.tgz", + "integrity": "sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==", "requires": { - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4" + "workbox-core": "6.4.2", + "workbox-routing": "6.4.2" } }, "workbox-sw": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", - "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.4.2.tgz", + "integrity": "sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg==" }, "workbox-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.4.2.tgz", + "integrity": "sha512-CiEwM6kaJRkx1cP5xHksn13abTzUqMHiMMlp5Eh/v4wRcedgDTyv6Uo8+Hg9MurRbHDosO5suaPyF9uwVr4/CQ==", "requires": { - "@babel/runtime": "^7.5.5", - "fast-json-stable-stringify": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", "source-map-url": "^0.4.0", - "upath": "^1.1.2", - "webpack-sources": "^1.3.0", - "workbox-build": "^5.1.4" + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } } }, "workbox-window": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", - "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.4.2.tgz", + "integrity": "sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==", "requires": { - "workbox-core": "^5.1.4" - } - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "requires": { - "errno": "~0.1.7" - } - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "requires": { - "microevent.ts": "~0.1.1" + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.4.2" } }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -39085,9 +29949,9 @@ } }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", "requires": {} }, "xdg-basedir": { @@ -39112,9 +29976,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -39127,48 +29991,28 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - } - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - }, - "zlib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=" } } } diff --git a/interface/package.json b/interface/package.json index abd7f4a96..9bc70ba47 100644 --- a/interface/package.json +++ b/interface/package.json @@ -1,41 +1,41 @@ { - "name": "emsesp-react", - "version": "0.1.0", + "name": "EMS-ESP", + "version": "3.4.0", "private": true, + "proxy": "http://localhost:3080", "dependencies": { - "@material-ui/core": "^4.12.3", - "@material-ui/icons": "^4.11.2", - "@msgpack/msgpack": "^2.7.0", - "@types/lodash": "^4.14.172", - "@types/node": "^12.20.20", - "@types/react": "^17.0.19", - "@types/react-dom": "^17.0.9", - "@types/react-material-ui-form-validator": "^2.1.0", - "@types/react-router": "^5.1.13", - "@types/react-router-dom": "^5.1.7", - "compression-webpack-plugin": "^5.0.2", - "env-cmd": "^10.1.0", - "express": "^4.17.1", + "@emotion/react": "^11.7.1", + "@emotion/styled": "^11.6.0", + "@msgpack/msgpack": "^2.7.1", + "@mui/icons-material": "^5.3.0", + "@mui/material": "^5.3.0", + "@types/lodash": "^4.14.178", + "@types/node": "^17.0.10", + "@types/react": "^17.0.38", + "@types/react-dom": "^17.0.11", + "@types/react-router-dom": "^5.3.3", + "async-validator": "^4.0.7", + "axios": "^0.25.0", + "http-proxy-middleware": "^2.0.1", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", - "mime-types": "^2.1.30", - "notistack": "^1.0.6", + "notistack": "^2.0.3", "parse-ms": "^3.0.0", "react": "^17.0.2", + "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^11.3.2", - "react-form-validator-core": "^1.1.1", - "react-material-ui-form-validator": "^2.1.4", - "react-router": "^5.2.0", - "react-router-dom": "^5.2.0", - "react-scripts": "4.0.3", + "react-dropzone": "^11.5.1", + "react-icons": "^4.3.1", + "react-router-dom": "^6.2.1", + "react-scripts": "5.0.0", "sockette": "^2.0.6", - "typescript": "4.3.5", - "zlib": "^1.0.5" + "typescript": "^4.5.5" }, "scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", + "test": "react-app-rewired test", + "eject": "react-scripts eject", "format": "prettier --write '**/*.{ts,tsx,js,css,json,md}'", "build-hosted": "env-cmd -f .env.hosted npm run build", "build-localhost": "PUBLIC_URL=/ react-app-rewired build", @@ -44,7 +44,44 @@ "lint": "eslint . --ext .ts,.tsx" }, "eslintConfig": { - "extends": "react-app" + "extends": [ + "react-app", + "react-app/jest" + ], + "rules": { + "eol-last": 1, + "react/jsx-closing-bracket-location": 1, + "react/jsx-closing-tag-location": 1, + "react/jsx-wrap-multilines": 1, + "react/jsx-curly-newline": 1, + "no-multiple-empty-lines": [ + 1, + { + "max": 1 + } + ], + "no-trailing-spaces": 1, + "semi": 1, + "no-extra-semi": 1, + "react/jsx-max-props-per-line": [ + 1, + { + "when": "multiline" + } + ], + "react/jsx-first-prop-new-line": [ + 1, + "multiline" + ], + "@typescript-eslint/no-shadow": 1, + "max-len": [ + 1, + { + "code": 150 + } + ], + "arrow-parens": 1 + } }, "browserslist": { "production": [ @@ -59,13 +96,7 @@ ] }, "devDependencies": { - "concurrently": "^6.0.1", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^3.4.0", - "http-proxy-middleware": "^1.1.1", - "nodemon": "^2.0.7", - "npm-run-all": "^4.1.5", - "prettier": "^2.0.5", - "react-app-rewired": "^2.1.8" + "nodemon": "^2.0.15", + "npm-run-all": "^4.1.5" } } diff --git a/interface/progmem-generator.js b/interface/progmem-generator.js index ef8855962..807fa4fd8 100644 --- a/interface/progmem-generator.js +++ b/interface/progmem-generator.js @@ -1,11 +1,5 @@ const { resolve, relative, sep } = require('path'); -const { - readdirSync, - existsSync, - unlinkSync, - readFileSync, - createWriteStream -} = require('fs'); +const { readdirSync, existsSync, unlinkSync, readFileSync, createWriteStream } = require('fs'); var zlib = require('zlib'); var mime = require('mime-types'); @@ -36,112 +30,91 @@ function cleanAndOpen(path) { class ProgmemGenerator { constructor(options = {}) { - const { - outputPath, - bytesPerLine = 20, - indent = ' ', - includes = ARDUINO_INCLUDES - } = options; + const { outputPath, bytesPerLine = 20, indent = ' ', includes = ARDUINO_INCLUDES } = options; this.options = { outputPath, bytesPerLine, indent, includes }; } apply(compiler) { - compiler.hooks.emit.tapAsync( - { name: 'ProgmemGenerator' }, - (compilation, callback) => { - const { outputPath, bytesPerLine, indent, includes } = this.options; - const fileInfo = []; - const writeStream = cleanAndOpen( - resolve(compilation.options.context, outputPath) - ); - try { - const writeIncludes = () => { - writeStream.write(includes); - }; + compiler.hooks.emit.tapAsync({ name: 'ProgmemGenerator' }, (compilation, callback) => { + const { outputPath, bytesPerLine, indent, includes } = this.options; + const fileInfo = []; + const writeStream = cleanAndOpen(resolve(compilation.options.context, outputPath)); + try { + const writeIncludes = () => { + writeStream.write(includes); + }; - const writeFile = (relativeFilePath, buffer) => { - const variable = 'ESP_REACT_DATA_' + fileInfo.length; - const mimeType = mime.lookup(relativeFilePath); - var size = 0; - writeStream.write('const uint8_t ' + variable + '[] PROGMEM = {'); - const zipBuffer = zlib.gzipSync(buffer); - zipBuffer.forEach((b) => { - if (!(size % bytesPerLine)) { - writeStream.write('\n'); - writeStream.write(indent); - } - writeStream.write( - '0x' + ('00' + b.toString(16).toUpperCase()).substr(-2) + ',' - ); - size++; - }); - if (size % bytesPerLine) { + const writeFile = (relativeFilePath, buffer) => { + const variable = 'ESP_REACT_DATA_' + fileInfo.length; + const mimeType = mime.lookup(relativeFilePath); + var size = 0; + writeStream.write('const uint8_t ' + variable + '[] PROGMEM = {'); + const zipBuffer = zlib.gzipSync(buffer); + zipBuffer.forEach((b) => { + if (!(size % bytesPerLine)) { writeStream.write('\n'); + writeStream.write(indent); } - writeStream.write('};\n\n'); - fileInfo.push({ - uri: '/' + relativeFilePath.replace(sep, '/'), - mimeType, - variable, - size - }); - }; + writeStream.write('0x' + ('00' + b.toString(16).toUpperCase()).substr(-2) + ','); + size++; + }); + if (size % bytesPerLine) { + writeStream.write('\n'); + } + writeStream.write('};\n\n'); + fileInfo.push({ + uri: '/' + relativeFilePath.replace(sep, '/'), + mimeType, + variable, + size + }); + }; - const writeFiles = () => { - // process static files - const buildPath = compilation.options.output.path; - for (const filePath of getFilesSync(buildPath)) { - const readStream = readFileSync(filePath); - const relativeFilePath = relative(buildPath, filePath); - writeFile(relativeFilePath, readStream); - } - // process assets - const { assets } = compilation; - Object.keys(assets).forEach((relativeFilePath) => { - writeFile( - relativeFilePath, - coherseToBuffer(assets[relativeFilePath].source()) - ); - }); - }; + const writeFiles = () => { + // process static files + const buildPath = compilation.options.output.path; + for (const filePath of getFilesSync(buildPath)) { + const readStream = readFileSync(filePath); + const relativeFilePath = relative(buildPath, filePath); + writeFile(relativeFilePath, readStream); + } + // process assets + const { assets } = compilation; + Object.keys(assets).forEach((relativeFilePath) => { + writeFile(relativeFilePath, coherseToBuffer(assets[relativeFilePath].source())); + }); + }; - const generateWWWClass = () => { - return `typedef std::function RouteRegistrationHandler; + const generateWWWClass = () => { + // eslint-disable-next-line max-len + return `typedef std::function RouteRegistrationHandler; class WWWData { ${indent}public: -${indent.repeat( - 2 -)}static void registerRoutes(RouteRegistrationHandler handler) { +${indent.repeat(2)}static void registerRoutes(RouteRegistrationHandler handler) { ${fileInfo - .map( - (file) => - `${indent.repeat(3)}handler("${file.uri}", "${file.mimeType}", ${ - file.variable - }, ${file.size});` - ) + .map((file) => `${indent.repeat(3)}handler("${file.uri}", "${file.mimeType}", ${file.variable}, ${file.size});`) .join('\n')} ${indent.repeat(2)}} }; `; - }; + }; - const writeWWWClass = () => { - writeStream.write(generateWWWClass()); - }; + const writeWWWClass = () => { + writeStream.write(generateWWWClass()); + }; - writeIncludes(); - writeFiles(); - writeWWWClass(); + writeIncludes(); + writeFiles(); + writeWWWClass(); - writeStream.on('finish', () => { - callback(); - }); - } finally { - writeStream.end(); - } + writeStream.on('finish', () => { + callback(); + }); + } finally { + writeStream.end(); } - ); + }); } } diff --git a/interface/public/css/roboto.css b/interface/public/css/roboto.css index 3214d4c6e..3a747ac5e 100644 --- a/interface/public/css/roboto.css +++ b/interface/public/css/roboto.css @@ -1,28 +1,24 @@ -/* Just supporting latin due to size constrains on the esp chip */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), - url(../fonts/li.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2212, U+2215; -} +/* +* Just supporting latin due to size constrains on the esp chip +* +* The framework only makes use of 400 (regular) + 500 (medium) weight fonts. +* +* If using light or strong typography variants you will need to add additional fonts. +*/ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), - url(../fonts/re.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2212, U+2215; + src: local('Roboto'), local('Roboto-Regular'), url(../fonts/re.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, + U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } + @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), - url(../fonts/me.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, - U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2212, U+2215; + src: local('Roboto Medium'), local('Roboto-Medium'), url(../fonts/md.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, + U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } diff --git a/interface/public/fonts/li.woff2 b/interface/public/fonts/li.woff2 deleted file mode 100644 index 52c5845a7c3803f313d8905ee2f83ac20a5bc9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15440 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 SYT_{{QN5GB$em6A0000dHT^mO literal 0 HcmV?d00001 diff --git a/interface/public/fonts/me.woff2 b/interface/public/fonts/me.woff2 deleted file mode 100644 index 8dceabcf6bdfdb0f09be31878c1ebfdd0be943ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15552 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 O6y7R}gQBj@I4BA`2c0zl diff --git a/interface/public/index.html b/interface/public/index.html index 766f129fd..e7ffd2d20 100644 --- a/interface/public/index.html +++ b/interface/public/index.html @@ -1,16 +1,17 @@ - - - - + + + + EMS-ESP - +
diff --git a/interface/src/App.tsx b/interface/src/App.tsx index 4a9d277f7..6427f07f9 100644 --- a/interface/src/App.tsx +++ b/interface/src/App.tsx @@ -1,57 +1,45 @@ -import React, { Component, RefObject } from 'react'; -import { Redirect, Route, Switch } from 'react-router'; +import { FC, createRef, createContext, useContext, RefObject } from 'react'; import { SnackbarProvider } from 'notistack'; -import { IconButton } from '@material-ui/core'; -import CloseIcon from '@material-ui/icons/Close'; +import { IconButton } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import { FeaturesLoader } from './contexts/features'; + +import CustomTheme from './CustomTheme'; import AppRouting from './AppRouting'; -import CustomMuiTheme from './CustomMuiTheme'; -import { PROJECT_NAME } from './api'; -import FeaturesWrapper from './features/FeaturesWrapper'; -// this redirect forces a call to authenticationContext.refresh() which invalidates the JWT if it is invalid. -const unauthorizedRedirect = () => ; +const App: FC = () => { + const notistackRef: RefObject = createRef(); -class App extends Component { - notistackRef: RefObject = React.createRef(); - - componentDidMount() { - document.title = PROJECT_NAME; - } - - onClickDismiss = (key: string | number | undefined) => () => { - this.notistackRef.current.closeSnackbar(key); + const onClickDismiss = (key: string | number | undefined) => () => { + notistackRef.current.closeSnackbar(key); }; - render() { - return ( - + const ColorModeContext = createContext({ toggleColorMode: () => {} }); + + const colorMode = useContext(ColorModeContext); + + return ( + + ( - + )} > - - - - - - + + + - - ); - } -} + + + ); +}; export default App; diff --git a/interface/src/AppRouting.tsx b/interface/src/AppRouting.tsx index c10881ab8..4017d9d14 100644 --- a/interface/src/AppRouting.tsx +++ b/interface/src/AppRouting.tsx @@ -1,67 +1,77 @@ -import React, { Component } from 'react'; -import { Switch, Redirect } from 'react-router'; +import { FC, useContext, useEffect } from 'react'; +import { Navigate, Routes, Route, useLocation } from 'react-router-dom'; +import { useSnackbar, VariantType } from 'notistack'; -import * as Authentication from './authentication/Authentication'; -import AuthenticationWrapper from './authentication/AuthenticationWrapper'; -import UnauthenticatedRoute from './authentication/UnauthenticatedRoute'; -import AuthenticatedRoute from './authentication/AuthenticatedRoute'; +import { Authentication, AuthenticationContext } from './contexts/authentication'; +import { FeaturesContext } from './contexts/features'; +import { RequireAuthenticated, RequireUnauthenticated } from './components'; import SignIn from './SignIn'; -import ProjectRouting from './project/ProjectRouting'; -import NetworkConnection from './network/NetworkConnection'; -import AccessPoint from './ap/AccessPoint'; -import NetworkTime from './ntp/NetworkTime'; -import Security from './security/Security'; -import System from './system/System'; +import AuthenticatedRouting from './AuthenticatedRouting'; -import { PROJECT_PATH } from './api'; -import Mqtt from './mqtt/Mqtt'; -import { withFeatures, WithFeaturesProps } from './features/FeaturesContext'; -import { Features } from './features/types'; - -export const getDefaultRoute = (features: Features) => - features.project ? `/${PROJECT_PATH}/` : '/network/'; -class AppRouting extends Component { - componentDidMount() { - Authentication.clearLoginRedirect(); - } - - render() { - const { features } = this.props; - return ( - - - {features.security && ( - - )} - {features.project && ( - - )} - - - {features.ntp && ( - - )} - {features.mqtt && ( - - )} - {features.security && ( - - )} - - - - - ); - } +interface SecurityRedirectProps { + message: string; + variant?: VariantType; + signOut?: boolean; } -export default withFeatures(AppRouting); +const RootRedirect: FC = ({ message, variant, signOut }) => { + const authenticationContext = useContext(AuthenticationContext); + const { enqueueSnackbar } = useSnackbar(); + useEffect(() => { + signOut && authenticationContext.signOut(false); + enqueueSnackbar(message, { variant }); + }, [message, variant, signOut, authenticationContext, enqueueSnackbar]); + return ; +}; + +export const RemoveTrailingSlashes = () => { + const location = useLocation(); + return ( + location.pathname.match('/.*/$') && ( + + ) + ); +}; + +const AppRouting: FC = () => { + const { features } = useContext(FeaturesContext); + + return ( + + + + } /> + } + /> + {features.security && ( + + + + } + /> + )} + + + + } + /> + + + ); +}; + +export default AppRouting; diff --git a/interface/src/AuthenticatedRouting.tsx b/interface/src/AuthenticatedRouting.tsx new file mode 100644 index 000000000..0b6ecf392 --- /dev/null +++ b/interface/src/AuthenticatedRouting.tsx @@ -0,0 +1,66 @@ +import { FC, useCallback, useContext, useEffect } from 'react'; +import { Navigate, Routes, Route, useNavigate, useLocation } from 'react-router-dom'; +import { AxiosError } from 'axios'; + +import { FeaturesContext } from './contexts/features'; +import * as AuthenticationApi from './api/authentication'; +import { PROJECT_PATH } from './api/env'; +import { AXIOS } from './api/endpoints'; +import { Layout, RequireAdmin } from './components'; + +import ProjectRouting from './project/ProjectRouting'; + +import NetworkConnection from './framework/network/NetworkConnection'; +import AccessPoint from './framework/ap/AccessPoint'; +import NetworkTime from './framework/ntp/NetworkTime'; +import Mqtt from './framework/mqtt/Mqtt'; +import System from './framework/system/System'; +import Security from './framework/security/Security'; + +const AuthenticatedRouting: FC = () => { + const { features } = useContext(FeaturesContext); + const location = useLocation(); + const navigate = useNavigate(); + + const handleApiResponseError = useCallback( + (error: AxiosError) => { + if (error.response && error.response.status === 401) { + AuthenticationApi.storeLoginRedirect(location); + navigate('/unauthorized'); + } + return Promise.reject(error); + }, + [location, navigate] + ); + + useEffect(() => { + const axiosHandlerId = AXIOS.interceptors.response.use((response) => response, handleApiResponseError); + return () => AXIOS.interceptors.response.eject(axiosHandlerId); + }, [handleApiResponseError]); + + return ( + + + {features.project && } />} + } /> + } /> + {features.ntp && } />} + {features.mqtt && } />} + {features.security && ( + + + + } + /> + )} + } /> + } /> + + + ); +}; + +export default AuthenticatedRouting; diff --git a/interface/src/CustomMuiTheme.tsx b/interface/src/CustomMuiTheme.tsx deleted file mode 100644 index cb6186e9e..000000000 --- a/interface/src/CustomMuiTheme.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { Component } from 'react'; - -import { CssBaseline } from '@material-ui/core'; -import { - MuiThemeProvider, - createTheme, - StylesProvider -} from '@material-ui/core/styles'; -import { blueGrey, orange, red, green } from '@material-ui/core/colors'; - -const theme = createTheme({ - palette: { - type: 'dark', - primary: { - main: '#33bfff' - }, - secondary: { - main: '#3d5afe' - }, - info: { - main: blueGrey[500] - }, - warning: { - main: orange[500] - }, - error: { - main: red[500] - }, - success: { - main: green[500] - } - } -}); - -export default class CustomMuiTheme extends Component { - render() { - return ( - - - - {this.props.children} - - - ); - } -} diff --git a/interface/src/CustomTheme.tsx b/interface/src/CustomTheme.tsx new file mode 100644 index 000000000..6e04783c2 --- /dev/null +++ b/interface/src/CustomTheme.tsx @@ -0,0 +1,47 @@ +import { FC } from 'react'; + +import { CssBaseline } from '@mui/material'; +import { createTheme, responsiveFontSizes, ThemeProvider } from '@mui/material/styles'; +import { blueGrey, blue } from '@mui/material/colors'; + +const theme = responsiveFontSizes( + createTheme({ + typography: { + fontSize: 13 + }, + palette: { + mode: 'dark', + // background: { + // default: grey[900], // #212121 + // // paper: grey[800] + // }, + // primary: { + // main: '#33bfff' + // }, + secondary: { + main: blue[500] // in buttons + }, + info: { + main: blueGrey[500] // used in icons + } + // warning: { + // main: orange[500] + // }, + // error: { + // main: red[200] + // }, + // success: { + // main: green[700] + // } + } + }) +); + +const CustomTheme: FC = ({ children }) => ( + + + {children} + +); + +export default CustomTheme; diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx index 90cdb4a52..602c44588 100644 --- a/interface/src/SignIn.tsx +++ b/interface/src/SignIn.tsx @@ -1,165 +1,113 @@ -import React, { Component } from 'react'; -import { withSnackbar, WithSnackbarProps } from 'notistack'; -import { TextValidator, ValidatorForm } from 'react-material-ui-form-validator'; +import { FC, useContext, useState } from 'react'; +import { ValidateFieldsError } from 'async-validator'; +import { useSnackbar } from 'notistack'; -import { - withStyles, - createStyles, - Theme, - WithStyles -} from '@material-ui/core/styles'; -import { Paper, Typography, Fab } from '@material-ui/core'; -import ForwardIcon from '@material-ui/icons/Forward'; +import { Box, Fab, Paper, Typography } from '@mui/material'; +import ForwardIcon from '@mui/icons-material/Forward'; -import { - withAuthenticationContext, - AuthenticationContextProps -} from './authentication/AuthenticationContext'; -import { PasswordValidator } from './components'; -import { PROJECT_NAME, SIGN_IN_ENDPOINT } from './api'; +import * as AuthenticationApi from './api/authentication'; +import { PROJECT_NAME } from './api/env'; +import { AuthenticationContext } from './contexts/authentication'; -const styles = (theme: Theme) => - createStyles({ - signInPage: { - display: 'flex', - height: '100vh', - margin: 'auto', - padding: theme.spacing(2), - justifyContent: 'center', - flexDirection: 'column', - maxWidth: theme.breakpoints.values.sm - }, - signInPanel: { - textAlign: 'center', - padding: theme.spacing(2), - paddingTop: '200px', - backgroundImage: 'url("/app/icon.png")', - backgroundRepeat: 'no-repeat', - backgroundPosition: '50% ' + theme.spacing(2) + 'px', - backgroundSize: 'auto 150px', - width: '100%' - }, - extendedIcon: { - marginRight: theme.spacing(0.5) - }, - button: { - marginRight: theme.spacing(2), - marginTop: theme.spacing(2) - } +import { extractErrorMessage, onEnterCallback, updateValue } from './utils'; +import { SignInRequest } from './types'; +import { ValidatedTextField } from './components'; +import { SIGN_IN_REQUEST_VALIDATOR, validate } from './validators'; + +const SignIn: FC = () => { + const authenticationContext = useContext(AuthenticationContext); + const { enqueueSnackbar } = useSnackbar(); + + const [signInRequest, setSignInRequest] = useState({ + username: '', + password: '' }); + const [processing, setProcessing] = useState(false); + const [fieldErrors, setFieldErrors] = useState(); -type SignInProps = WithSnackbarProps & - WithStyles & - AuthenticationContextProps; + const updateLoginRequestValue = updateValue(setSignInRequest); -interface SignInState { - username: string; - password: string; - processing: boolean; -} - -class SignIn extends Component { - constructor(props: SignInProps) { - super(props); - this.state = { - username: '', - password: '', - processing: false - }; - } - - updateInputElement = (event: React.ChangeEvent): void => { - const { name, value } = event.currentTarget; - this.setState((prevState) => ({ - ...prevState, - [name]: value - })); + const validateAndSignIn = async () => { + setProcessing(true); + try { + await validate(SIGN_IN_REQUEST_VALIDATOR, signInRequest); + signIn(); + } catch (errors: any) { + setFieldErrors(errors); + setProcessing(false); + } }; - onSubmit = () => { - const { username, password } = this.state; - const { authenticationContext } = this.props; - this.setState({ processing: true }); - fetch(SIGN_IN_ENDPOINT, { - method: 'POST', - body: JSON.stringify({ username, password }), - headers: new Headers({ - 'Content-Type': 'application/json' - }) - }) - .then((response) => { - if (response.status === 200) { - return response.json(); - } else if (response.status === 401) { - throw Error('Invalid credentials.'); - } else { - throw Error('Invalid status code: ' + response.status); - } - }) - .then((json) => { - authenticationContext.signIn(json.access_token); - }) - .catch((error) => { - this.props.enqueueSnackbar(error.message, { - variant: 'warning' - }); - this.setState({ processing: false }); - }); + const signIn = async () => { + try { + const { data: loginResponse } = await AuthenticationApi.signIn(signInRequest); + authenticationContext.signIn(loginResponse.access_token); + } catch (error: any) { + if (error.response?.status === 401) { + enqueueSnackbar('Invalid login details', { variant: 'warning' }); + } else { + enqueueSnackbar(extractErrorMessage(error, 'Unexpected error, please try again'), { variant: 'error' }); + } + setProcessing(false); + } }; - render() { - const { username, password, processing } = this.state; - const { classes } = this.props; - return ( -
- - {PROJECT_NAME} - - - - - - Sign In - - - -
- ); - } -} + const submitOnEnter = onEnterCallback(signIn); -export default withAuthenticationContext( - withSnackbar(withStyles(styles)(SignIn)) -); + return ( + theme.breakpoints.values.sm} + > + ({ + textAlign: 'center', + padding: theme.spacing(2), + paddingTop: '200px', + backgroundImage: 'url("/app/icon.png")', + backgroundRepeat: 'no-repeat', + backgroundPosition: '50% ' + theme.spacing(2), + backgroundSize: 'auto 150px', + width: '100%' + })} + > + {PROJECT_NAME} + + + + + Sign In + + + + ); +}; + +export default SignIn; diff --git a/interface/src/ap/APModes.ts b/interface/src/ap/APModes.ts deleted file mode 100644 index e89818668..000000000 --- a/interface/src/ap/APModes.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { APSettings, APProvisionMode } from './types'; - -export const isAPEnabled = ({ provision_mode }: APSettings) => { - return ( - provision_mode === APProvisionMode.AP_MODE_ALWAYS || - provision_mode === APProvisionMode.AP_MODE_DISCONNECTED - ); -}; diff --git a/interface/src/ap/APSettingsController.tsx b/interface/src/ap/APSettingsController.tsx deleted file mode 100644 index 1a93050ba..000000000 --- a/interface/src/ap/APSettingsController.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Component } from 'react'; - -import { AP_SETTINGS_ENDPOINT } from '../api'; -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; - -import APSettingsForm from './APSettingsForm'; -import { APSettings } from './types'; - -type APSettingsControllerProps = RestControllerProps; - -class APSettingsController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(AP_SETTINGS_ENDPOINT, APSettingsController); diff --git a/interface/src/ap/APSettingsForm.tsx b/interface/src/ap/APSettingsForm.tsx deleted file mode 100644 index df871a291..000000000 --- a/interface/src/ap/APSettingsForm.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import React, { Fragment } from 'react'; -import { - TextValidator, - ValidatorForm, - SelectValidator -} from 'react-material-ui-form-validator'; - -import MenuItem from '@material-ui/core/MenuItem'; -import SaveIcon from '@material-ui/icons/Save'; - -import { - PasswordValidator, - RestFormProps, - FormActions, - FormButton -} from '../components'; - -import { isAPEnabled } from './APModes'; -import { APSettings, APProvisionMode } from './types'; -import { isIP } from '../validators'; - -type APSettingsFormProps = RestFormProps; - -class APSettingsForm extends React.Component { - componentDidMount() { - ValidatorForm.addValidationRule('isIP', isIP); - } - - render() { - const { data, handleValueChange, saveData } = this.props; - return ( - - - Always - - When Network Disconnected - - Never - - {isAPEnabled(data) && ( - - - - - - - - )} - - } - variant="contained" - color="primary" - type="submit" - > - Save - - - - ); - } -} - -export default APSettingsForm; diff --git a/interface/src/ap/APStatus.ts b/interface/src/ap/APStatus.ts deleted file mode 100644 index 5a0a13eec..000000000 --- a/interface/src/ap/APStatus.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Theme } from '@material-ui/core'; -import { APStatus, APNetworkStatus } from './types'; - -export const apStatusHighlight = ({ status }: APStatus, theme: Theme) => { - switch (status) { - case APNetworkStatus.ACTIVE: - return theme.palette.success.main; - case APNetworkStatus.INACTIVE: - return theme.palette.info.main; - case APNetworkStatus.LINGERING: - return theme.palette.warning.main; - default: - return theme.palette.warning.main; - } -}; - -export const apStatus = ({ status }: APStatus) => { - switch (status) { - case APNetworkStatus.ACTIVE: - return 'Active'; - case APNetworkStatus.INACTIVE: - return 'Inactive'; - case APNetworkStatus.LINGERING: - return 'Lingering until idle'; - default: - return 'Unknown'; - } -}; diff --git a/interface/src/ap/APStatusController.tsx b/interface/src/ap/APStatusController.tsx deleted file mode 100644 index 5b817d4de..000000000 --- a/interface/src/ap/APStatusController.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { AP_STATUS_ENDPOINT } from '../api'; - -import APStatusForm from './APStatusForm'; -import { APStatus } from './types'; - -type APStatusControllerProps = RestControllerProps; - -class APStatusController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(AP_STATUS_ENDPOINT, APStatusController); diff --git a/interface/src/ap/APStatusForm.tsx b/interface/src/ap/APStatusForm.tsx deleted file mode 100644 index 39e6c914a..000000000 --- a/interface/src/ap/APStatusForm.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import React, { Component, Fragment } from 'react'; - -import { WithTheme, withTheme } from '@material-ui/core/styles'; -import { - Avatar, - Divider, - List, - ListItem, - ListItemAvatar, - ListItemText -} from '@material-ui/core'; - -import SettingsInputAntennaIcon from '@material-ui/icons/SettingsInputAntenna'; -import DeviceHubIcon from '@material-ui/icons/DeviceHub'; -import ComputerIcon from '@material-ui/icons/Computer'; -import RefreshIcon from '@material-ui/icons/Refresh'; - -import { - RestFormProps, - FormActions, - FormButton, - HighlightAvatar -} from '../components'; -import { apStatusHighlight, apStatus } from './APStatus'; -import { APStatus } from './types'; - -type APStatusFormProps = RestFormProps & WithTheme; - -class APStatusForm extends Component { - createListItems() { - const { data, theme } = this.props; - return ( - - - - - - - - - - - - - IP - - - - - - - - - - - - - - - - - - - - - - - - ); - } - - render() { - return ( - - {this.createListItems()} - - } - variant="contained" - color="secondary" - onClick={this.props.loadData} - > - Refresh - - - - ); - } -} - -export default withTheme(APStatusForm); diff --git a/interface/src/ap/AccessPoint.tsx b/interface/src/ap/AccessPoint.tsx deleted file mode 100644 index f1b3b0ab0..000000000 --- a/interface/src/ap/AccessPoint.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom'; - -import { Tabs, Tab } from '@material-ui/core'; - -import { - AuthenticatedContextProps, - withAuthenticatedContext, - AuthenticatedRoute -} from '../authentication'; -import { MenuAppBar } from '../components'; - -import APSettingsController from './APSettingsController'; -import APStatusController from './APStatusController'; - -type AccessPointProps = AuthenticatedContextProps & RouteComponentProps; - -class AccessPoint extends Component { - handleTabChange = (path: string) => { - this.props.history.push(path); - }; - - render() { - const { authenticatedContext } = this.props; - return ( - - this.handleTabChange(path)} - variant="fullWidth" - > - - - - - - - - - - ); - } -} - -export default withAuthenticatedContext(AccessPoint); diff --git a/interface/src/api/Endpoints.ts b/interface/src/api/Endpoints.ts deleted file mode 100644 index 4264000d5..000000000 --- a/interface/src/api/Endpoints.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ENDPOINT_ROOT } from './Env'; - -export const FEATURES_ENDPOINT = ENDPOINT_ROOT + 'features'; -export const NTP_STATUS_ENDPOINT = ENDPOINT_ROOT + 'ntpStatus'; -export const NTP_SETTINGS_ENDPOINT = ENDPOINT_ROOT + 'ntpSettings'; -export const TIME_ENDPOINT = ENDPOINT_ROOT + 'time'; -export const AP_SETTINGS_ENDPOINT = ENDPOINT_ROOT + 'apSettings'; -export const AP_STATUS_ENDPOINT = ENDPOINT_ROOT + 'apStatus'; -export const SCAN_NETWORKS_ENDPOINT = ENDPOINT_ROOT + 'scanNetworks'; -export const LIST_NETWORKS_ENDPOINT = ENDPOINT_ROOT + 'listNetworks'; -export const NETWORK_SETTINGS_ENDPOINT = ENDPOINT_ROOT + 'networkSettings'; -export const NETWORK_STATUS_ENDPOINT = ENDPOINT_ROOT + 'networkStatus'; -export const OTA_SETTINGS_ENDPOINT = ENDPOINT_ROOT + 'otaSettings'; -export const UPLOAD_FIRMWARE_ENDPOINT = ENDPOINT_ROOT + 'uploadFirmware'; -export const MQTT_SETTINGS_ENDPOINT = ENDPOINT_ROOT + 'mqttSettings'; -export const MQTT_STATUS_ENDPOINT = ENDPOINT_ROOT + 'mqttStatus'; -export const SYSTEM_STATUS_ENDPOINT = ENDPOINT_ROOT + 'systemStatus'; -export const SIGN_IN_ENDPOINT = ENDPOINT_ROOT + 'signIn'; -export const VERIFY_AUTHORIZATION_ENDPOINT = - ENDPOINT_ROOT + 'verifyAuthorization'; -export const SECURITY_SETTINGS_ENDPOINT = ENDPOINT_ROOT + 'securitySettings'; -export const GENERATE_TOKEN_ENDPOINT = ENDPOINT_ROOT + 'generateToken'; -export const RESTART_ENDPOINT = ENDPOINT_ROOT + 'restart'; -export const FACTORY_RESET_ENDPOINT = ENDPOINT_ROOT + 'factoryReset'; diff --git a/interface/src/api/Env.ts b/interface/src/api/Env.ts deleted file mode 100644 index 16d361cf3..000000000 --- a/interface/src/api/Env.ts +++ /dev/null @@ -1,26 +0,0 @@ -export const PROJECT_NAME = process.env.REACT_APP_PROJECT_NAME!; -export const PROJECT_PATH = process.env.REACT_APP_PROJECT_PATH!; - -export const ENDPOINT_ROOT = calculateEndpointRoot('/rest/'); -export const WEB_SOCKET_ROOT = calculateWebSocketRoot('/ws/'); -export const EVENT_SOURCE_ROOT = calculateEndpointRoot('/es/'); -export const API_ENDPOINT_ROOT = calculateEndpointRoot('/api/'); - -function calculateEndpointRoot(endpointPath: string) { - const httpRoot = process.env.REACT_APP_HTTP_ROOT; - if (httpRoot) { - return httpRoot + endpointPath; - } - const location = window.location; - return location.protocol + '//' + location.host + endpointPath; -} - -function calculateWebSocketRoot(webSocketPath: string) { - const webSocketRoot = process.env.REACT_APP_WEB_SOCKET_ROOT; - if (webSocketRoot) { - return webSocketRoot + webSocketPath; - } - const location = window.location; - const webProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; - return webProtocol + '//' + location.host + webSocketPath; -} diff --git a/interface/src/api/ap.ts b/interface/src/api/ap.ts new file mode 100644 index 000000000..b750df0d1 --- /dev/null +++ b/interface/src/api/ap.ts @@ -0,0 +1,16 @@ +import { AxiosPromise } from 'axios'; + +import { APSettings, APStatus } from '../types'; +import { AXIOS } from './endpoints'; + +export function readAPStatus(): AxiosPromise { + return AXIOS.get('/apStatus'); +} + +export function readAPSettings(): AxiosPromise { + return AXIOS.get('/apSettings'); +} + +export function updateAPSettings(apSettings: APSettings): AxiosPromise { + return AXIOS.post('/apSettings', apSettings); +} diff --git a/interface/src/api/authentication.ts b/interface/src/api/authentication.ts new file mode 100644 index 000000000..ec7f459ed --- /dev/null +++ b/interface/src/api/authentication.ts @@ -0,0 +1,64 @@ +import { AxiosPromise } from 'axios'; +import * as H from 'history'; +import jwtDecode from 'jwt-decode'; +import { Path } from 'react-router-dom'; + +import { Features, Me, SignInRequest, SignInResponse } from '../types'; + +import { ACCESS_TOKEN, AXIOS } from './endpoints'; +import { PROJECT_PATH } from './env'; + +export const SIGN_IN_PATHNAME = 'loginPathname'; +export const SIGN_IN_SEARCH = 'loginSearch'; + +export const getDefaultRoute = (features: Features) => (features.project ? `/${PROJECT_PATH}` : '/wifi'); + +export function verifyAuthorization(): AxiosPromise { + return AXIOS.get('/verifyAuthorization'); +} + +export function signIn(request: SignInRequest): AxiosPromise { + return AXIOS.post('/signIn', request); +} + +/** + * Fallback to sessionStorage if localStorage is absent. WebView may not have local storage enabled. + */ +export function getStorage() { + return localStorage || sessionStorage; +} + +export function storeLoginRedirect(location?: H.Location) { + if (location) { + getStorage().setItem(SIGN_IN_PATHNAME, location.pathname); + getStorage().setItem(SIGN_IN_SEARCH, location.search); + } +} + +export function clearLoginRedirect() { + getStorage().removeItem(SIGN_IN_PATHNAME); + getStorage().removeItem(SIGN_IN_SEARCH); +} + +export function fetchLoginRedirect(features: Features): Partial { + const signInPathname = getStorage().getItem(SIGN_IN_PATHNAME); + const signInSearch = getStorage().getItem(SIGN_IN_SEARCH); + clearLoginRedirect(); + return { + pathname: signInPathname || getDefaultRoute(features), + search: (signInPathname && signInSearch) || undefined + }; +} + +export const clearAccessToken = () => localStorage.removeItem(ACCESS_TOKEN); +export const decodeMeJWT = (accessToken: string): Me => jwtDecode(accessToken) as Me; + +export function addAccessTokenParameter(url: string) { + const accessToken = getStorage().getItem(ACCESS_TOKEN); + if (!accessToken) { + return url; + } + const parsedUrl = new URL(url); + parsedUrl.searchParams.set(ACCESS_TOKEN, accessToken); + return parsedUrl.toString(); +} diff --git a/interface/src/api/endpoints.ts b/interface/src/api/endpoints.ts new file mode 100644 index 000000000..7f3db5f3a --- /dev/null +++ b/interface/src/api/endpoints.ts @@ -0,0 +1,105 @@ +import axios, { AxiosPromise, CancelToken } from 'axios'; + +import { decode } from '@msgpack/msgpack'; + +export const WS_BASE_URL = '/ws/'; +export const API_BASE_URL = '/rest/'; +export const ES_BASE_URL = '/es/'; +export const EMSESP_API_BASE_URL = '/api/'; +export const ACCESS_TOKEN = 'access_token'; +export const WEB_SOCKET_ROOT = calculateWebSocketRoot(WS_BASE_URL); +export const EVENT_SOURCE_ROOT = calculateEventSourceRoot(ES_BASE_URL); + +export const AXIOS = axios.create({ + baseURL: API_BASE_URL, + headers: { + 'Content-Type': 'application/json' + }, + transformRequest: [ + (data, headers) => { + if (headers) { + if (localStorage.getItem(ACCESS_TOKEN)) { + headers.Authorization = 'Bearer ' + localStorage.getItem(ACCESS_TOKEN); + } + if (headers['Content-Type'] !== 'application/json') { + return data; + } + } + return JSON.stringify(data); + } + ] +}); + +export const AXIOS_API = axios.create({ + baseURL: EMSESP_API_BASE_URL, + headers: { + 'Content-Type': 'application/json' + }, + transformRequest: [ + (data, headers) => { + if (headers) { + if (localStorage.getItem(ACCESS_TOKEN)) { + headers.Authorization = 'Bearer ' + localStorage.getItem(ACCESS_TOKEN); + } + if (headers['Content-Type'] !== 'application/json') { + return data; + } + } + return JSON.stringify(data); + } + ] +}); + +export const AXIOS_BIN = axios.create({ + baseURL: API_BASE_URL, + headers: { + 'Content-Type': 'application/json' + }, + responseType: 'arraybuffer', + transformRequest: [ + (data, headers) => { + if (headers) { + if (localStorage.getItem(ACCESS_TOKEN)) { + headers.Authorization = 'Bearer ' + localStorage.getItem(ACCESS_TOKEN); + } + if (headers['Content-Type'] !== 'application/json') { + return data; + } + } + return JSON.stringify(data); + } + ], + transformResponse: [ + (data) => { + return decode(data); + } + ] +}); + +function calculateWebSocketRoot(webSocketPath: string) { + const location = window.location; + const webProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; + return webProtocol + '//' + location.host + webSocketPath; +} + +function calculateEventSourceRoot(endpointPath: string) { + const location = window.location; + return location.protocol + '//' + location.host + endpointPath; +} + +export interface FileUploadConfig { + cancelToken?: CancelToken; + onUploadProgress?: (progressEvent: ProgressEvent) => void; +} + +export const uploadFile = (url: string, file: File, config?: FileUploadConfig): AxiosPromise => { + const formData = new FormData(); + formData.append('file', file); + + return AXIOS.post(url, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + }, + ...(config || {}) + }); +}; diff --git a/interface/src/api/env.ts b/interface/src/api/env.ts new file mode 100644 index 000000000..d3791bcf9 --- /dev/null +++ b/interface/src/api/env.ts @@ -0,0 +1,2 @@ +export const PROJECT_NAME = process.env.REACT_APP_PROJECT_NAME || 'EMS-ESP'; +export const PROJECT_PATH = process.env.REACT_APP_PROJECT_PATH || 'project'; diff --git a/interface/src/api/features.ts b/interface/src/api/features.ts new file mode 100644 index 000000000..3096a3dd5 --- /dev/null +++ b/interface/src/api/features.ts @@ -0,0 +1,9 @@ +import { AxiosPromise } from 'axios'; + +import { Features } from '../types'; + +import { AXIOS } from './endpoints'; + +export function readFeatures(): AxiosPromise { + return AXIOS.get('/features'); +} diff --git a/interface/src/api/index.ts b/interface/src/api/index.ts deleted file mode 100644 index 1e5b5ff82..000000000 --- a/interface/src/api/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './Env'; -export * from './Endpoints'; diff --git a/interface/src/api/mqtt.ts b/interface/src/api/mqtt.ts new file mode 100644 index 000000000..31a68dc88 --- /dev/null +++ b/interface/src/api/mqtt.ts @@ -0,0 +1,16 @@ +import { AxiosPromise } from 'axios'; +import { MqttSettings, MqttStatus } from '../types'; + +import { AXIOS } from './endpoints'; + +export function readMqttStatus(): AxiosPromise { + return AXIOS.get('/mqttStatus'); +} + +export function readMqttSettings(): AxiosPromise { + return AXIOS.get('/mqttSettings'); +} + +export function updateMqttSettings(ntpSettings: MqttSettings): AxiosPromise { + return AXIOS.post('/mqttSettings', ntpSettings); +} diff --git a/interface/src/api/network.ts b/interface/src/api/network.ts new file mode 100644 index 000000000..1c7e7768b --- /dev/null +++ b/interface/src/api/network.ts @@ -0,0 +1,25 @@ +import { AxiosPromise } from 'axios'; + +import { WiFiNetworkList, NetworkSettings, NetworkStatus } from '../types'; + +import { AXIOS } from './endpoints'; + +export function readNetworkStatus(): AxiosPromise { + return AXIOS.get('/networkStatus'); +} + +export function scanNetworks(): AxiosPromise { + return AXIOS.get('/scanNetworks'); +} + +export function listNetworks(): AxiosPromise { + return AXIOS.get('/listNetworks'); +} + +export function readNetworkSettings(): AxiosPromise { + return AXIOS.get('/networkSettings'); +} + +export function updateNetworkSettings(wifiSettings: NetworkSettings): AxiosPromise { + return AXIOS.post('/networkSettings', wifiSettings); +} diff --git a/interface/src/api/ntp.ts b/interface/src/api/ntp.ts new file mode 100644 index 000000000..e46c7fda1 --- /dev/null +++ b/interface/src/api/ntp.ts @@ -0,0 +1,20 @@ +import { AxiosPromise } from 'axios'; +import { NTPSettings, NTPStatus, Time } from '../types'; + +import { AXIOS } from './endpoints'; + +export function readNTPStatus(): AxiosPromise { + return AXIOS.get('/ntpStatus'); +} + +export function readNTPSettings(): AxiosPromise { + return AXIOS.get('/ntpSettings'); +} + +export function updateNTPSettings(ntpSettings: NTPSettings): AxiosPromise { + return AXIOS.post('/ntpSettings', ntpSettings); +} + +export function updateTime(time: Time): AxiosPromise
diff --git a/interface/src/components/inputs/ValidatedPasswordField.tsx b/interface/src/components/inputs/ValidatedPasswordField.tsx new file mode 100644 index 000000000..d4a215199 --- /dev/null +++ b/interface/src/components/inputs/ValidatedPasswordField.tsx @@ -0,0 +1,36 @@ +import { FC, useState } from 'react'; + +import { IconButton, InputAdornment } from '@mui/material'; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; + +import ValidatedTextField, { ValidatedTextFieldProps } from './ValidatedTextField'; + +type ValidatedPasswordFieldProps = Omit; + +const ValidatedPasswordField: FC = ({ InputProps, ...props }) => { + const [showPassword, setShowPassword] = useState(false); + + return ( + + setShowPassword(!showPassword)} + edge="end" + > + {showPassword ? : } + + + ) + }} + /> + ); +}; + +export default ValidatedPasswordField; diff --git a/interface/src/components/inputs/ValidatedTextField.tsx b/interface/src/components/inputs/ValidatedTextField.tsx new file mode 100644 index 000000000..8d07f8127 --- /dev/null +++ b/interface/src/components/inputs/ValidatedTextField.tsx @@ -0,0 +1,24 @@ +import { FC } from 'react'; +import { ValidateFieldsError } from 'async-validator'; + +import { FormHelperText, TextField, TextFieldProps } from '@mui/material'; + +interface ValidatedFieldProps { + fieldErrors?: ValidateFieldsError; + name: string; +} + +export type ValidatedTextFieldProps = ValidatedFieldProps & TextFieldProps; + +const ValidatedTextField: FC = ({ fieldErrors, ...rest }) => { + const errors = fieldErrors && fieldErrors[rest.name]; + const renderErrors = () => errors && errors.map((e, i) => {e.message}); + return ( + <> + + {renderErrors()} + + ); +}; + +export default ValidatedTextField; diff --git a/interface/src/components/inputs/index.ts b/interface/src/components/inputs/index.ts new file mode 100644 index 000000000..daae8a727 --- /dev/null +++ b/interface/src/components/inputs/index.ts @@ -0,0 +1,3 @@ +export { default as BlockFormControlLabel } from './BlockFormControlLabel'; +export { default as ValidatedPasswordField } from './ValidatedPasswordField'; +export { default as ValidatedTextField } from './ValidatedTextField'; diff --git a/interface/src/components/layout/Layout.tsx b/interface/src/components/layout/Layout.tsx new file mode 100644 index 000000000..30136be0c --- /dev/null +++ b/interface/src/components/layout/Layout.tsx @@ -0,0 +1,36 @@ +import { FC, useState, useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; + +import { Box, Toolbar } from '@mui/material'; + +import { PROJECT_NAME } from '../../api/env'; +import LayoutDrawer from './LayoutDrawer'; +import LayoutAppBar from './LayoutAppBar'; +import { LayoutContext } from './context'; + +export const DRAWER_WIDTH = 240; + +const Layout: FC = ({ children }) => { + const [mobileOpen, setMobileOpen] = useState(false); + const [title, setTitle] = useState(PROJECT_NAME); + const { pathname } = useLocation(); + + const handleDrawerToggle = () => { + setMobileOpen(!mobileOpen); + }; + + useEffect(() => setMobileOpen(false), [pathname]); + + return ( + + + + + + {children} + + + ); +}; + +export default Layout; diff --git a/interface/src/components/layout/LayoutAppBar.tsx b/interface/src/components/layout/LayoutAppBar.tsx new file mode 100644 index 000000000..604774250 --- /dev/null +++ b/interface/src/components/layout/LayoutAppBar.tsx @@ -0,0 +1,51 @@ +import { FC, useContext } from 'react'; + +import { AppBar, Box, IconButton, Toolbar, Typography } from '@mui/material'; +import MenuIcon from '@mui/icons-material/Menu'; + +import LayoutAuthMenu from './LayoutAuthMenu'; + +import { FeaturesContext } from '../../contexts/features'; + +export const DRAWER_WIDTH = 240; + +interface LayoutAppBarProps { + title: string; + onToggleDrawer: () => void; +} + +const LayoutAppBar: FC = ({ title, onToggleDrawer }) => { + const { features } = useContext(FeaturesContext); + + return ( + + + + + + + {title} + + + {features.security && } + + + ); +}; + +export default LayoutAppBar; diff --git a/interface/src/components/layout/LayoutAuthMenu.tsx b/interface/src/components/layout/LayoutAuthMenu.tsx new file mode 100644 index 000000000..26c1d3fc4 --- /dev/null +++ b/interface/src/components/layout/LayoutAuthMenu.tsx @@ -0,0 +1,73 @@ +import { FC, useState, useContext } from 'react'; + +import { Box, Button, Divider, IconButton, Popover, Typography, Avatar, styled, TypographyProps } from '@mui/material'; + +import PersonIcon from '@mui/icons-material/Person'; +import AccountCircleIcon from '@mui/icons-material/AccountCircle'; + +import { AuthenticatedContext } from '../../contexts/authentication'; + +const ItemTypography = styled(Typography)({ + maxWidth: '250px', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis' +}); + +const LayoutAuthMenu: FC = () => { + const { me, signOut } = useContext(AuthenticatedContext); + + const [anchorEl, setAnchorEl] = useState(null); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const open = Boolean(anchorEl); + const id = anchorEl ? 'app-menu-popover' : undefined; + + return ( + <> + + + + + + + + + + {me.username} + {me.admin ? 'Admin User' : 'Guest User'} + + + + + + + + + ); +}; + +export default LayoutAuthMenu; diff --git a/interface/src/components/layout/LayoutDrawer.tsx b/interface/src/components/layout/LayoutDrawer.tsx new file mode 100644 index 000000000..d1a6987af --- /dev/null +++ b/interface/src/components/layout/LayoutDrawer.tsx @@ -0,0 +1,73 @@ +import { FC } from 'react'; + +import { Box, Divider, Drawer, Toolbar, Typography, styled } from '@mui/material'; + +import { PROJECT_NAME } from '../../api/env'; + +import LayoutMenu from './LayoutMenu'; +import { DRAWER_WIDTH } from './Layout'; + +const LayoutDrawerLogo = styled('img')(({ theme }) => ({ + [theme.breakpoints.down('sm')]: { + height: 24, + marginRight: theme.spacing(2) + }, + [theme.breakpoints.up('sm')]: { + height: 36, + marginRight: theme.spacing(2) + } +})); + +interface LayoutDrawerProps { + mobileOpen: boolean; + onClose: () => void; +} + +const LayoutDrawer: FC = ({ mobileOpen, onClose }) => { + const drawer = ( + <> + + + + + {PROJECT_NAME} + + + + + + + + ); + + return ( + + + {drawer} + + + {drawer} + + + ); +}; + +export default LayoutDrawer; diff --git a/interface/src/components/layout/LayoutMenu.tsx b/interface/src/components/layout/LayoutMenu.tsx new file mode 100644 index 000000000..f3e1bfb6d --- /dev/null +++ b/interface/src/components/layout/LayoutMenu.tsx @@ -0,0 +1,42 @@ +import { FC, useContext } from 'react'; + +import { Divider, List } from '@mui/material'; + +import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; +import AccessTimeIcon from '@mui/icons-material/AccessTime'; +import DeviceHubIcon from '@mui/icons-material/DeviceHub'; +import SettingsIcon from '@mui/icons-material/Settings'; +import LockIcon from '@mui/icons-material/Lock'; +import SettingsEthernetIcon from '@mui/icons-material/SettingsEthernet'; + +import { FeaturesContext } from '../../contexts/features'; +import ProjectMenu from '../../project/ProjectMenu'; + +import LayoutMenuItem from './LayoutMenuItem'; +import { AuthenticatedContext } from '../../contexts/authentication'; + +const LayoutMenu: FC = () => { + const { features } = useContext(FeaturesContext); + const authenticatedContext = useContext(AuthenticatedContext); + + return ( + <> + {features.project && ( + + + + + )} + + + + {features.ntp && } + {features.mqtt && } + + + + + ); +}; + +export default LayoutMenu; diff --git a/interface/src/components/layout/LayoutMenuItem.tsx b/interface/src/components/layout/LayoutMenuItem.tsx new file mode 100644 index 000000000..2484acea7 --- /dev/null +++ b/interface/src/components/layout/LayoutMenuItem.tsx @@ -0,0 +1,32 @@ +import { FC } from 'react'; +import { Link, useLocation } from 'react-router-dom'; + +import { ListItem, ListItemButton, ListItemIcon, ListItemText, SvgIconProps } from '@mui/material'; + +import { grey } from '@mui/material/colors'; + +import { routeMatches } from '../../utils'; + +interface LayoutMenuItemProps { + icon: React.ComponentType; + label: string; + to: string; + disabled?: boolean; +} + +const LayoutMenuItem: FC = ({ icon: Icon, label, to, disabled }) => { + const { pathname } = useLocation(); + + return ( + + + + + + {label} + + + ); +}; + +export default LayoutMenuItem; diff --git a/interface/src/components/layout/context.ts b/interface/src/components/layout/context.ts new file mode 100644 index 000000000..ce1d81f43 --- /dev/null +++ b/interface/src/components/layout/context.ts @@ -0,0 +1,25 @@ +import { useRef, useEffect, createContext, useContext } from 'react'; + +export interface LayoutContextValue { + title: string; + setTitle: (title: string) => void; +} + +const LayoutContextDefaultValue = {} as LayoutContextValue; +export const LayoutContext = createContext(LayoutContextDefaultValue); + +export const useLayoutTitle = (myTitle: string) => { + const { title, setTitle } = useContext(LayoutContext); + const previousTitle = useRef(title); + + useEffect(() => { + setTitle(myTitle); + }, [setTitle, myTitle]); + + useEffect( + () => () => { + setTitle(previousTitle.current); + }, + [setTitle] + ); +}; diff --git a/interface/src/components/layout/index.ts b/interface/src/components/layout/index.ts new file mode 100644 index 000000000..8fd8849af --- /dev/null +++ b/interface/src/components/layout/index.ts @@ -0,0 +1,2 @@ +export * from './context'; +export { default as Layout } from './Layout'; diff --git a/interface/src/components/loading/ApplicationError.tsx b/interface/src/components/loading/ApplicationError.tsx new file mode 100644 index 000000000..9ab428d58 --- /dev/null +++ b/interface/src/components/loading/ApplicationError.tsx @@ -0,0 +1,43 @@ +import { FC } from 'react'; + +import { Box, Paper, Typography } from '@mui/material'; +import WarningIcon from '@mui/icons-material/Warning'; + +interface ApplicationErrorProps { + message?: string; +} + +const ApplicationError: FC = ({ message }) => ( + + + + + + Application Error + + + + Failed to configure the application, please refresh to try again. + + {message && ( + + {message} + + )} + + +); + +export default ApplicationError; diff --git a/interface/src/components/loading/FormLoader.tsx b/interface/src/components/loading/FormLoader.tsx new file mode 100644 index 000000000..8b1baab7b --- /dev/null +++ b/interface/src/components/loading/FormLoader.tsx @@ -0,0 +1,38 @@ +import { FC } from 'react'; + +import { Box, Button, CircularProgress, Typography } from '@mui/material'; +import RefreshIcon from '@mui/icons-material/Refresh'; + +import { MessageBox } from '..'; + +interface FormLoaderProps { + message?: string; + errorMessage?: string; + onRetry?: () => void; +} + +const FormLoader: FC = ({ errorMessage, onRetry, message = 'Loading…' }) => { + if (errorMessage) { + return ( + + {onRetry && ( + + )} + + ); + } + return ( + + + + + + {message} + + + ); +}; + +export default FormLoader; diff --git a/interface/src/components/loading/LoadingSpinner.tsx b/interface/src/components/loading/LoadingSpinner.tsx new file mode 100644 index 000000000..eaeccf0ad --- /dev/null +++ b/interface/src/components/loading/LoadingSpinner.tsx @@ -0,0 +1,24 @@ +import { FC } from 'react'; + +import { CircularProgress, Box, Typography, Theme } from '@mui/material'; + +interface LoadingSpinnerProps { + height?: number | string; +} + +const LoadingSpinner: FC = ({ height = '100%' }) => ( + + ({ + margin: theme.spacing(4), + color: theme.palette.text.secondary + })} + size={100} + /> + + Loading… + + +); + +export default LoadingSpinner; diff --git a/interface/src/components/loading/index.ts b/interface/src/components/loading/index.ts new file mode 100644 index 000000000..f8c7b8608 --- /dev/null +++ b/interface/src/components/loading/index.ts @@ -0,0 +1,3 @@ +export { default as ApplicationError } from './ApplicationError'; +export { default as LoadingSpinner } from './LoadingSpinner'; +export { default as FormLoader } from './FormLoader'; diff --git a/interface/src/components/routing/RequireAdmin.tsx b/interface/src/components/routing/RequireAdmin.tsx new file mode 100644 index 000000000..924933336 --- /dev/null +++ b/interface/src/components/routing/RequireAdmin.tsx @@ -0,0 +1,11 @@ +import { FC, useContext } from 'react'; +import { Navigate } from 'react-router-dom'; + +import { AuthenticatedContext } from '../../contexts/authentication'; + +const RequireAdmin: FC = ({ children }) => { + const authenticatedContext = useContext(AuthenticatedContext); + return authenticatedContext.me.admin ? <>{children} : ; +}; + +export default RequireAdmin; diff --git a/interface/src/components/routing/RequireAuthenticated.tsx b/interface/src/components/routing/RequireAuthenticated.tsx new file mode 100644 index 000000000..6ae24e760 --- /dev/null +++ b/interface/src/components/routing/RequireAuthenticated.tsx @@ -0,0 +1,30 @@ +import { FC, useContext, useEffect } from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; + +import { + AuthenticatedContext, + AuthenticatedContextValue, + AuthenticationContext +} from '../../contexts/authentication/context'; +import { storeLoginRedirect } from '../../api/authentication'; + +const RequireAuthenticated: FC = ({ children }) => { + const authenticationContext = useContext(AuthenticationContext); + const location = useLocation(); + + useEffect(() => { + if (!authenticationContext.me) { + storeLoginRedirect(location); + } + }); + + return authenticationContext.me ? ( + + {children} + + ) : ( + + ); +}; + +export default RequireAuthenticated; diff --git a/interface/src/components/routing/RequireUnauthenticated.tsx b/interface/src/components/routing/RequireUnauthenticated.tsx new file mode 100644 index 000000000..b8ef2ad61 --- /dev/null +++ b/interface/src/components/routing/RequireUnauthenticated.tsx @@ -0,0 +1,15 @@ +import { FC, useContext } from 'react'; +import { Navigate } from 'react-router-dom'; + +import * as AuthenticationApi from '../../api/authentication'; +import { AuthenticationContext } from '../../contexts/authentication'; +import { FeaturesContext } from '../../contexts/features'; + +const RequireUnauthenticated: FC = ({ children }) => { + const { features } = useContext(FeaturesContext); + const authenticationContext = useContext(AuthenticationContext); + + return authenticationContext.me ? : <>{children}; +}; + +export default RequireUnauthenticated; diff --git a/interface/src/components/routing/RouterTabs.tsx b/interface/src/components/routing/RouterTabs.tsx new file mode 100644 index 000000000..49fd6528b --- /dev/null +++ b/interface/src/components/routing/RouterTabs.tsx @@ -0,0 +1,27 @@ +import React, { FC } from 'react'; +import { useNavigate } from 'react-router-dom'; + +import { Tabs, useMediaQuery, useTheme } from '@mui/material'; + +interface RouterTabsProps { + value: string | false; +} + +const RouterTabs: FC = ({ value, children }) => { + const navigate = useNavigate(); + + const theme = useTheme(); + const smallDown = useMediaQuery(theme.breakpoints.down('sm')); + + const handleTabChange = (event: React.ChangeEvent<{}>, path: string) => { + navigate(path); + }; + + return ( + + {children} + + ); +}; + +export default RouterTabs; diff --git a/interface/src/components/routing/index.ts b/interface/src/components/routing/index.ts new file mode 100644 index 000000000..84e2c217b --- /dev/null +++ b/interface/src/components/routing/index.ts @@ -0,0 +1,6 @@ +export { default as RouterTabs } from './RouterTabs'; +export { default as RequireAdmin } from './RequireAdmin'; +export { default as RequireAuthenticated } from './RequireAuthenticated'; +export { default as RequireUnauthenticated } from './RequireUnauthenticated'; + +export * from './useRouterTab'; diff --git a/interface/src/components/routing/useRouterTab.ts b/interface/src/components/routing/useRouterTab.ts new file mode 100644 index 000000000..5dff86fd8 --- /dev/null +++ b/interface/src/components/routing/useRouterTab.ts @@ -0,0 +1,9 @@ +import { useMatch, useResolvedPath } from 'react-router-dom'; + +export const useRouterTab = () => { + const routerTabPath = useResolvedPath(':tab'); + const routerTabPathMatch = useMatch(routerTabPath.pathname); + + const routerTab = routerTabPathMatch?.params?.tab || false; + return { routerTab } as const; +}; diff --git a/interface/src/components/upload/SingleUpload.tsx b/interface/src/components/upload/SingleUpload.tsx new file mode 100644 index 000000000..d58cc890d --- /dev/null +++ b/interface/src/components/upload/SingleUpload.tsx @@ -0,0 +1,86 @@ +import { FC, Fragment } from 'react'; +import { useDropzone, DropzoneState } from 'react-dropzone'; + +import { Box, Button, LinearProgress, Theme, Typography, useTheme } from '@mui/material'; + +import CloudUploadIcon from '@mui/icons-material/CloudUpload'; +import CancelIcon from '@mui/icons-material/Cancel'; + +const progressPercentage = (progress: ProgressEvent) => Math.round((progress.loaded * 100) / progress.total); + +const getBorderColor = (theme: Theme, props: DropzoneState) => { + if (props.isDragAccept) { + return theme.palette.success.main; + } + if (props.isDragReject) { + return theme.palette.error.main; + } + if (props.isDragActive) { + return theme.palette.info.main; + } + return theme.palette.grey[700]; +}; + +export interface SingleUploadProps { + onDrop: (acceptedFiles: File[]) => void; + onCancel: () => void; + accept?: string | string[]; + uploading: boolean; + progress?: ProgressEvent; +} + +const SingleUpload: FC = ({ onDrop, onCancel, accept, uploading, progress }) => { + const dropzoneState = useDropzone({ onDrop, accept, disabled: uploading, multiple: false }); + const { getRootProps, getInputProps } = dropzoneState; + const theme = useTheme(); + + const progressText = () => { + if (uploading) { + if (progress?.lengthComputable) { + return `Uploading: ${progressPercentage(progress)}%`; + } + return 'Uploading\u2026'; + } + return 'Drop file or click here'; + }; + + return ( + + + + + {progressText()} + {uploading && ( + + + + + + + )} + + + ); +}; + +export default SingleUpload; diff --git a/interface/src/components/upload/index.ts b/interface/src/components/upload/index.ts new file mode 100644 index 000000000..e1589c5a1 --- /dev/null +++ b/interface/src/components/upload/index.ts @@ -0,0 +1,2 @@ +export { default as SingleUpload } from './SingleUpload'; +export { default as useFileUpload } from './useFileUpload'; diff --git a/interface/src/components/upload/useFileUpload.ts b/interface/src/components/upload/useFileUpload.ts new file mode 100644 index 000000000..d7d476900 --- /dev/null +++ b/interface/src/components/upload/useFileUpload.ts @@ -0,0 +1,59 @@ +import { useCallback, useEffect, useState } from 'react'; +import axios, { AxiosPromise, CancelTokenSource } from 'axios'; +import { useSnackbar } from 'notistack'; + +import { extractErrorMessage } from '../../utils'; +import { FileUploadConfig } from '../../api/endpoints'; + +interface MediaUploadOptions { + upload: (file: File, config?: FileUploadConfig) => AxiosPromise; +} + +const useFileUpload = ({ upload }: MediaUploadOptions) => { + const { enqueueSnackbar } = useSnackbar(); + const [uploading, setUploading] = useState(false); + const [uploadProgress, setUploadProgress] = useState(); + const [uploadCancelToken, setUploadCancelToken] = useState(); + + const resetUploadingStates = () => { + setUploading(false); + setUploadProgress(undefined); + setUploadCancelToken(undefined); + }; + + const cancelUpload = useCallback(() => { + uploadCancelToken?.cancel(); + resetUploadingStates(); + }, [uploadCancelToken]); + + useEffect(() => { + return () => { + uploadCancelToken?.cancel(); + }; + }, [uploadCancelToken]); + + const uploadFile = async (images: File[]) => { + try { + const cancelToken = axios.CancelToken.source(); + setUploadCancelToken(cancelToken); + setUploading(true); + await upload(images[0], { + onUploadProgress: setUploadProgress, + cancelToken: cancelToken.token + }); + resetUploadingStates(); + enqueueSnackbar('Upload successful', { variant: 'success' }); + } catch (error: any) { + if (axios.isCancel(error)) { + enqueueSnackbar('Upload aborted', { variant: 'warning' }); + } else { + resetUploadingStates(); + enqueueSnackbar(extractErrorMessage(error, 'Upload failed'), { variant: 'error' }); + } + } + }; + + return [uploadFile, cancelUpload, uploading, uploadProgress] as const; +}; + +export default useFileUpload; diff --git a/interface/src/contexts/authentication/Authentication.tsx b/interface/src/contexts/authentication/Authentication.tsx new file mode 100644 index 000000000..93f09b77f --- /dev/null +++ b/interface/src/contexts/authentication/Authentication.tsx @@ -0,0 +1,84 @@ +import { FC, useCallback, useContext, useEffect, useState } from 'react'; +import { useSnackbar } from 'notistack'; +import { useNavigate } from 'react-router-dom'; + +import * as AuthenticationApi from '../../api/authentication'; +import { ACCESS_TOKEN } from '../../api/endpoints'; +import { LoadingSpinner } from '../../components'; +import { Me } from '../../types'; +import { FeaturesContext } from '../features'; +import { AuthenticationContext } from './context'; + +const Authentication: FC = ({ children }) => { + const { features } = useContext(FeaturesContext); + const navigate = useNavigate(); + const { enqueueSnackbar } = useSnackbar(); + + const [initialized, setInitialized] = useState(false); + const [me, setMe] = useState(); + + const signIn = (accessToken: string) => { + try { + AuthenticationApi.getStorage().setItem(ACCESS_TOKEN, accessToken); + const decodedMe = AuthenticationApi.decodeMeJWT(accessToken); + setMe(decodedMe); + enqueueSnackbar(`Logged in as ${decodedMe.username}`, { variant: 'success' }); + } catch (error: any) { + setMe(undefined); + throw new Error('Failed to parse JWT ' + error.message); + } + }; + + const signOut = (redirect: boolean) => { + AuthenticationApi.clearAccessToken(); + setMe(undefined); + if (redirect) { + navigate('/'); + } + }; + + const refresh = useCallback(async () => { + if (!features.security) { + setMe({ admin: true, username: 'admin' }); + setInitialized(true); + return; + } + const accessToken = AuthenticationApi.getStorage().getItem(ACCESS_TOKEN); + if (accessToken) { + try { + await AuthenticationApi.verifyAuthorization(); + setMe(AuthenticationApi.decodeMeJWT(accessToken)); + setInitialized(true); + } catch (error: any) { + setMe(undefined); + setInitialized(true); + } + } else { + setMe(undefined); + setInitialized(true); + } + }, [features]); + + useEffect(() => { + refresh(); + }, [refresh]); + + if (initialized) { + return ( + + {children} + + ); + } + + return ; +}; + +export default Authentication; diff --git a/interface/src/contexts/authentication/context.ts b/interface/src/contexts/authentication/context.ts new file mode 100644 index 000000000..7f4b79c7d --- /dev/null +++ b/interface/src/contexts/authentication/context.ts @@ -0,0 +1,19 @@ +import { createContext } from 'react'; +import { Me } from '../../types'; + +export interface AuthenticationContextValue { + refresh: () => Promise; + signIn: (accessToken: string) => void; + signOut: (redirect: boolean) => void; + me?: Me; +} + +const AuthenticationContextDefaultValue = {} as AuthenticationContextValue; +export const AuthenticationContext = createContext(AuthenticationContextDefaultValue); + +export interface AuthenticatedContextValue extends AuthenticationContextValue { + me: Me; +} + +const AuthenticatedContextDefaultValue = {} as AuthenticatedContextValue; +export const AuthenticatedContext = createContext(AuthenticatedContextDefaultValue); diff --git a/interface/src/contexts/authentication/index.ts b/interface/src/contexts/authentication/index.ts new file mode 100644 index 000000000..da20f43e3 --- /dev/null +++ b/interface/src/contexts/authentication/index.ts @@ -0,0 +1,2 @@ +export * from './context'; +export { default as Authentication } from './Authentication'; diff --git a/interface/src/contexts/features/FeaturesLoader.tsx b/interface/src/contexts/features/FeaturesLoader.tsx new file mode 100644 index 000000000..e02c3411c --- /dev/null +++ b/interface/src/contexts/features/FeaturesLoader.tsx @@ -0,0 +1,47 @@ +import { FC, useCallback, useEffect, useState } from 'react'; + +import * as FeaturesApi from '../../api/features'; + +import { extractErrorMessage } from '../../utils'; +import { Features } from '../../types'; +import { ApplicationError, LoadingSpinner } from '../../components'; + +import { FeaturesContext } from '.'; + +const FeaturesLoader: FC = (props) => { + const [errorMessage, setErrorMessage] = useState(); + const [features, setFeatures] = useState(); + + const loadFeatures = useCallback(async () => { + try { + const response = await FeaturesApi.readFeatures(); + setFeatures(response.data); + } catch (error: any) { + setErrorMessage(extractErrorMessage(error, 'Failed to fetch application details.')); + } + }, []); + + useEffect(() => { + loadFeatures(); + }, [loadFeatures]); + + if (features) { + return ( + + {props.children} + + ); + } + + if (errorMessage) { + return ; + } + + return ; +}; + +export default FeaturesLoader; diff --git a/interface/src/contexts/features/context.ts b/interface/src/contexts/features/context.ts new file mode 100644 index 000000000..66e0e8550 --- /dev/null +++ b/interface/src/contexts/features/context.ts @@ -0,0 +1,10 @@ +import { createContext } from 'react'; + +import { Features } from '../../types'; + +export interface FeaturesContextValue { + features: Features; +} + +const FeaturesContextDefaultValue = {} as FeaturesContextValue; +export const FeaturesContext = createContext(FeaturesContextDefaultValue); diff --git a/interface/src/contexts/features/index.ts b/interface/src/contexts/features/index.ts new file mode 100644 index 000000000..f8df83c02 --- /dev/null +++ b/interface/src/contexts/features/index.ts @@ -0,0 +1,2 @@ +export * from './context'; +export { default as FeaturesLoader } from './FeaturesLoader'; diff --git a/interface/src/features/FeaturesContext.tsx b/interface/src/features/FeaturesContext.tsx deleted file mode 100644 index 15296e085..000000000 --- a/interface/src/features/FeaturesContext.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React from 'react'; -import { Features } from './types'; - -export interface FeaturesContextValue { - features: Features; -} - -const FeaturesContextDefaultValue = {} as FeaturesContextValue; -export const FeaturesContext = React.createContext(FeaturesContextDefaultValue); - -export interface WithFeaturesProps { - features: Features; -} - -export function withFeatures( - Component: React.ComponentType -) { - return class extends React.Component> { - render() { - return ( - - {(featuresContext) => ( - - )} - - ); - } - }; -} diff --git a/interface/src/features/FeaturesWrapper.tsx b/interface/src/features/FeaturesWrapper.tsx deleted file mode 100644 index e5c762f23..000000000 --- a/interface/src/features/FeaturesWrapper.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { FC } from 'react'; - -import FullScreenLoading from '../components/FullScreenLoading'; -import ApplicationError from '../components/ApplicationError'; -import { FEATURES_ENDPOINT } from '../api'; -import { useRest } from '../hooks'; - -import { Features } from './types'; -import { FeaturesContext } from './FeaturesContext'; - -const FeaturesWrapper: FC = ({ children }) => { - const { data: features, errorMessage: error } = useRest({ - endpoint: FEATURES_ENDPOINT - }); - - if (features) { - return ( - - {children} - - ); - } - - if (error) { - return ; - } - - return ; -}; - -export default FeaturesWrapper; diff --git a/interface/src/framework/ap/APSettingsForm.tsx b/interface/src/framework/ap/APSettingsForm.tsx new file mode 100644 index 000000000..f15c6b802 --- /dev/null +++ b/interface/src/framework/ap/APSettingsForm.tsx @@ -0,0 +1,184 @@ +import { FC, useState } from 'react'; +import { ValidateFieldsError } from 'async-validator'; +import { range } from 'lodash'; + +import { Button, Checkbox, MenuItem } from '@mui/material'; +import SaveIcon from '@mui/icons-material/Save'; + +import { createAPSettingsValidator, validate } from '../../validators'; +import { + BlockFormControlLabel, + ButtonRow, + FormLoader, + SectionContent, + ValidatedPasswordField, + ValidatedTextField +} from '../../components'; +import { APProvisionMode, APSettings } from '../../types'; +import { numberValue, updateValue, useRest } from '../../utils'; +import * as APApi from '../../api/ap'; + +export const isAPEnabled = ({ provision_mode }: APSettings) => { + return provision_mode === APProvisionMode.AP_MODE_ALWAYS || provision_mode === APProvisionMode.AP_MODE_DISCONNECTED; +}; + +const APSettingsForm: FC = () => { + const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ + read: APApi.readAPSettings, + update: APApi.updateAPSettings + }); + + const [fieldErrors, setFieldErrors] = useState(); + + const updateFormValue = updateValue(setData); + + const content = () => { + if (!data) { + return ; + } + + const validateAndSubmit = async () => { + try { + setFieldErrors(undefined); + await validate(createAPSettingsValidator(data), data); + saveData(); + } catch (errors: any) { + setFieldErrors(errors); + } + }; + + return ( + <> + + Always + When WiFi Disconnected + Never + + {isAPEnabled(data) && ( + <> + + + + {range(1, 14).map((i) => ( + + {i} + + ))} + + } + label="Hide SSID" + /> + + {range(1, 9).map((i) => ( + + {i} + + ))} + + + + + + )} + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default APSettingsForm; diff --git a/interface/src/framework/ap/APStatusForm.tsx b/interface/src/framework/ap/APStatusForm.tsx new file mode 100644 index 000000000..e0a99e3b2 --- /dev/null +++ b/interface/src/framework/ap/APStatusForm.tsx @@ -0,0 +1,104 @@ +import { FC } from 'react'; + +import { Avatar, Button, Divider, List, ListItem, ListItemAvatar, ListItemText, Theme, useTheme } from '@mui/material'; +import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; +import DeviceHubIcon from '@mui/icons-material/DeviceHub'; +import ComputerIcon from '@mui/icons-material/Computer'; +import RefreshIcon from '@mui/icons-material/Refresh'; + +import * as APApi from '../../api/ap'; +import { APNetworkStatus, APStatus } from '../../types'; +import { ButtonRow, FormLoader, SectionContent } from '../../components'; +import { useRest } from '../../utils'; + +export const apStatusHighlight = ({ status }: APStatus, theme: Theme) => { + switch (status) { + case APNetworkStatus.ACTIVE: + return theme.palette.success.main; + case APNetworkStatus.INACTIVE: + return theme.palette.info.main; + case APNetworkStatus.LINGERING: + return theme.palette.warning.main; + default: + return theme.palette.warning.main; + } +}; + +export const apStatus = ({ status }: APStatus) => { + switch (status) { + case APNetworkStatus.ACTIVE: + return 'Active'; + case APNetworkStatus.INACTIVE: + return 'Inactive'; + case APNetworkStatus.LINGERING: + return 'Lingering until idle'; + default: + return 'Unknown'; + } +}; + +const APStatusForm: FC = () => { + const { loadData, data, errorMessage } = useRest({ read: APApi.readAPStatus }); + + const theme = useTheme(); + + const content = () => { + if (!data) { + return ; + } + + return ( + <> + + + + + + + + + + + + + IP + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default APStatusForm; diff --git a/interface/src/framework/ap/AccessPoint.tsx b/interface/src/framework/ap/AccessPoint.tsx new file mode 100644 index 000000000..742db7b24 --- /dev/null +++ b/interface/src/framework/ap/AccessPoint.tsx @@ -0,0 +1,40 @@ +import { FC, useContext } from 'react'; +import { Navigate, Routes, Route } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { AuthenticatedContext } from '../../contexts/authentication'; +import APStatusForm from './APStatusForm'; +import APSettingsForm from './APSettingsForm'; +import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from '../../components'; + +const AccessPoint: FC = () => { + useLayoutTitle('Access Point'); + + const authenticatedContext = useContext(AuthenticatedContext); + + const { routerTab } = useRouterTab(); + + return ( + <> + + + + + + } /> + + + + } + /> + } /> + + + ); +}; + +export default AccessPoint; diff --git a/interface/src/framework/mqtt/Mqtt.tsx b/interface/src/framework/mqtt/Mqtt.tsx new file mode 100644 index 000000000..d44edb781 --- /dev/null +++ b/interface/src/framework/mqtt/Mqtt.tsx @@ -0,0 +1,40 @@ +import React, { FC, useContext } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from '../../components'; +import { AuthenticatedContext } from '../../contexts/authentication'; + +import MqttStatusForm from './MqttStatusForm'; +import MqttSettingsForm from './MqttSettingsForm'; + +const Mqtt: FC = () => { + useLayoutTitle('MQTT'); + + const authenticatedContext = useContext(AuthenticatedContext); + const { routerTab } = useRouterTab(); + + return ( + <> + + + + + + } /> + + + + } + /> + } /> + + + ); +}; + +export default Mqtt; diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx new file mode 100644 index 000000000..1d0768277 --- /dev/null +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -0,0 +1,315 @@ +import { FC, useState } from 'react'; +import { ValidateFieldsError } from 'async-validator'; + +import { Button, Checkbox, MenuItem, Grid, Typography } from '@mui/material'; +import SaveIcon from '@mui/icons-material/Save'; + +import { MQTT_SETTINGS_VALIDATOR, validate } from '../../validators'; +import { + BlockFormControlLabel, + ButtonRow, + FormLoader, + SectionContent, + ValidatedPasswordField, + ValidatedTextField +} from '../../components'; +import { MqttSettings } from '../../types'; +import { numberValue, updateValue, useRest } from '../../utils'; +import * as MqttApi from '../../api/mqtt'; + +const MqttSettingsForm: FC = () => { + const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ + read: MqttApi.readMqttSettings, + update: MqttApi.updateMqttSettings + }); + + const [fieldErrors, setFieldErrors] = useState(); + + const updateFormValue = updateValue(setData); + + const content = () => { + if (!data) { + return ; + } + + const validateAndSubmit = async () => { + try { + setFieldErrors(undefined); + await validate(MQTT_SETTINGS_VALIDATOR, data); + saveData(); + } catch (errors: any) { + setFieldErrors(errors); + } + }; + + return ( + <> + } + label="Enable MQTT" + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 (default) + 1 + 2 + + + + } + label="Set Clean Session" + /> + } + label="Always use Retain Flag" + /> + + Formatting + + + Nested in a single topic + As individual topics + + } + label="Publish command output to a 'response' topic" + /> + } + label="Publish single value topics on change" + /> + + } + label="Enable MQTT Discovery (for Home Assistant, Domoticz)" + /> + + {data.ha_enabled && ( + + + + )} + + Publish Intervals (in seconds, 0=automatic) + + + + + + + + + + + + + + + + + + + + + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default MqttSettingsForm; diff --git a/interface/src/framework/mqtt/MqttStatusForm.tsx b/interface/src/framework/mqtt/MqttStatusForm.tsx new file mode 100644 index 000000000..b39fff4c7 --- /dev/null +++ b/interface/src/framework/mqtt/MqttStatusForm.tsx @@ -0,0 +1,142 @@ +import { FC } from 'react'; +import { Avatar, Button, Divider, List, ListItem, ListItemAvatar, ListItemText, Theme, useTheme } from '@mui/material'; + +import DeviceHubIcon from '@mui/icons-material/DeviceHub'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import ReportIcon from '@mui/icons-material/Report'; +import SpeakerNotesOffIcon from '@mui/icons-material/SpeakerNotesOff'; + +import { ButtonRow, FormLoader, SectionContent } from '../../components'; +import { MqttStatus, MqttDisconnectReason } from '../../types'; +import * as MqttApi from '../../api/mqtt'; +import { useRest } from '../../utils'; + +export const mqttStatusHighlight = ({ enabled, connected }: MqttStatus, theme: Theme) => { + if (!enabled) { + return theme.palette.info.main; + } + if (connected) { + return theme.palette.success.main; + } + return theme.palette.error.main; +}; + +export const mqttPublishHighlight = ({ mqtt_fails }: MqttStatus, theme: Theme) => { + if (mqtt_fails === 0) return theme.palette.success.main; + + if (mqtt_fails < 10) return theme.palette.warning.main; + + return theme.palette.error.main; +}; + +export const mqttStatus = ({ enabled, connected }: MqttStatus) => { + if (!enabled) { + return 'Not enabled'; + } + if (connected) { + return 'Connected'; + } + return 'Disconnected'; +}; + +export const disconnectReason = ({ disconnect_reason }: MqttStatus) => { + switch (disconnect_reason) { + case MqttDisconnectReason.TCP_DISCONNECTED: + return 'TCP disconnected'; + case MqttDisconnectReason.MQTT_UNACCEPTABLE_PROTOCOL_VERSION: + return 'Unacceptable protocol version'; + case MqttDisconnectReason.MQTT_IDENTIFIER_REJECTED: + return 'Client ID rejected'; + case MqttDisconnectReason.MQTT_SERVER_UNAVAILABLE: + return 'Server unavailable'; + case MqttDisconnectReason.MQTT_MALFORMED_CREDENTIALS: + return 'Malformed credentials'; + case MqttDisconnectReason.MQTT_NOT_AUTHORIZED: + return 'Not authorized'; + case MqttDisconnectReason.ESP8266_NOT_ENOUGH_SPACE: + return 'Device out of memory'; + case MqttDisconnectReason.TLS_BAD_FINGERPRINT: + return 'Server fingerprint invalid'; + default: + return 'Unknown'; + } +}; + +const MqttStatusForm: FC = () => { + const { loadData, data, errorMessage } = useRest({ read: MqttApi.readMqttStatus }); + + const theme = useTheme(); + + const content = () => { + if (!data) { + return ; + } + + const renderConnectionStatus = () => { + if (data.connected) { + return ( + <> + + + # + + + + + + + + + + + + + + ); + } + return ( + <> + + + + + + + + + + + ); + }; + + return ( + <> + + + + + + + + + + + {data.enabled && renderConnectionStatus()} + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default MqttStatusForm; diff --git a/interface/src/framework/network/NetworkConnection.tsx b/interface/src/framework/network/NetworkConnection.tsx new file mode 100644 index 000000000..27bf6d8cb --- /dev/null +++ b/interface/src/framework/network/NetworkConnection.tsx @@ -0,0 +1,72 @@ +import React, { FC, useCallback, useContext, useState } from 'react'; +import { Navigate, Routes, Route, useNavigate } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from '../../components'; +import { WiFiNetwork } from '../../types'; +import { AuthenticatedContext } from '../../contexts/authentication'; +import { WiFiConnectionContext } from './WiFiConnectionContext'; +import NetworkStatusForm from './NetworkStatusForm'; +import WiFiNetworkScanner from './WiFiNetworkScanner'; +import NetworkSettingsForm from './NetworkSettingsForm'; + +const NetworkConnection: FC = () => { + useLayoutTitle('Network Connection'); + + const authenticatedContext = useContext(AuthenticatedContext); + const navigate = useNavigate(); + const { routerTab } = useRouterTab(); + + const [selectedNetwork, setSelectedNetwork] = useState(); + + const selectNetwork = useCallback( + (network: WiFiNetwork) => { + setSelectedNetwork(network); + navigate('settings'); + }, + [navigate] + ); + + const deselectNetwork = useCallback(() => { + setSelectedNetwork(undefined); + }, []); + + return ( + + + + + + + + } /> + + + + } + /> + + + + } + /> + } /> + + + ); +}; + +export default NetworkConnection; diff --git a/interface/src/framework/network/NetworkSettingsForm.tsx b/interface/src/framework/network/NetworkSettingsForm.tsx new file mode 100644 index 000000000..b15eb66f5 --- /dev/null +++ b/interface/src/framework/network/NetworkSettingsForm.tsx @@ -0,0 +1,257 @@ +import { FC, useContext, useEffect, useState } from 'react'; + +import { + Avatar, + Button, + Checkbox, + IconButton, + List, + ListItem, + ListItemAvatar, + ListItemSecondaryAction, + ListItemText, + Typography +} from '@mui/material'; + +import LockOpenIcon from '@mui/icons-material/LockOpen'; +import DeleteIcon from '@mui/icons-material/Delete'; +import SaveIcon from '@mui/icons-material/Save'; +import LockIcon from '@mui/icons-material/Lock'; + +import { + BlockFormControlLabel, + ButtonRow, + FormLoader, + SectionContent, + ValidatedPasswordField, + ValidatedTextField +} from '../../components'; +import { NetworkSettings } from '../../types'; +import * as NetworkApi from '../../api/network'; +import { numberValue, updateValue, useRest } from '../../utils'; + +import { WiFiConnectionContext } from './WiFiConnectionContext'; +import { isNetworkOpen, networkSecurityMode } from './WiFiNetworkSelector'; +import { ValidateFieldsError } from 'async-validator'; +import { validate } from '../../validators'; +import { createNetworkSettingsValidator } from '../../validators/network'; + +const WiFiSettingsForm: FC = () => { + const { selectedNetwork, deselectNetwork } = useContext(WiFiConnectionContext); + + const [initialized, setInitialized] = useState(false); + const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ + read: NetworkApi.readNetworkSettings, + update: NetworkApi.updateNetworkSettings + }); + + useEffect(() => { + if (!initialized && data) { + if (selectedNetwork) { + setData({ + ssid: selectedNetwork.ssid, + password: '', + hostname: data?.hostname, + static_ip_config: false, + enableIPv6: false, + bandwidth20: false, + tx_power: 20, + nosleep: false + }); + } + setInitialized(true); + } + }, [initialized, setInitialized, data, setData, selectedNetwork]); + + const updateFormValue = updateValue(setData); + + const [fieldErrors, setFieldErrors] = useState(); + + useEffect(() => deselectNetwork, [deselectNetwork]); + + const content = () => { + if (!data) { + return ; + } + + const validateAndSubmit = async () => { + try { + setFieldErrors(undefined); + await validate(createNetworkSettingsValidator(data), data); + saveData(); + } catch (errors: any) { + setFieldErrors(errors); + } + }; + + return ( + <> + + WiFi + + {selectedNetwork ? ( + + + + {isNetworkOpen(selectedNetwork) ? : } + + + + + + + + + + ) : ( + + )} + {(!selectedNetwork || !isNetworkOpen(selectedNetwork)) && ( + + )} + + + + } + label="Disable WiFi Sleep Mode" + /> + + } + label="Use Lower WiFi Bandwidth" + /> + + + General + + + + + } + label="Enable IPv6 support" + /> + + } + label="Use Fixed IP address" + /> + {data.static_ip_config && ( + <> + + + + + + + )} + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default WiFiSettingsForm; diff --git a/interface/src/framework/network/NetworkStatusForm.tsx b/interface/src/framework/network/NetworkStatusForm.tsx new file mode 100644 index 000000000..4fd490c5a --- /dev/null +++ b/interface/src/framework/network/NetworkStatusForm.tsx @@ -0,0 +1,179 @@ +import { FC } from 'react'; +import { Avatar, Button, Divider, List, ListItem, ListItemAvatar, ListItemText, Theme, useTheme } from '@mui/material'; + +import SettingsInputComponentIcon from '@mui/icons-material/SettingsInputComponent'; +import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; +import DeviceHubIcon from '@mui/icons-material/DeviceHub'; +import WifiIcon from '@mui/icons-material/Wifi'; +import DnsIcon from '@mui/icons-material/Dns'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import RouterIcon from '@mui/icons-material/Router'; + +import { ButtonRow, FormLoader, SectionContent } from '../../components'; +import { NetworkConnectionStatus, NetworkStatus } from '../../types'; +import * as NetworkApi from '../../api/network'; +import { useRest } from '../../utils'; + +const isConnected = ({ status }: NetworkStatus) => + status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED || + status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED; + +const networkStatusHighlight = ({ status }: NetworkStatus, theme: Theme) => { + switch (status) { + case NetworkConnectionStatus.WIFI_STATUS_IDLE: + case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: + case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD: + return theme.palette.info.main; + case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: + case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: + return theme.palette.success.main; + case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: + case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: + return theme.palette.error.main; + default: + return theme.palette.warning.main; + } +}; + +const networkStatus = ({ status }: NetworkStatus) => { + switch (status) { + case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD: + return 'Inactive'; + case NetworkConnectionStatus.WIFI_STATUS_IDLE: + return 'Idle'; + case NetworkConnectionStatus.WIFI_STATUS_NO_SSID_AVAIL: + return 'No SSID Available'; + case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: + return 'Connected (WiFi)'; + case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: + return 'Connected (Wired)'; + case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: + return 'Connection Failed'; + case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: + return 'Connection Lost'; + case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: + return 'Disconnected'; + default: + return 'Unknown'; + } +}; + +export const isWiFi = ({ status }: NetworkStatus) => status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED; +export const isEthernet = ({ status }: NetworkStatus) => status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED; + +const dnsServers = ({ dns_ip_1, dns_ip_2 }: NetworkStatus) => { + if (!dns_ip_1) { + return 'none'; + } + return dns_ip_1 + (dns_ip_2 ? ',' + dns_ip_2 : ''); +}; + +const IPs = (status: NetworkStatus) => { + if (!status.local_ipv6 || status.local_ipv6 === '0000:0000:0000:0000:0000:0000:0000:0000') { + return status.local_ip; + } + if (!status.local_ip || status.local_ip === '0.0.0.0') { + return status.local_ipv6; + } + return status.local_ip + ', ' + status.local_ipv6; +}; + +const NetworkStatusForm: FC = () => { + const { loadData, data, errorMessage } = useRest({ read: NetworkApi.readNetworkStatus }); + + const theme = useTheme(); + + const content = () => { + if (!data) { + return ; + } + + return ( + <> + + + + + {isWiFi(data) && } + {isEthernet(data) && } + + + + + + {isWiFi(data) && ( + <> + + + + + + + + + + + )} + {isConnected(data) && ( + <> + + + IP + + + + + + + + + + + + + + + + # + + + + + + + + + + + + + + + + + + + + + + + + )} + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default NetworkStatusForm; diff --git a/interface/src/framework/network/WiFiConnectionContext.tsx b/interface/src/framework/network/WiFiConnectionContext.tsx new file mode 100644 index 000000000..db2e1b2af --- /dev/null +++ b/interface/src/framework/network/WiFiConnectionContext.tsx @@ -0,0 +1,11 @@ +import { createContext } from 'react'; +import { WiFiNetwork } from '../../types'; + +export interface WiFiConnectionContextValue { + selectedNetwork?: WiFiNetwork; + selectNetwork: (network: WiFiNetwork) => void; + deselectNetwork: () => void; +} + +const WiFiConnectionContextDefaultValue = {} as WiFiConnectionContextValue; +export const WiFiConnectionContext = createContext(WiFiConnectionContextDefaultValue); diff --git a/interface/src/framework/network/WiFiNetworkScanner.tsx b/interface/src/framework/network/WiFiNetworkScanner.tsx new file mode 100644 index 000000000..9f3798f5f --- /dev/null +++ b/interface/src/framework/network/WiFiNetworkScanner.tsx @@ -0,0 +1,101 @@ +import { useEffect, FC, useState, useCallback, useRef } from 'react'; +import { useSnackbar } from 'notistack'; + +import { Button } from '@mui/material'; +import PermScanWifiIcon from '@mui/icons-material/PermScanWifi'; + +import * as NetworkApi from '../../api/network'; +import { WiFiNetwork, WiFiNetworkList } from '../../types'; +import { ButtonRow, FormLoader, SectionContent } from '../../components'; +import { extractErrorMessage } from '../../utils'; + +import WiFiNetworkSelector from './WiFiNetworkSelector'; + +const NUM_POLLS = 10; +const POLLING_FREQUENCY = 500; + +const compareNetworks = (network1: WiFiNetwork, network2: WiFiNetwork) => { + if (network1.rssi < network2.rssi) return 1; + if (network1.rssi > network2.rssi) return -1; + return 0; +}; + +const WiFiNetworkScanner: FC = () => { + const { enqueueSnackbar } = useSnackbar(); + + const pollCount = useRef(0); + const [networkList, setNetworkList] = useState(); + const [errorMessage, setErrorMessage] = useState(); + + const finishedWithError = useCallback( + (message: string) => { + enqueueSnackbar(message, { variant: 'error' }); + setNetworkList(undefined); + setErrorMessage(message); + }, + [enqueueSnackbar] + ); + + const pollNetworkList = useCallback(async () => { + try { + const response = await NetworkApi.listNetworks(); + if (response.status === 202) { + const completedPollCount = pollCount.current + 1; + if (completedPollCount < NUM_POLLS) { + pollCount.current = completedPollCount; + setTimeout(pollNetworkList, POLLING_FREQUENCY); + } else { + finishedWithError('Device did not return network list in timely manner'); + } + } else { + const newNetworkList = response.data; + newNetworkList.networks.sort(compareNetworks); + setNetworkList(newNetworkList); + } + } catch (error: any) { + finishedWithError(extractErrorMessage(error, 'Problem listing WiFi networks')); + } + }, [finishedWithError]); + + const startNetworkScan = useCallback(async () => { + pollCount.current = 0; + setNetworkList(undefined); + setErrorMessage(undefined); + try { + await NetworkApi.scanNetworks(); + setTimeout(pollNetworkList, POLLING_FREQUENCY); + } catch (error: any) { + finishedWithError(extractErrorMessage(error, 'Problem scanning for WiFi networks')); + } + }, [finishedWithError, pollNetworkList]); + + useEffect(() => { + startNetworkScan(); + }, [startNetworkScan]); + + const renderNetworkScanner = () => { + if (!networkList) { + return ; + } + return ; + }; + + return ( + + {renderNetworkScanner()} + + + + + ); +}; + +export default WiFiNetworkScanner; diff --git a/interface/src/framework/network/WiFiNetworkSelector.tsx b/interface/src/framework/network/WiFiNetworkSelector.tsx new file mode 100644 index 000000000..7a1c0bec5 --- /dev/null +++ b/interface/src/framework/network/WiFiNetworkSelector.tsx @@ -0,0 +1,69 @@ +import { FC, useContext } from 'react'; + +import { Avatar, Badge, List, ListItem, ListItemAvatar, ListItemIcon, ListItemText } from '@mui/material'; + +import LockOpenIcon from '@mui/icons-material/LockOpen'; +import LockIcon from '@mui/icons-material/Lock'; +import WifiIcon from '@mui/icons-material/Wifi'; + +import { MessageBox } from '../../components'; + +import { WiFiEncryptionType, WiFiNetwork, WiFiNetworkList } from '../../types'; + +import { WiFiConnectionContext } from './WiFiConnectionContext'; + +interface WiFiNetworkSelectorProps { + networkList: WiFiNetworkList; +} + +export const isNetworkOpen = ({ encryption_type }: WiFiNetwork) => + encryption_type === WiFiEncryptionType.WIFI_AUTH_OPEN; + +export const networkSecurityMode = ({ encryption_type }: WiFiNetwork) => { + switch (encryption_type) { + case WiFiEncryptionType.WIFI_AUTH_WEP: + case WiFiEncryptionType.WIFI_AUTH_WEP_PSK: + return 'WEP'; + case WiFiEncryptionType.WIFI_AUTH_WEP2_PSK: + return 'WEP2'; + case WiFiEncryptionType.WIFI_AUTH_WPA_WPA2_PSK: + return 'WPA/WEP2'; + case WiFiEncryptionType.WIFI_AUTH_WPA2_ENTERPRISE: + return 'WEP2 Enterprise'; + case WiFiEncryptionType.WIFI_AUTH_OPEN: + return 'None'; + default: + return 'Unknown'; + } +}; + +const WiFiNetworkSelector: FC = ({ networkList }) => { + const wifiConnectionContext = useContext(WiFiConnectionContext); + + const renderNetwork = (network: WiFiNetwork) => { + return ( + wifiConnectionContext.selectNetwork(network)}> + + {isNetworkOpen(network) ? : } + + + + + + + + + ); + }; + + if (networkList.networks.length === 0) { + return ; + } + + return {networkList.networks.map(renderNetwork)}; +}; + +export default WiFiNetworkSelector; diff --git a/interface/src/framework/ntp/NTPSettingsForm.tsx b/interface/src/framework/ntp/NTPSettingsForm.tsx new file mode 100644 index 000000000..557239625 --- /dev/null +++ b/interface/src/framework/ntp/NTPSettingsForm.tsx @@ -0,0 +1,101 @@ +import { FC, useState } from 'react'; +import { ValidateFieldsError } from 'async-validator'; + +import { Button, Checkbox, MenuItem } from '@mui/material'; +import SaveIcon from '@mui/icons-material/Save'; + +import { validate } from '../../validators'; +import { BlockFormControlLabel, ButtonRow, FormLoader, SectionContent, ValidatedTextField } from '../../components'; +import { NTPSettings } from '../../types'; +import { updateValue, useRest } from '../../utils'; +import * as NTPApi from '../../api/ntp'; +import { selectedTimeZone, timeZoneSelectItems, TIME_ZONES } from './TZ'; +import { NTP_SETTINGS_VALIDATOR } from '../../validators/ntp'; + +const NTPSettingsForm: FC = () => { + const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ + read: NTPApi.readNTPSettings, + update: NTPApi.updateNTPSettings + }); + + const updateFormValue = updateValue(setData); + + const [fieldErrors, setFieldErrors] = useState(); + + const content = () => { + if (!data) { + return ; + } + + const validateAndSubmit = async () => { + try { + setFieldErrors(undefined); + await validate(NTP_SETTINGS_VALIDATOR, data); + saveData(); + } catch (errors: any) { + setFieldErrors(errors); + } + }; + + const changeTimeZone = (event: React.ChangeEvent) => { + setData({ + ...data, + tz_label: event.target.value, + tz_format: TIME_ZONES[event.target.value] + }); + }; + + return ( + <> + } + label="Enable NTP" + /> + + + Time zone... + {timeZoneSelectItems()} + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default NTPSettingsForm; diff --git a/interface/src/framework/ntp/NTPStatusForm.tsx b/interface/src/framework/ntp/NTPStatusForm.tsx new file mode 100644 index 000000000..0f0659954 --- /dev/null +++ b/interface/src/framework/ntp/NTPStatusForm.tsx @@ -0,0 +1,218 @@ +import { FC, useContext, useState } from 'react'; +import { useSnackbar } from 'notistack'; + +import { + Avatar, + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Divider, + List, + ListItem, + ListItemAvatar, + ListItemText, + TextField, + Theme, + useTheme +} from '@mui/material'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import AccessTimeIcon from '@mui/icons-material/AccessTime'; +import SwapVerticalCircleIcon from '@mui/icons-material/SwapVerticalCircle'; +import UpdateIcon from '@mui/icons-material/Update'; +import DnsIcon from '@mui/icons-material/Dns'; +import AvTimerIcon from '@mui/icons-material/AvTimer'; +import CancelIcon from '@mui/icons-material/Cancel'; + +import * as NTPApi from '../../api/ntp'; +import { NTPStatus, NTPSyncStatus } from '../../types'; +import { ButtonRow, FormLoader, SectionContent } from '../../components'; +import { extractErrorMessage, formatDateTime, formatDuration, formatLocalDateTime, useRest } from '../../utils'; +import { AuthenticatedContext } from '../../contexts/authentication'; + +export const isNtpActive = ({ status }: NTPStatus) => status === NTPSyncStatus.NTP_ACTIVE; + +export const ntpStatusHighlight = ({ status }: NTPStatus, theme: Theme) => { + switch (status) { + case NTPSyncStatus.NTP_INACTIVE: + return theme.palette.info.main; + case NTPSyncStatus.NTP_ACTIVE: + return theme.palette.success.main; + default: + return theme.palette.error.main; + } +}; + +export const ntpStatus = ({ status }: NTPStatus) => { + switch (status) { + case NTPSyncStatus.NTP_INACTIVE: + return 'Inactive'; + case NTPSyncStatus.NTP_ACTIVE: + return 'Active'; + default: + return 'Unknown'; + } +}; + +const NTPStatusForm: FC = () => { + const { loadData, data, errorMessage } = useRest({ read: NTPApi.readNTPStatus }); + const [localTime, setLocalTime] = useState(''); + const [settingTime, setSettingTime] = useState(false); + const [processing, setProcessing] = useState(false); + const { enqueueSnackbar } = useSnackbar(); + const { me } = useContext(AuthenticatedContext); + + const updateLocalTime = (event: React.ChangeEvent) => setLocalTime(event.target.value); + + const openSetTime = () => { + setLocalTime(formatLocalDateTime(new Date())); + setSettingTime(true); + }; + + const theme = useTheme(); + + const configureTime = async () => { + setProcessing(true); + try { + await NTPApi.updateTime({ + local_time: formatLocalDateTime(new Date(localTime)) + }); + enqueueSnackbar('Time set', { variant: 'success' }); + setSettingTime(false); + loadData(); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem updating time'), { variant: 'error' }); + } finally { + setProcessing(false); + } + }; + + const renderSetTimeDialog = () => { + return ( + setSettingTime(false)}> + Set Time + + Enter local date and time below to set the device's time. + + + + + + + + ); + }; + + const content = () => { + if (!data) { + return ; + } + + return ( + <> + + + + + + + + + + + {isNtpActive(data) && ( + <> + + + + + + + + + + + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {me.admin && data && !isNtpActive(data) && ( + + + + + + )} + + {renderSetTimeDialog()} + + ); + }; + + return ( + + {content()} + + ); +}; + +export default NTPStatusForm; diff --git a/interface/src/framework/ntp/NetworkTime.tsx b/interface/src/framework/ntp/NetworkTime.tsx new file mode 100644 index 000000000..309edff75 --- /dev/null +++ b/interface/src/framework/ntp/NetworkTime.tsx @@ -0,0 +1,40 @@ +import React, { FC, useContext } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from '../../components'; +import { AuthenticatedContext } from '../../contexts/authentication'; + +import NTPStatusForm from './NTPStatusForm'; +import NTPSettingsForm from './NTPSettingsForm'; + +const NetworkTime: FC = () => { + useLayoutTitle('Network Time'); + + const authenticatedContext = useContext(AuthenticatedContext); + const { routerTab } = useRouterTab(); + + return ( + <> + + + + + + } /> + + + + } + /> + } /> + + + ); +}; + +export default NetworkTime; diff --git a/interface/src/ntp/TZ.tsx b/interface/src/framework/ntp/TZ.tsx similarity index 99% rename from interface/src/ntp/TZ.tsx rename to interface/src/framework/ntp/TZ.tsx index 099300d66..967475ea0 100644 --- a/interface/src/ntp/TZ.tsx +++ b/interface/src/framework/ntp/TZ.tsx @@ -1,4 +1,4 @@ -import MenuItem from '@material-ui/core/MenuItem'; +import { MenuItem } from '@mui/material'; type TimeZones = { [name: string]: string; diff --git a/interface/src/framework/security/GenerateToken.tsx b/interface/src/framework/security/GenerateToken.tsx new file mode 100644 index 000000000..e834b9d26 --- /dev/null +++ b/interface/src/framework/security/GenerateToken.tsx @@ -0,0 +1,79 @@ +import { FC, useCallback, useState, useEffect } from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Box, + LinearProgress, + Typography, + TextField, + Button +} from '@mui/material'; + +import CloseIcon from '@mui/icons-material/Close'; + +import { extractErrorMessage } from '../../utils'; +import { useSnackbar } from 'notistack'; +import { MessageBox } from '../../components'; +import * as SecurityApi from '../../api/security'; +import { Token } from '../../types'; + +interface GenerateTokenProps { + username?: string; + onClose: () => void; +} + +const GenerateToken: FC = ({ username, onClose }) => { + const [token, setToken] = useState(); + const open = !!username; + + const { enqueueSnackbar } = useSnackbar(); + + const getToken = useCallback(async () => { + try { + setToken((await SecurityApi.generateToken(username)).data); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem generating token'), { variant: 'error' }); + } + }, [username, enqueueSnackbar]); + + useEffect(() => { + if (open) { + getToken(); + } + }, [open, getToken]); + + return ( + + Access Token for {username} + + {token ? ( + <> + + + + + + ) : ( + + + Generating token… + + )} + + + + + + ); +}; + +export default GenerateToken; diff --git a/interface/src/framework/security/ManageUsersForm.tsx b/interface/src/framework/security/ManageUsersForm.tsx new file mode 100644 index 000000000..f5dbfaae2 --- /dev/null +++ b/interface/src/framework/security/ManageUsersForm.tsx @@ -0,0 +1,176 @@ +import { FC, useContext, useState } from 'react'; + +import { Button, IconButton, Table, TableBody, TableCell, TableFooter, TableHead, TableRow } from '@mui/material'; +import SaveIcon from '@mui/icons-material/Save'; +import DeleteIcon from '@mui/icons-material/Delete'; +import PersonAddIcon from '@mui/icons-material/PersonAdd'; +import EditIcon from '@mui/icons-material/Edit'; +import CheckIcon from '@mui/icons-material/Check'; +import CloseIcon from '@mui/icons-material/Close'; +import VpnKeyIcon from '@mui/icons-material/VpnKey'; + +import * as SecurityApi from '../../api/security'; +import { SecuritySettings, User } from '../../types'; +import { ButtonRow, FormLoader, MessageBox, SectionContent } from '../../components'; +import { createUserValidator } from '../../validators'; +import { useRest } from '../../utils'; +import { AuthenticatedContext } from '../../contexts/authentication'; + +import GenerateToken from './GenerateToken'; +import UserForm from './UserForm'; + +function compareUsers(a: User, b: User) { + if (a.username < b.username) { + return -1; + } + if (a.username > b.username) { + return 1; + } + return 0; +} + +const ManageUsersForm: FC = () => { + const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ + read: SecurityApi.readSecuritySettings, + update: SecurityApi.updateSecuritySettings + }); + + const [user, setUser] = useState(); + const [creating, setCreating] = useState(false); + const [generatingToken, setGeneratingToken] = useState(); + const authenticatedContext = useContext(AuthenticatedContext); + + const content = () => { + if (!data) { + return ; + } + + const noAdminConfigured = () => !data.users.find((u) => u.admin); + + const removeUser = (toRemove: User) => { + const users = data.users.filter((u) => u.username !== toRemove.username); + setData({ ...data, users }); + }; + + const createUser = () => { + setCreating(true); + setUser({ + username: '', + password: '', + admin: true + }); + }; + + const editUser = (toEdit: User) => { + setCreating(false); + setUser({ ...toEdit }); + }; + + const cancelEditingUser = () => { + setUser(undefined); + }; + + const doneEditingUser = () => { + if (user) { + const users = [...data.users.filter((u) => u.username !== user.username), user]; + setData({ ...data, users }); + setUser(undefined); + } + }; + + const closeGenerateToken = () => { + setGeneratingToken(undefined); + }; + + const generateToken = (username: string) => { + setGeneratingToken(username); + }; + + const onSubmit = async () => { + await saveData(); + authenticatedContext.refresh(); + }; + + return ( + <> + + + + Username + is Admin? + + + + + {data.users.sort(compareUsers).map((u) => ( + + + {u.username} + + {u.admin ? : } + + generateToken(u.username)} + > + + + removeUser(u)}> + + + editUser(u)}> + + + + + ))} + + + + + + + + + +
+ {noAdminConfigured() && ( + + )} + + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default ManageUsersForm; diff --git a/interface/src/framework/security/Security.tsx b/interface/src/framework/security/Security.tsx new file mode 100644 index 000000000..f4f892407 --- /dev/null +++ b/interface/src/framework/security/Security.tsx @@ -0,0 +1,31 @@ +import { FC } from 'react'; +import { Navigate, Routes, Route } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { RouterTabs, useRouterTab, useLayoutTitle } from '../../components'; + +import SecuritySettingsForm from './SecuritySettingsForm'; +import ManageUsersForm from './ManageUsersForm'; + +const Security: FC = () => { + useLayoutTitle('Security'); + + const { routerTab } = useRouterTab(); + + return ( + <> + + + + + + } /> + } /> + } /> + + + ); +}; + +export default Security; diff --git a/interface/src/framework/security/SecuritySettingsForm.tsx b/interface/src/framework/security/SecuritySettingsForm.tsx new file mode 100644 index 000000000..0a300a3a2 --- /dev/null +++ b/interface/src/framework/security/SecuritySettingsForm.tsx @@ -0,0 +1,80 @@ +import { FC, useContext, useState } from 'react'; +import { ValidateFieldsError } from 'async-validator'; + +import { Button } from '@mui/material'; +import SaveIcon from '@mui/icons-material/Save'; + +import * as SecurityApi from '../../api/security'; +import { SecuritySettings } from '../../types'; +import { ButtonRow, FormLoader, MessageBox, SectionContent, ValidatedPasswordField } from '../../components'; +import { SECURITY_SETTINGS_VALIDATOR, validate } from '../../validators'; +import { updateValue, useRest } from '../../utils'; +import { AuthenticatedContext } from '../../contexts/authentication'; + +const SecuritySettingsForm: FC = () => { + const [fieldErrors, setFieldErrors] = useState(); + const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ + read: SecurityApi.readSecuritySettings, + update: SecurityApi.updateSecuritySettings + }); + + const authenticatedContext = useContext(AuthenticatedContext); + const updateFormValue = updateValue(setData); + + const content = () => { + if (!data) { + return ; + } + + const validateAndSubmit = async () => { + try { + setFieldErrors(undefined); + await validate(SECURITY_SETTINGS_VALIDATOR, data); + await saveData(); + await authenticatedContext.refresh(); + } catch (errors: any) { + setFieldErrors(errors); + } + }; + + return ( + <> + + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default SecuritySettingsForm; diff --git a/interface/src/framework/security/UserForm.tsx b/interface/src/framework/security/UserForm.tsx new file mode 100644 index 000000000..380e13652 --- /dev/null +++ b/interface/src/framework/security/UserForm.tsx @@ -0,0 +1,100 @@ +import { FC, useState, useEffect } from 'react'; +import Schema, { ValidateFieldsError } from 'async-validator'; + +import CancelIcon from '@mui/icons-material/Cancel'; +import PersonAddIcon from '@mui/icons-material/PersonAdd'; + +import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; + +import { BlockFormControlLabel, ValidatedPasswordField, ValidatedTextField } from '../../components'; +import { User } from '../../types'; +import { updateValue } from '../../utils'; +import { validate } from '../../validators'; + +interface UserFormProps { + creating: boolean; + validator: Schema; + + user?: User; + setUser: React.Dispatch>; + + onDoneEditing: () => void; + onCancelEditing: () => void; +} + +const UserForm: FC = ({ creating, validator, user, setUser, onDoneEditing, onCancelEditing }) => { + const updateFormValue = updateValue(setUser); + const [fieldErrors, setFieldErrors] = useState(); + const open = !!user; + + useEffect(() => { + if (open) { + setFieldErrors(undefined); + } + }, [open]); + + const validateAndDone = async () => { + if (user) { + try { + setFieldErrors(undefined); + await validate(validator, user); + onDoneEditing(); + } catch (errors: any) { + setFieldErrors(errors); + } + } + }; + + return ( + + {user && ( + <> + {creating ? 'Add' : 'Modify'} User + + + + } + label="is Admin?" + /> + + + + + + + )} + + ); +}; + +export default UserForm; diff --git a/interface/src/framework/system/FirmwareFileUpload.tsx b/interface/src/framework/system/FirmwareFileUpload.tsx new file mode 100644 index 000000000..824ed3cdf --- /dev/null +++ b/interface/src/framework/system/FirmwareFileUpload.tsx @@ -0,0 +1,32 @@ +import { AxiosPromise } from 'axios'; +import { FC } from 'react'; + +import { FileUploadConfig } from '../../api/endpoints'; +import { MessageBox, SingleUpload, useFileUpload } from '../../components'; + +interface UploadFirmwareProps { + uploadFirmware: (file: File, config?: FileUploadConfig) => AxiosPromise; +} + +const FirmwareFileUpload: FC = ({ uploadFirmware }) => { + const [uploadFile, cancelUpload, uploading, uploadProgress] = useFileUpload({ upload: uploadFirmware }); + + return ( + <> + + + + ); +}; + +export default FirmwareFileUpload; diff --git a/interface/src/framework/system/FirmwareRestartMonitor.tsx b/interface/src/framework/system/FirmwareRestartMonitor.tsx new file mode 100644 index 000000000..1eef254f9 --- /dev/null +++ b/interface/src/framework/system/FirmwareRestartMonitor.tsx @@ -0,0 +1,43 @@ +import { useEffect } from 'react'; +import { FC, useRef, useState } from 'react'; + +import * as SystemApi from '../../api/system'; +import { FormLoader } from '../../components'; + +const RESTART_TIMEOUT = 2 * 60 * 1000; +const POLL_TIMEOUT = 2000; +const POLL_INTERVAL = 5000; + +const FirmwareRestartMonitor: FC = () => { + const [failed, setFailed] = useState(false); + const [timeoutId, setTimeoutId] = useState(); + + const timeoutAt = useRef(new Date().getTime() + RESTART_TIMEOUT); + const poll = useRef(async () => { + try { + await SystemApi.readSystemStatus(POLL_TIMEOUT); + document.location.href = '/firmwareUpdated'; + } catch (error: any) { + if (new Date().getTime() < timeoutAt.current) { + setTimeoutId(setTimeout(poll.current, POLL_INTERVAL)); + } else { + setFailed(true); + } + } + }); + + useEffect(() => { + poll.current(); + }, []); + + useEffect(() => () => timeoutId && clearTimeout(timeoutId), [timeoutId]); + + return ( + + ); +}; + +export default FirmwareRestartMonitor; diff --git a/interface/src/framework/system/OTASettingsForm.tsx b/interface/src/framework/system/OTASettingsForm.tsx new file mode 100644 index 000000000..cec00f8d2 --- /dev/null +++ b/interface/src/framework/system/OTASettingsForm.tsx @@ -0,0 +1,97 @@ +import { FC, useState } from 'react'; + +import { Button, Checkbox } from '@mui/material'; +import SaveIcon from '@mui/icons-material/Save'; + +import * as SystemApi from '../../api/system'; +import { + BlockFormControlLabel, + ButtonRow, + FormLoader, + SectionContent, + ValidatedPasswordField, + ValidatedTextField +} from '../../components'; +import { OTASettings } from '../../types'; +import { numberValue, updateValue, useRest } from '../../utils'; + +import { ValidateFieldsError } from 'async-validator'; +import { validate } from '../../validators'; +import { OTA_SETTINGS_VALIDATOR } from '../../validators/system'; + +const OTASettingsForm: FC = () => { + const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ + read: SystemApi.readOTASettings, + update: SystemApi.updateOTASettings + }); + + const updateFormValue = updateValue(setData); + + const [fieldErrors, setFieldErrors] = useState(); + + const content = () => { + if (!data) { + return ; + } + + const validateAndSubmit = async () => { + try { + setFieldErrors(undefined); + await validate(OTA_SETTINGS_VALIDATOR, data); + saveData(); + } catch (errors: any) { + setFieldErrors(errors); + } + }; + + return ( + <> + } + label="Enable OTA Updates" + /> + + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default OTASettingsForm; diff --git a/interface/src/framework/system/System.tsx b/interface/src/framework/system/System.tsx new file mode 100644 index 000000000..553f60ad0 --- /dev/null +++ b/interface/src/framework/system/System.tsx @@ -0,0 +1,60 @@ +import React, { FC, useContext } from 'react'; +import { Navigate, Routes, Route } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { useRouterTab, RouterTabs, useLayoutTitle, RequireAdmin } from '../../components'; +import { AuthenticatedContext } from '../../contexts/authentication'; +import { FeaturesContext } from '../../contexts/features'; +import UploadFirmwareForm from './UploadFirmwareForm'; +import SystemStatusForm from './SystemStatusForm'; +import OTASettingsForm from './OTASettingsForm'; + +import SystemLog from './SystemLog'; + +const System: FC = () => { + useLayoutTitle('System'); + + const { me } = useContext(AuthenticatedContext); + const { features } = useContext(FeaturesContext); + const { routerTab } = useRouterTab(); + + return ( + <> + + + + + {features.ota && } + {features.upload_firmware && } + + + } /> + } /> + {features.ota && ( + + + + } + /> + )} + {features.upload_firmware && ( + + + + } + /> + )} + } /> + + + ); +}; + +export default System; diff --git a/interface/src/framework/system/SystemLog.tsx b/interface/src/framework/system/SystemLog.tsx new file mode 100644 index 000000000..7878691f8 --- /dev/null +++ b/interface/src/framework/system/SystemLog.tsx @@ -0,0 +1,282 @@ +import { FC, useState, useEffect, useCallback, useLayoutEffect } from 'react'; + +import { Box, styled, Button, Checkbox, MenuItem, Grid, Slider, FormLabel } from '@mui/material'; + +import * as SystemApi from '../../api/system'; +import { addAccessTokenParameter } from '../../api/authentication'; + +import { SectionContent, FormLoader, BlockFormControlLabel, ValidatedTextField } from '../../components'; + +import { LogSettings, LogEntry, LogEntries, LogLevel } from '../../types'; +import { updateValue, useRest, extractErrorMessage } from '../../utils'; + +import DownloadIcon from '@mui/icons-material/GetApp'; + +import { useSnackbar } from 'notistack'; + +import { EVENT_SOURCE_ROOT } from '../../api/endpoints'; +export const LOG_EVENTSOURCE_URL = EVENT_SOURCE_ROOT + 'log'; + +const useWindowSize = () => { + const [size, setSize] = useState([0, 0]); + useLayoutEffect(() => { + function updateSize() { + setSize([window.innerWidth, window.innerHeight]); + } + window.addEventListener('resize', updateSize); + updateSize(); + return () => window.removeEventListener('resize', updateSize); + }, []); + return size; +}; + +const LogEntryLine = styled('div')(({ theme }) => ({ + color: '#bbbbbb', + fontFamily: 'monospace', + fontSize: '14px', + letterSpacing: 'normal', + whiteSpace: 'nowrap' +})); + +const topOffset = () => document.getElementById('log-window')?.getBoundingClientRect().bottom || 0; +const leftOffset = () => document.getElementById('log-window')?.getBoundingClientRect().left || 0; + +const levelLabel = (level: LogLevel) => { + switch (level) { + case LogLevel.ERROR: + return 'ERROR'; + case LogLevel.WARNING: + return 'WARNING'; + case LogLevel.NOTICE: + return 'NOTICE'; + case LogLevel.INFO: + return 'INFO'; + case LogLevel.DEBUG: + return 'DEBUG'; + case LogLevel.TRACE: + return 'TRACE'; + default: + return ''; + } +}; + +const SystemLog: FC = () => { + useWindowSize(); + + const { loadData, data, setData } = useRest({ + read: SystemApi.readLogSettings + }); + + const [errorMessage, setErrorMessage] = useState(); + const [reconnectTimeout, setReconnectTimeout] = useState(); + const [logEntries, setLogEntries] = useState({ events: [] }); + const [lastIndex, setLastIndex] = useState(0); + + const paddedLevelLabel = (level: LogLevel) => { + const label = levelLabel(level); + return data?.compact ? ' ' + label[0] : label.padStart(8, '\xa0'); + }; + + const paddedNameLabel = (name: string) => { + const label = '[' + name + ']'; + return data?.compact ? label : label.padEnd(12, '\xa0'); + }; + + const paddedIDLabel = (id: number) => { + const label = id + ':'; + return data?.compact ? label : label.padEnd(7, '\xa0'); + }; + + const updateFormValue = updateValue(setData); + + const { enqueueSnackbar } = useSnackbar(); + + const reloadPage = () => { + window.location.reload(); + }; + + const sendSettings = async (new_max_messages: number, new_level: number) => { + if (data) { + try { + const response = await SystemApi.updateLogSettings({ + level: new_level, + max_messages: new_max_messages, + compact: data.compact + }); + if (response.status !== 200) { + enqueueSnackbar('Problem applying log settings', { variant: 'error' }); + } + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem applying log settings'), { variant: 'error' }); + } + } + }; + + const changeLevel = (event: React.ChangeEvent) => { + if (data) { + setData({ + ...data, + level: parseInt(event.target.value) + }); + sendSettings(data.max_messages, parseInt(event.target.value)); + } + }; + + const changeMaxMessages = (event: Event, value: number | number[]) => { + if (data) { + setData({ + ...data, + max_messages: value as number + }); + } + }; + + const onDownload = () => { + let result = ''; + for (let i of logEntries.events) { + result += i.t + ' ' + levelLabel(i.l) + ' ' + i.i + ': [' + i.n + '] ' + i.m + '\n'; + } + const a = document.createElement('a'); + a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(result)); + a.setAttribute('download', 'log.txt'); + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + }; + + const onMessage = (event: MessageEvent) => { + const rawData = event.data; + if (typeof rawData === 'string' || rawData instanceof String) { + const logentry = JSON.parse(rawData as string) as LogEntry; + if (logentry.i > lastIndex) { + setLastIndex(logentry.i); + setLogEntries((old) => ({ events: [...old.events, logentry] })); + } + } + }; + + const fetchLog = useCallback(async () => { + try { + setLogEntries((await SystemApi.readLogEntries()).data); + } catch (error: any) { + setErrorMessage(extractErrorMessage(error, 'Failed to fetch log')); + } + }, []); + + useEffect(() => { + fetchLog(); + }, [fetchLog]); + + useEffect(() => { + const es = new EventSource(addAccessTokenParameter(LOG_EVENTSOURCE_URL)); + es.onmessage = onMessage; + es.onerror = () => { + if (reconnectTimeout) { + es.close(); + setReconnectTimeout(setTimeout(reloadPage, 1000)); + } + }; + + return () => { + es.close(); + if (reconnectTimeout) { + clearTimeout(reconnectTimeout); + } + }; + // eslint-disable-next-line + }, [reconnectTimeout]); + + const content = () => { + if (!data) { + return ; + } + + return ( + <> + + + + ERROR + WARNING + NOTICE + INFO + DEBUG + ALL + + + + Buffer size + sendSettings(data.max_messages, data.level)} + /> + + + } + label="Compact" + /> + + + + + + leftOffset(), + top: () => topOffset(), + p: 1 + }} + > + {logEntries && + logEntries.events.map((e) => ( + + {e.t} + {data.compact && {paddedLevelLabel(e.l)} } + {!data.compact && {paddedLevelLabel(e.l)} } + {paddedIDLabel(e.i)} + {paddedNameLabel(e.n)} + {e.m} + + ))} + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default SystemLog; diff --git a/interface/src/framework/system/SystemStatusForm.tsx b/interface/src/framework/system/SystemStatusForm.tsx new file mode 100644 index 000000000..092ca03ba --- /dev/null +++ b/interface/src/framework/system/SystemStatusForm.tsx @@ -0,0 +1,379 @@ +import { FC, useContext, useState, useEffect } from 'react'; +import { useSnackbar } from 'notistack'; +import { + Avatar, + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Divider, + List, + ListItem, + ListItemAvatar, + ListItemText, + Link, + Typography +} from '@mui/material'; + +import DevicesIcon from '@mui/icons-material/Devices'; +import ShowChartIcon from '@mui/icons-material/ShowChart'; +import MemoryIcon from '@mui/icons-material/Memory'; +import AppsIcon from '@mui/icons-material/Apps'; +import SdStorageIcon from '@mui/icons-material/SdStorage'; +import FolderIcon from '@mui/icons-material/Folder'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; +import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; +import BuildIcon from '@mui/icons-material/Build'; +import TimerIcon from '@mui/icons-material/Timer'; +import CancelIcon from '@mui/icons-material/Cancel'; + +import { ButtonRow, FormLoader, SectionContent, MessageBox } from '../../components'; +import { EspPlatform, SystemStatus, Version } from '../../types'; +import * as SystemApi from '../../api/system'; +import { extractErrorMessage, useRest } from '../../utils'; + +import { AuthenticatedContext } from '../../contexts/authentication'; + +import axios from 'axios'; + +export const VERSIONCHECK_ENDPOINT = 'https://api.github.com/repos/emsesp/EMS-ESP32/releases/latest'; +export const VERSIONCHECK_DEV_ENDPOINT = 'https://api.github.com/repos/emsesp/EMS-ESP32/releases/tags/latest'; +export const uploadURL = window.location.origin + '/system/upload'; + +function formatNumber(num: number) { + return new Intl.NumberFormat().format(num); +} + +const SystemStatusForm: FC = () => { + const { loadData, data, errorMessage } = useRest({ read: SystemApi.readSystemStatus }); + + const { me } = useContext(AuthenticatedContext); + const [confirmRestart, setConfirmRestart] = useState(false); + const [confirmFactoryReset, setConfirmFactoryReset] = useState(false); + const [processing, setProcessing] = useState(false); + const { enqueueSnackbar } = useSnackbar(); + const [showingVersion, setShowingVersion] = useState(false); + const [latestVersion, setLatestVersion] = useState(); + const [latestDevVersion, setLatestDevVersion] = useState(); + + useEffect(() => { + axios.get(VERSIONCHECK_ENDPOINT).then((response) => { + setLatestVersion({ + version: response.data.name, + url: response.data.assets[1].browser_download_url, + changelog: response.data.html_url + }); + }); + axios.get(VERSIONCHECK_DEV_ENDPOINT).then((response) => { + setLatestDevVersion({ + version: response.data.name.split(/\s+/).splice(-1), + url: response.data.assets[1].browser_download_url, + changelog: response.data.assets[0].browser_download_url + }); + }); + }, []); + + const restart = async () => { + setProcessing(true); + try { + await SystemApi.restart(); + enqueueSnackbar('EMS-ESP is restarting...', { variant: 'info' }); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem restarting device'), { variant: 'error' }); + } finally { + setConfirmRestart(false); + setProcessing(false); + } + }; + + const renderRestartDialog = () => ( + setConfirmRestart(false)}> + Restart + Are you sure you want to restart EMS-ESP? + + + + + + ); + + const renderVersionDialog = () => { + return ( + setShowingVersion(false)}> + Version Check + + + {latestVersion && ( + + The latest official version is {latestVersion.version} ( + + {'release notes'} + + ) ( + + {'download'} + + ) + + )} + + {latestDevVersion && ( + + The latest development version is {latestDevVersion.version} +  ( + + {'release notes'} + + ) ( + + {'download'} + + ) + + )} + + + + Use  + + {'UPLOAD FIRMWARE'} + +  to apply the new firmware + + + + + + + + ); + }; + + const factoryReset = async () => { + setProcessing(true); + try { + await SystemApi.factoryReset(); + enqueueSnackbar('Device has been factory reset and will now restart', { variant: 'info' }); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem factory resetting the device'), { variant: 'error' }); + } finally { + setConfirmFactoryReset(false); + setProcessing(false); + } + }; + + const renderFactoryResetDialog = () => ( + setConfirmFactoryReset(false)}> + Factory Reset + Are you sure you want to reset the device to its factory defaults? + + + + + + ); + + const content = () => { + if (!data) { + return ; + } + + return ( + <> + + + + + + + + + {latestVersion && ( + + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {data.esp_platform === EspPlatform.ESP32 && data.psram_size > 0 && ( + <> + + + + + + + + + + + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + {me.admin && ( + + + + + + + )} + + {renderVersionDialog()} + {renderRestartDialog()} + {renderFactoryResetDialog()} + + ); + }; + + return ( + + {content()} + + ); +}; + +export default SystemStatusForm; diff --git a/interface/src/framework/system/UploadFirmwareForm.tsx b/interface/src/framework/system/UploadFirmwareForm.tsx new file mode 100644 index 000000000..5af94f0de --- /dev/null +++ b/interface/src/framework/system/UploadFirmwareForm.tsx @@ -0,0 +1,26 @@ +import { FC, useRef, useState } from 'react'; + +import * as SystemApi from '../../api/system'; +import { SectionContent } from '../../components'; +import { FileUploadConfig } from '../../api/endpoints'; + +import FirmwareFileUpload from './FirmwareFileUpload'; +import FirmwareRestartMonitor from './FirmwareRestartMonitor'; + +const UploadFirmwareForm: FC = () => { + const [restarting, setRestarting] = useState(); + + const uploadFirmware = useRef(async (file: File, config?: FileUploadConfig) => { + const response = await SystemApi.uploadFirmware(file, config); + setRestarting(true); + return response; + }); + + return ( + + {restarting ? : } + + ); +}; + +export default UploadFirmwareForm; diff --git a/interface/src/history.ts b/interface/src/history.ts deleted file mode 100644 index 2d6284a38..000000000 --- a/interface/src/history.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createBrowserHistory } from 'history'; - -export default createBrowserHistory({ - /* pass a configuration object here if needed */ -}); diff --git a/interface/src/hooks/index.ts b/interface/src/hooks/index.ts deleted file mode 100644 index 94897b22a..000000000 --- a/interface/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as useRest } from './useRest'; -export { default as useAuthorizedRest } from './useAuthorizedRest'; diff --git a/interface/src/hooks/useAuthorizedRest.ts b/interface/src/hooks/useAuthorizedRest.ts deleted file mode 100644 index 78fa7ce56..000000000 --- a/interface/src/hooks/useAuthorizedRest.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { redirectingAuthorizedFetch } from '../authentication'; -import useRest, { RestRequestOptions } from './useRest'; - -const useAuthorizedRest = ({ - endpoint -}: Omit) => - useRest({ - endpoint, - fetchFunction: redirectingAuthorizedFetch - }); - -export default useAuthorizedRest; diff --git a/interface/src/hooks/useRest.ts b/interface/src/hooks/useRest.ts deleted file mode 100644 index 0d6b30743..000000000 --- a/interface/src/hooks/useRest.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { useCallback, useEffect, useState } from 'react'; -import { useSnackbar } from 'notistack'; - -export interface RestRequestOptions { - endpoint: string; - fetchFunction?: typeof fetch; -} - -const useRest = ({ - endpoint, - fetchFunction = fetch -}: RestRequestOptions) => { - const { enqueueSnackbar } = useSnackbar(); - - const [saving, setSaving] = useState(false); - const [data, setData] = useState(); - const [errorMessage, setErrorMessage] = useState(); - - const handleError = useCallback( - (error: any) => { - const errorMessage = error.message || 'Unknown error'; - enqueueSnackbar('Problem fetching: ' + errorMessage, { - variant: 'error' - }); - setErrorMessage(errorMessage); - }, - [enqueueSnackbar] - ); - - const loadData = useCallback(async () => { - setData(undefined); - setErrorMessage(undefined); - try { - const response = await fetchFunction(endpoint); - if (response.status !== 200) { - throw Error('Invalid status code: ' + response.status); - } - setData(await response.json()); - } catch (error) { - handleError(error); - } - }, [handleError, fetchFunction, endpoint]); - - const save = useCallback( - async (data: D) => { - setSaving(true); - setErrorMessage(undefined); - try { - const response = await fetchFunction(endpoint, { - method: 'POST', - body: JSON.stringify(data), - headers: { - 'Content-Type': 'application/json' - } - }); - if (response.status !== 200) { - throw Error('Invalid status code: ' + response.status); - } - enqueueSnackbar('Update successful.', { variant: 'success' }); - setData(await response.json()); - } catch (error) { - handleError(error); - } finally { - setSaving(false); - } - }, - [enqueueSnackbar, handleError, fetchFunction, endpoint] - ); - - const saveData = () => data && save(data); - - useEffect(() => { - loadData(); - }, [loadData]); - - return { loadData, saveData, saving, setData, data, errorMessage } as const; -}; - -export default useRest; diff --git a/interface/src/index.tsx b/interface/src/index.tsx index 2abd63e9f..e0f77e141 100644 --- a/interface/src/index.tsx +++ b/interface/src/index.tsx @@ -1,14 +1,15 @@ import React from 'react'; -import { render } from 'react-dom'; +import ReactDOM from 'react-dom'; -import history from './history'; -import { Router } from 'react-router'; +import { BrowserRouter } from 'react-router-dom'; import App from './App'; -render( - - - , +ReactDOM.render( + + + + + , document.getElementById('root') ); diff --git a/interface/src/mqtt/Mqtt.tsx b/interface/src/mqtt/Mqtt.tsx deleted file mode 100644 index 6db8dd5e0..000000000 --- a/interface/src/mqtt/Mqtt.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom'; - -import { Tabs, Tab } from '@material-ui/core'; - -import { - AuthenticatedContextProps, - withAuthenticatedContext, - AuthenticatedRoute -} from '../authentication'; -import { MenuAppBar } from '../components'; -import MqttStatusController from './MqttStatusController'; -import MqttSettingsController from './MqttSettingsController'; - -type MqttProps = AuthenticatedContextProps & RouteComponentProps; - -class Mqtt extends Component { - handleTabChange = (path: string) => { - this.props.history.push(path); - }; - - render() { - const { authenticatedContext } = this.props; - return ( - - this.handleTabChange(path)} - variant="fullWidth" - > - - - - - - - - - - ); - } -} - -export default withAuthenticatedContext(Mqtt); diff --git a/interface/src/mqtt/MqttSettingsController.tsx b/interface/src/mqtt/MqttSettingsController.tsx deleted file mode 100644 index eeea08d7c..000000000 --- a/interface/src/mqtt/MqttSettingsController.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React, { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { MQTT_SETTINGS_ENDPOINT } from '../api'; - -import MqttSettingsForm from './MqttSettingsForm'; -import { MqttSettings } from './types'; - -type MqttSettingsControllerProps = RestControllerProps; - -class MqttSettingsController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(MQTT_SETTINGS_ENDPOINT, MqttSettingsController); diff --git a/interface/src/mqtt/MqttSettingsForm.tsx b/interface/src/mqtt/MqttSettingsForm.tsx deleted file mode 100644 index d789bae06..000000000 --- a/interface/src/mqtt/MqttSettingsForm.tsx +++ /dev/null @@ -1,376 +0,0 @@ -import React from 'react'; -import { - TextValidator, - ValidatorForm, - SelectValidator -} from 'react-material-ui-form-validator'; - -import { Checkbox, TextField, Typography } from '@material-ui/core'; -import SaveIcon from '@material-ui/icons/Save'; -import MenuItem from '@material-ui/core/MenuItem'; - -import { - RestFormProps, - FormActions, - FormButton, - BlockFormControlLabel, - PasswordValidator -} from '../components'; -import { isIP, isHostname, or, isPath } from '../validators'; - -import { MqttSettings } from './types'; - -type MqttSettingsFormProps = RestFormProps; - -class MqttSettingsForm extends React.Component { - componentDidMount() { - ValidatorForm.addValidationRule('isIPOrHostname', or(isIP, isHostname)); - ValidatorForm.addValidationRule('isPath', isPath); - } - - render() { - const { data, handleValueChange, saveData } = this.props; - return ( - - - } - label="Enable MQTT" - /> - - - - - - - - - 0 (default) - 1 - 2 - - - } - label="Set Clean Session" - /> - - } - label="Use Retain Flag" - /> -

- - Formatting - - - Nested on a single topic - As individual topics - - - } - label="Publish command output to a 'response' topic" - /> - - } - label="Use Home Assistant MQTT Discovery" - /> - {data.ha_enabled && ( - - Use Current temperature - Use Setpoint temperature - Always set to 0 - - )} -

- - Publish Intervals - - - - - - - - - } - variant="contained" - color="primary" - type="submit" - > - Save - - -
- ); - } -} - -export default MqttSettingsForm; diff --git a/interface/src/mqtt/MqttStatus.ts b/interface/src/mqtt/MqttStatus.ts deleted file mode 100644 index c898fddbd..000000000 --- a/interface/src/mqtt/MqttStatus.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Theme } from '@material-ui/core'; -import { MqttStatus, MqttDisconnectReason } from './types'; - -export const mqttStatusHighlight = ( - { enabled, connected }: MqttStatus, - theme: Theme -) => { - if (!enabled) { - return theme.palette.info.main; - } - if (connected) { - return theme.palette.success.main; - } - return theme.palette.error.main; -}; - -export const mqttStatus = ({ enabled, connected }: MqttStatus) => { - if (!enabled) { - return 'Not enabled'; - } - if (connected) { - return 'Connected'; - } - return 'Disconnected'; -}; - -export const disconnectReason = ({ disconnect_reason }: MqttStatus) => { - switch (disconnect_reason) { - case MqttDisconnectReason.TCP_DISCONNECTED: - return 'TCP disconnected'; - case MqttDisconnectReason.MQTT_UNACCEPTABLE_PROTOCOL_VERSION: - return 'Unacceptable protocol version'; - case MqttDisconnectReason.MQTT_IDENTIFIER_REJECTED: - return 'Client ID rejected'; - case MqttDisconnectReason.MQTT_SERVER_UNAVAILABLE: - return 'Server unavailable'; - case MqttDisconnectReason.MQTT_MALFORMED_CREDENTIALS: - return 'Malformed credentials'; - case MqttDisconnectReason.MQTT_NOT_AUTHORIZED: - return 'Not authorized'; - case MqttDisconnectReason.ESP8266_NOT_ENOUGH_SPACE: - return 'Device out of memory'; - case MqttDisconnectReason.TLS_BAD_FINGERPRINT: - return 'Server fingerprint invalid'; - default: - return 'Unknown'; - } -}; - -export const mqttPublishHighlight = ( - { mqtt_fails }: MqttStatus, - theme: Theme -) => { - if (mqtt_fails === 0) return theme.palette.success.main; - - if (mqtt_fails < 10) return theme.palette.warning.main; - - return theme.palette.error.main; -}; diff --git a/interface/src/mqtt/MqttStatusController.tsx b/interface/src/mqtt/MqttStatusController.tsx deleted file mode 100644 index 80eb646c3..000000000 --- a/interface/src/mqtt/MqttStatusController.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React, { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { MQTT_STATUS_ENDPOINT } from '../api'; - -import MqttStatusForm from './MqttStatusForm'; -import { MqttStatus } from './types'; - -type MqttStatusControllerProps = RestControllerProps; - -class MqttStatusController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(MQTT_STATUS_ENDPOINT, MqttStatusController); diff --git a/interface/src/mqtt/MqttStatusForm.tsx b/interface/src/mqtt/MqttStatusForm.tsx deleted file mode 100644 index 5d3eefd2e..000000000 --- a/interface/src/mqtt/MqttStatusForm.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import { Component, Fragment } from 'react'; - -import { WithTheme, withTheme } from '@material-ui/core/styles'; -import { - Avatar, - Divider, - List, - ListItem, - ListItemAvatar, - ListItemText -} from '@material-ui/core'; - -import DeviceHubIcon from '@material-ui/icons/DeviceHub'; -import RefreshIcon from '@material-ui/icons/Refresh'; -import ReportIcon from '@material-ui/icons/Report'; -import SpeakerNotesOffIcon from '@material-ui/icons/SpeakerNotesOff'; - -import { - RestFormProps, - FormActions, - FormButton, - HighlightAvatar -} from '../components'; -import { - mqttStatusHighlight, - mqttStatus, - mqttPublishHighlight, - disconnectReason -} from './MqttStatus'; -import { MqttStatus } from './types'; - -type MqttStatusFormProps = RestFormProps & WithTheme; - -class MqttStatusForm extends Component { - renderConnectionStatus() { - const { data, theme } = this.props; - if (data.connected) { - return ( - - - - # - - - - - - - - - - - - - - ); - } - return ( - - - - - - - - - - - - ); - } - - createListItems() { - const { data, theme } = this.props; - return ( - - - - - - - - - - - {data.enabled && this.renderConnectionStatus()} - - ); - } - - render() { - return ( - - {this.createListItems()} - - } - variant="contained" - color="secondary" - onClick={this.props.loadData} - > - Refresh - - - - ); - } -} - -export default withTheme(MqttStatusForm); diff --git a/interface/src/network/NetworkConnection.tsx b/interface/src/network/NetworkConnection.tsx deleted file mode 100644 index e8433e2af..000000000 --- a/interface/src/network/NetworkConnection.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom'; - -import { Tabs, Tab } from '@material-ui/core'; - -import { - withAuthenticatedContext, - AuthenticatedContextProps, - AuthenticatedRoute -} from '../authentication'; -import { MenuAppBar } from '../components'; - -import NetworkStatusController from './NetworkStatusController'; -import NetworkSettingsController from './NetworkSettingsController'; -import WiFiNetworkScanner from './WiFiNetworkScanner'; -import { - NetworkConnectionContext, - NetworkConnectionContextValue -} from './NetworkConnectionContext'; - -import { WiFiNetwork } from './types'; - -type NetworkConnectionProps = AuthenticatedContextProps & RouteComponentProps; - -class NetworkConnection extends Component< - NetworkConnectionProps, - NetworkConnectionContextValue -> { - constructor(props: NetworkConnectionProps) { - super(props); - this.state = { - selectNetwork: this.selectNetwork, - deselectNetwork: this.deselectNetwork - }; - } - - selectNetwork = (network: WiFiNetwork) => { - this.setState({ selectedNetwork: network }); - this.props.history.push('/network/settings'); - }; - - deselectNetwork = () => { - this.setState({ selectedNetwork: undefined }); - }; - - handleTabChange = (path: string) => { - this.props.history.push(path); - }; - - render() { - const { authenticatedContext } = this.props; - return ( - - - this.handleTabChange(path)} - variant="fullWidth" - > - - - - - - - - - - - - - ); - } -} - -export default withAuthenticatedContext(NetworkConnection); diff --git a/interface/src/network/NetworkConnectionContext.tsx b/interface/src/network/NetworkConnectionContext.tsx deleted file mode 100644 index 600331199..000000000 --- a/interface/src/network/NetworkConnectionContext.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; -import { WiFiNetwork } from './types'; - -export interface NetworkConnectionContextValue { - selectedNetwork?: WiFiNetwork; - selectNetwork: (network: WiFiNetwork) => void; - deselectNetwork: () => void; -} - -const NetworkConnectionContextDefaultValue = {} as NetworkConnectionContextValue; -export const NetworkConnectionContext = React.createContext( - NetworkConnectionContextDefaultValue -); diff --git a/interface/src/network/NetworkSettingsController.tsx b/interface/src/network/NetworkSettingsController.tsx deleted file mode 100644 index 5a96bc25b..000000000 --- a/interface/src/network/NetworkSettingsController.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import NetworkSettingsForm from './NetworkSettingsForm'; -import { NETWORK_SETTINGS_ENDPOINT } from '../api'; -import { NetworkSettings } from './types'; - -type NetworkSettingsControllerProps = RestControllerProps; - -class NetworkSettingsController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController( - NETWORK_SETTINGS_ENDPOINT, - NetworkSettingsController -); diff --git a/interface/src/network/NetworkSettingsForm.tsx b/interface/src/network/NetworkSettingsForm.tsx deleted file mode 100644 index 24c482de8..000000000 --- a/interface/src/network/NetworkSettingsForm.tsx +++ /dev/null @@ -1,286 +0,0 @@ -import React, { Fragment } from 'react'; -import { TextValidator, ValidatorForm } from 'react-material-ui-form-validator'; - -import { - Checkbox, - List, - ListItem, - ListItemText, - ListItemAvatar, - ListItemSecondaryAction -} from '@material-ui/core'; - -import Avatar from '@material-ui/core/Avatar'; -import IconButton from '@material-ui/core/IconButton'; -import LockIcon from '@material-ui/icons/Lock'; -import LockOpenIcon from '@material-ui/icons/LockOpen'; -import DeleteIcon from '@material-ui/icons/Delete'; -import SaveIcon from '@material-ui/icons/Save'; - -import { - RestFormProps, - PasswordValidator, - BlockFormControlLabel, - FormActions, - FormButton -} from '../components'; -import { isIP, isHostname, optional } from '../validators'; - -import { - NetworkConnectionContext, - NetworkConnectionContextValue -} from './NetworkConnectionContext'; -import { isNetworkOpen, networkSecurityMode } from './WiFiSecurityModes'; -import { NetworkSettings } from './types'; - -type NetworkStatusFormProps = RestFormProps; - -class NetworkSettingsForm extends React.Component { - static contextType = NetworkConnectionContext; - context!: React.ContextType; - - constructor( - props: NetworkStatusFormProps, - context: NetworkConnectionContextValue - ) { - super(props); - - const { selectedNetwork } = context; - if (selectedNetwork) { - const networkSettings: NetworkSettings = { - ssid: selectedNetwork.ssid, - password: '', - hostname: props.data.hostname, - static_ip_config: false, - enableIPv6: false, - bandwidth20: false, - tx_power: 20, - nosleep: false - }; - props.setData(networkSettings); - } - } - - componentWillMount() { - ValidatorForm.addValidationRule('isIP', isIP); - ValidatorForm.addValidationRule('isHostname', isHostname); - ValidatorForm.addValidationRule('isOptionalIP', optional(isIP)); - } - - deselectNetworkAndLoadData = () => { - this.context.deselectNetwork(); - this.props.loadData(); - }; - - componentWillUnmount() { - this.context.deselectNetwork(); - } - - render() { - const { selectedNetwork, deselectNetwork } = this.context; - const { data, handleValueChange, saveData } = this.props; - return ( - - {selectedNetwork ? ( - - - - - {isNetworkOpen(selectedNetwork) ? ( - - ) : ( - - )} - - - - - - - - - - - ) : ( - - )} - {(!selectedNetwork || !isNetworkOpen(selectedNetwork)) && ( - - )} - - - - } - label="Enable IPv6 support" - /> - - } - label="Use Lower WiFi Bandwidth" - /> - - } - label="Disable WiFi Sleep Mode" - /> - - } - label="Use Static IPs" - /> - {data.static_ip_config && ( - - - - - - - - )} - - } - variant="contained" - color="primary" - type="submit" - > - Save - - - - ); - } -} - -export default NetworkSettingsForm; diff --git a/interface/src/network/NetworkStatus.ts b/interface/src/network/NetworkStatus.ts deleted file mode 100644 index c75b14531..000000000 --- a/interface/src/network/NetworkStatus.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Theme } from '@material-ui/core'; -import { NetworkStatus, NetworkConnectionStatus } from './types'; - -export const isConnected = ({ status }: NetworkStatus) => { - return ( - status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED || - status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED - ); -}; - -export const isWiFi = ({ status }: NetworkStatus) => - status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED; -export const isEthernet = ({ status }: NetworkStatus) => - status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED; - -export const networkStatusHighlight = ( - { status }: NetworkStatus, - theme: Theme -) => { - switch (status) { - case NetworkConnectionStatus.WIFI_STATUS_IDLE: - case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: - case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD: - return theme.palette.info.main; - case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: - case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: - return theme.palette.success.main; - case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: - case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: - return theme.palette.error.main; - default: - return theme.palette.warning.main; - } -}; - -export const networkStatus = ({ status }: NetworkStatus) => { - switch (status) { - case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD: - return 'Inactive'; - case NetworkConnectionStatus.WIFI_STATUS_IDLE: - return 'Idle'; - case NetworkConnectionStatus.WIFI_STATUS_NO_SSID_AVAIL: - return 'No SSID Available'; - case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: - return 'Connected (WiFi)'; - case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: - return 'Connected (Ethernet)'; - case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: - return 'Connection Failed'; - case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: - return 'Connection Lost'; - case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: - return 'Disconnected'; - default: - return 'Unknown'; - } -}; diff --git a/interface/src/network/NetworkStatusController.tsx b/interface/src/network/NetworkStatusController.tsx deleted file mode 100644 index 0c813fcff..000000000 --- a/interface/src/network/NetworkStatusController.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import NetworkStatusForm from './NetworkStatusForm'; -import { NETWORK_STATUS_ENDPOINT } from '../api'; -import { NetworkStatus } from './types'; - -type NetworkStatusControllerProps = RestControllerProps; - -class NetworkStatusController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(NETWORK_STATUS_ENDPOINT, NetworkStatusController); diff --git a/interface/src/network/NetworkStatusForm.tsx b/interface/src/network/NetworkStatusForm.tsx deleted file mode 100644 index 6098f04c6..000000000 --- a/interface/src/network/NetworkStatusForm.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import { Component, Fragment } from 'react'; - -import { WithTheme, withTheme } from '@material-ui/core/styles'; -import { - Avatar, - Divider, - List, - ListItem, - ListItemAvatar, - ListItemText -} from '@material-ui/core'; - -import DNSIcon from '@material-ui/icons/Dns'; -import WifiIcon from '@material-ui/icons/Wifi'; -import RouterIcon from '@material-ui/icons/Router'; -import SettingsInputComponentIcon from '@material-ui/icons/SettingsInputComponent'; -import SettingsInputAntennaIcon from '@material-ui/icons/SettingsInputAntenna'; -import DeviceHubIcon from '@material-ui/icons/DeviceHub'; -import RefreshIcon from '@material-ui/icons/Refresh'; - -import { - RestFormProps, - FormActions, - FormButton, - HighlightAvatar -} from '../components'; -import { - networkStatus, - networkStatusHighlight, - isConnected, - isWiFi, - isEthernet -} from './NetworkStatus'; -import { NetworkStatus } from './types'; - -type NetworkStatusFormProps = RestFormProps & WithTheme; - -class NetworkStatusForm extends Component { - dnsServers(status: NetworkStatus) { - if (!status.dns_ip_1) { - return 'none'; - } - if (!status.dns_ip_2 || status.dns_ip_2 === '0.0.0.0') { - return status.dns_ip_1; - } - return status.dns_ip_1 + ', ' + status.dns_ip_2; - } - IPs(status: NetworkStatus) { - if ( - !status.local_ipv6 || - status.local_ipv6 === '0000:0000:0000:0000:0000:0000:0000:0000' - ) { - return status.local_ip; - } - if (!status.local_ip || status.local_ip === '0.0.0.0') { - return status.local_ipv6; - } - return status.local_ip + ', ' + status.local_ipv6; - } - - createListItems() { - const { data, theme } = this.props; - - return ( - - - - - {isWiFi(data) && } - {isEthernet(data) && } - - - - - - {isWiFi(data) && ( - - - - - - - - - - - - )} - {isConnected(data) && ( - - - - IP - - - - - - - - - - - - - - - - # - - - - - - - - - - - - - - - - - - - - - - - - )} - - ); - } - - render() { - return ( - - {this.createListItems()} - - } - variant="contained" - color="secondary" - onClick={this.props.loadData} - > - Refresh - - - - ); - } -} - -export default withTheme(NetworkStatusForm); diff --git a/interface/src/network/WiFiNetworkScanner.tsx b/interface/src/network/WiFiNetworkScanner.tsx deleted file mode 100644 index ecd470701..000000000 --- a/interface/src/network/WiFiNetworkScanner.tsx +++ /dev/null @@ -1,203 +0,0 @@ -import { Component } from 'react'; -import { withSnackbar, WithSnackbarProps } from 'notistack'; - -import { - createStyles, - WithStyles, - Theme, - withStyles, - Typography, - LinearProgress -} from '@material-ui/core'; -import PermScanWifiIcon from '@material-ui/icons/PermScanWifi'; - -import { FormActions, FormButton, SectionContent } from '../components'; -import { redirectingAuthorizedFetch } from '../authentication'; -import { SCAN_NETWORKS_ENDPOINT, LIST_NETWORKS_ENDPOINT } from '../api'; - -import WiFiNetworkSelector from './WiFiNetworkSelector'; -import { WiFiNetworkList, WiFiNetwork } from './types'; - -const NUM_POLLS = 10; -const POLLING_FREQUENCY = 500; -const RETRY_EXCEPTION_TYPE = 'retry'; - -interface WiFiNetworkScannerState { - scanningForNetworks: boolean; - errorMessage?: string; - networkList?: WiFiNetworkList; -} - -const styles = (theme: Theme) => - createStyles({ - scanningSettings: { - margin: theme.spacing(0.5) - }, - scanningSettingsDetails: { - margin: theme.spacing(4), - textAlign: 'center' - }, - scanningProgress: { - margin: theme.spacing(4), - textAlign: 'center' - } - }); - -type WiFiNetworkScannerProps = WithSnackbarProps & WithStyles; - -class WiFiNetworkScanner extends Component< - WiFiNetworkScannerProps, - WiFiNetworkScannerState -> { - pollCount = 0; - - state: WiFiNetworkScannerState = { - scanningForNetworks: false - }; - - componentDidMount() { - this.scanNetworks(); - } - - requestNetworkScan = () => { - const { scanningForNetworks } = this.state; - if (!scanningForNetworks) { - this.scanNetworks(); - } - }; - - scanNetworks() { - this.pollCount = 0; - this.setState({ - scanningForNetworks: true, - networkList: undefined, - errorMessage: undefined - }); - redirectingAuthorizedFetch(SCAN_NETWORKS_ENDPOINT) - .then((response) => { - if (response.status === 202) { - this.schedulePollTimeout(); - return; - } - throw Error( - 'Scanning for networks returned unexpected response code: ' + - response.status - ); - }) - .catch((error) => { - this.props.enqueueSnackbar('Problem scanning: ' + error.message, { - variant: 'error' - }); - this.setState({ - scanningForNetworks: false, - networkList: undefined, - errorMessage: error.message - }); - }); - } - - schedulePollTimeout() { - setTimeout(this.pollNetworkList, POLLING_FREQUENCY); - } - - retryError() { - return { - name: RETRY_EXCEPTION_TYPE, - message: - 'Network list not ready, will retry in ' + POLLING_FREQUENCY + 'ms.' - }; - } - - compareNetworks(network1: WiFiNetwork, network2: WiFiNetwork) { - if (network1.rssi < network2.rssi) return 1; - if (network1.rssi > network2.rssi) return -1; - return 0; - } - - pollNetworkList = () => { - redirectingAuthorizedFetch(LIST_NETWORKS_ENDPOINT) - .then((response) => { - if (response.status === 200) { - return response.json(); - } - if (response.status === 202) { - if (++this.pollCount < NUM_POLLS) { - this.schedulePollTimeout(); - throw this.retryError(); - } else { - throw Error('Device did not return network list in timely manner.'); - } - } - throw Error( - 'Device returned unexpected response code: ' + response.status - ); - }) - .then((json) => { - json.networks.sort(this.compareNetworks); - this.setState({ - scanningForNetworks: false, - networkList: json, - errorMessage: undefined - }); - }) - .catch((error) => { - if (error.name !== RETRY_EXCEPTION_TYPE) { - this.props.enqueueSnackbar('Problem scanning: ' + error.message, { - variant: 'error' - }); - this.setState({ - scanningForNetworks: false, - networkList: undefined, - errorMessage: error.message - }); - } - }); - }; - - renderNetworkScanner() { - const { classes } = this.props; - const { scanningForNetworks, networkList, errorMessage } = this.state; - if (scanningForNetworks || !networkList) { - return ( -
- - - Scanning… - -
- ); - } - if (errorMessage) { - return ( -
- - {errorMessage} - -
- ); - } - return ; - } - - render() { - const { scanningForNetworks } = this.state; - return ( - - {this.renderNetworkScanner()} - - } - variant="contained" - color="secondary" - onClick={this.requestNetworkScan} - disabled={scanningForNetworks} - > - Scan again… - - - - ); - } -} - -export default withSnackbar(withStyles(styles)(WiFiNetworkScanner)); diff --git a/interface/src/network/WiFiNetworkSelector.tsx b/interface/src/network/WiFiNetworkSelector.tsx deleted file mode 100644 index f63347162..000000000 --- a/interface/src/network/WiFiNetworkSelector.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React, { Component } from 'react'; - -import { Avatar, Badge } from '@material-ui/core'; -import { - List, - ListItem, - ListItemIcon, - ListItemText, - ListItemAvatar -} from '@material-ui/core'; - -import WifiIcon from '@material-ui/icons/Wifi'; -import LockIcon from '@material-ui/icons/Lock'; -import LockOpenIcon from '@material-ui/icons/LockOpen'; - -import { isNetworkOpen, networkSecurityMode } from './WiFiSecurityModes'; -import { NetworkConnectionContext } from './NetworkConnectionContext'; -import { WiFiNetwork, WiFiNetworkList } from './types'; - -interface WiFiNetworkSelectorProps { - networkList: WiFiNetworkList; -} - -class WiFiNetworkSelector extends Component { - static contextType = NetworkConnectionContext; - context!: React.ContextType; - - renderNetwork = (network: WiFiNetwork) => { - return ( - this.context.selectNetwork(network)} - > - - - {isNetworkOpen(network) ? : } - - - - - - - - - - ); - }; - - render() { - return ( - {this.props.networkList.networks.map(this.renderNetwork)} - ); - } -} - -export default WiFiNetworkSelector; diff --git a/interface/src/network/WiFiSecurityModes.ts b/interface/src/network/WiFiSecurityModes.ts deleted file mode 100644 index 40a055f9d..000000000 --- a/interface/src/network/WiFiSecurityModes.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { WiFiNetwork, WiFiEncryptionType } from './types'; - -export const isNetworkOpen = ({ encryption_type }: WiFiNetwork) => - encryption_type === WiFiEncryptionType.WIFI_AUTH_OPEN; - -export const networkSecurityMode = ({ encryption_type }: WiFiNetwork) => { - switch (encryption_type) { - case WiFiEncryptionType.WIFI_AUTH_WEP: - return 'WEP'; - case WiFiEncryptionType.WIFI_AUTH_WPA_PSK: - return 'WPA'; - case WiFiEncryptionType.WIFI_AUTH_WPA2_PSK: - return 'WPA2'; - case WiFiEncryptionType.WIFI_AUTH_WPA_WPA2_PSK: - return 'WPA/WPA2'; - case WiFiEncryptionType.WIFI_AUTH_WPA2_ENTERPRISE: - return 'WPA2 Enterprise'; - case WiFiEncryptionType.WIFI_AUTH_OPEN: - return 'None'; - default: - return 'Unknown'; - } -}; diff --git a/interface/src/ntp/NTPSettingsController.tsx b/interface/src/ntp/NTPSettingsController.tsx deleted file mode 100644 index fa7e3cb2f..000000000 --- a/interface/src/ntp/NTPSettingsController.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { NTP_SETTINGS_ENDPOINT } from '../api'; - -import NTPSettingsForm from './NTPSettingsForm'; -import { NTPSettings } from './types'; - -type NTPSettingsControllerProps = RestControllerProps; - -class NTPSettingsController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(NTP_SETTINGS_ENDPOINT, NTPSettingsController); diff --git a/interface/src/ntp/NTPSettingsForm.tsx b/interface/src/ntp/NTPSettingsForm.tsx deleted file mode 100644 index aff27a87c..000000000 --- a/interface/src/ntp/NTPSettingsForm.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import React from 'react'; -import { - TextValidator, - ValidatorForm, - SelectValidator -} from 'react-material-ui-form-validator'; - -import { Checkbox, MenuItem } from '@material-ui/core'; -import SaveIcon from '@material-ui/icons/Save'; - -import { - RestFormProps, - FormActions, - FormButton, - BlockFormControlLabel -} from '../components'; -import { isIP, isHostname, or } from '../validators'; - -import { TIME_ZONES, timeZoneSelectItems, selectedTimeZone } from './TZ'; -import { NTPSettings } from './types'; - -type NTPSettingsFormProps = RestFormProps; - -class NTPSettingsForm extends React.Component { - componentDidMount() { - ValidatorForm.addValidationRule('isIPOrHostname', or(isIP, isHostname)); - } - - changeTimeZone = (event: React.ChangeEvent) => { - const { data, setData } = this.props; - setData({ - ...data, - tz_label: event.target.value, - tz_format: TIME_ZONES[event.target.value] - }); - }; - - render() { - const { data, handleValueChange, saveData } = this.props; - return ( - - - } - label="Enable NTP" - /> - - - Time zone... - {timeZoneSelectItems()} - - - } - variant="contained" - color="primary" - type="submit" - > - Save - - - - ); - } -} - -export default NTPSettingsForm; diff --git a/interface/src/ntp/NTPStatus.ts b/interface/src/ntp/NTPStatus.ts deleted file mode 100644 index 4e490bbe4..000000000 --- a/interface/src/ntp/NTPStatus.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Theme } from '@material-ui/core'; -import { NTPStatus, NTPSyncStatus } from './types'; - -export const isNtpActive = ({ status }: NTPStatus) => - status === NTPSyncStatus.NTP_ACTIVE; - -export const ntpStatusHighlight = ({ status }: NTPStatus, theme: Theme) => { - switch (status) { - case NTPSyncStatus.NTP_INACTIVE: - return theme.palette.info.main; - case NTPSyncStatus.NTP_ACTIVE: - return theme.palette.success.main; - default: - return theme.palette.error.main; - } -}; - -export const ntpStatus = ({ status }: NTPStatus) => { - switch (status) { - case NTPSyncStatus.NTP_INACTIVE: - return 'Inactive'; - case NTPSyncStatus.NTP_ACTIVE: - return 'Active'; - default: - return 'Unknown'; - } -}; diff --git a/interface/src/ntp/NTPStatusController.tsx b/interface/src/ntp/NTPStatusController.tsx deleted file mode 100644 index 56c8e970e..000000000 --- a/interface/src/ntp/NTPStatusController.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { NTP_STATUS_ENDPOINT } from '../api'; - -import NTPStatusForm from './NTPStatusForm'; -import { NTPStatus } from './types'; - -type NTPStatusControllerProps = RestControllerProps; - -class NTPStatusController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(NTP_STATUS_ENDPOINT, NTPStatusController); diff --git a/interface/src/ntp/NTPStatusForm.tsx b/interface/src/ntp/NTPStatusForm.tsx deleted file mode 100644 index bda5ce295..000000000 --- a/interface/src/ntp/NTPStatusForm.tsx +++ /dev/null @@ -1,262 +0,0 @@ -import React, { Component, Fragment } from 'react'; - -import { WithTheme, withTheme } from '@material-ui/core/styles'; -import { - Avatar, - Divider, - List, - ListItem, - ListItemAvatar, - ListItemText, - Button -} from '@material-ui/core'; -import { - Dialog, - DialogTitle, - DialogContent, - DialogActions, - Box, - TextField -} from '@material-ui/core'; - -import SwapVerticalCircleIcon from '@material-ui/icons/SwapVerticalCircle'; -import AccessTimeIcon from '@material-ui/icons/AccessTime'; -import DNSIcon from '@material-ui/icons/Dns'; -import UpdateIcon from '@material-ui/icons/Update'; -import AvTimerIcon from '@material-ui/icons/AvTimer'; -import RefreshIcon from '@material-ui/icons/Refresh'; - -import { RestFormProps, FormButton, HighlightAvatar } from '../components'; -import { isNtpActive, ntpStatusHighlight, ntpStatus } from './NTPStatus'; -import { - formatDuration, - formatDateTime, - formatLocalDateTime -} from './TimeFormat'; -import { NTPStatus, Time } from './types'; -import { - redirectingAuthorizedFetch, - withAuthenticatedContext, - AuthenticatedContextProps -} from '../authentication'; -import { TIME_ENDPOINT } from '../api'; - -type NTPStatusFormProps = RestFormProps & - WithTheme & - AuthenticatedContextProps; - -interface NTPStatusFormState { - settingTime: boolean; - localTime: string; - processing: boolean; -} - -class NTPStatusForm extends Component { - constructor(props: NTPStatusFormProps) { - super(props); - this.state = { - settingTime: false, - localTime: '', - processing: false - }; - } - - updateLocalTime = (event: React.ChangeEvent) => { - this.setState({ - localTime: event.target.value - }); - }; - - openSetTime = () => { - this.setState({ - localTime: formatLocalDateTime(new Date()), - settingTime: true - }); - }; - - closeSetTime = () => { - this.setState({ - settingTime: false - }); - }; - - createTime = (): Time => ({ - local_time: formatLocalDateTime(new Date(this.state.localTime)) - }); - - configureTime = () => { - this.setState({ processing: true }); - redirectingAuthorizedFetch(TIME_ENDPOINT, { - method: 'POST', - body: JSON.stringify(this.createTime()), - headers: { - 'Content-Type': 'application/json' - } - }) - .then((response) => { - if (response.status === 200) { - this.props.enqueueSnackbar('Time set successfully', { - variant: 'success' - }); - this.setState( - { processing: false, settingTime: false }, - this.props.loadData - ); - } else { - throw Error('Error setting time, status code: ' + response.status); - } - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem setting the time', - { variant: 'error' } - ); - this.setState({ processing: false, settingTime: false }); - }); - }; - - renderSetTimeDialog() { - return ( - - Set Time - - - Enter local date and time below to set the device's time. - - - - - - - - - ); - } - - render() { - const { data, theme } = this.props; - const me = this.props.authenticatedContext.me; - return ( - - - - - - - - - - - - {isNtpActive(data) && ( - - - - - - - - - - - - )} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } - variant="contained" - color="secondary" - onClick={this.props.loadData} - > - Refresh - - - {me.admin && !isNtpActive(data) && ( - - - - )} - - {this.renderSetTimeDialog()} - - ); - } -} - -export default withAuthenticatedContext(withTheme(NTPStatusForm)); diff --git a/interface/src/ntp/NetworkTime.tsx b/interface/src/ntp/NetworkTime.tsx deleted file mode 100644 index aa7f3af88..000000000 --- a/interface/src/ntp/NetworkTime.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom'; - -import { Tabs, Tab } from '@material-ui/core'; - -import { - withAuthenticatedContext, - AuthenticatedContextProps, - AuthenticatedRoute -} from '../authentication'; -import { MenuAppBar } from '../components'; - -import NTPStatusController from './NTPStatusController'; -import NTPSettingsController from './NTPSettingsController'; - -type NetworkTimeProps = AuthenticatedContextProps & RouteComponentProps; - -class NetworkTime extends Component { - handleTabChange = (path: string) => { - this.props.history.push(path); - }; - - render() { - const { authenticatedContext } = this.props; - return ( - - this.handleTabChange(path)} - variant="fullWidth" - > - - - - - - - - - - ); - } -} - -export default withAuthenticatedContext(NetworkTime); diff --git a/interface/src/project/Dashboard.tsx b/interface/src/project/Dashboard.tsx new file mode 100644 index 000000000..10e284208 --- /dev/null +++ b/interface/src/project/Dashboard.tsx @@ -0,0 +1,30 @@ +import { FC } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { RouterTabs, useRouterTab, useLayoutTitle } from '../components'; + +import DashboardStatus from './DashboardStatus'; +import DashboardData from './DashboardData'; + +const Dashboard: FC = () => { + useLayoutTitle('Dashboard'); + const { routerTab } = useRouterTab(); + + return ( + <> + + + + + + } /> + } /> + } /> + + + ); +}; + +export default Dashboard; diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx new file mode 100644 index 000000000..50a8726dd --- /dev/null +++ b/interface/src/project/DashboardData.tsx @@ -0,0 +1,825 @@ +import { FC, useState, useContext, useEffect } from 'react'; + +import { + Button, + Table, + TableBody, + TableHead, + TableRow, + Typography, + Box, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + MenuItem, + InputAdornment, + IconButton, + List, + ListItem, + ListItemText, + Grid, + useMediaQuery +} from '@mui/material'; + +import TableCell, { tableCellClasses } from '@mui/material/TableCell'; + +import { styled } from '@mui/material/styles'; + +import parseMilliseconds from 'parse-ms'; + +import { useSnackbar } from 'notistack'; + +import RefreshIcon from '@mui/icons-material/Refresh'; +import EditIcon from '@mui/icons-material/Edit'; +import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; +import AddCircleOutlineOutlinedIcon from '@mui/icons-material/AddCircleOutlineOutlined'; +import CancelIcon from '@mui/icons-material/Cancel'; +import SendIcon from '@mui/icons-material/TrendingFlat'; +import SaveIcon from '@mui/icons-material/Save'; +import RemoveIcon from '@mui/icons-material/RemoveCircleOutline'; + +import DeviceIcon from './DeviceIcon'; + +import { IconContext } from 'react-icons'; + +import { AuthenticatedContext } from '../contexts/authentication'; + +import { ButtonRow, FormLoader, ValidatedTextField, SectionContent, MessageBox } from '../components'; + +import * as EMSESP from './api'; + +import { numberValue, updateValue, extractErrorMessage, useRest } from '../utils'; + +import { + SensorData, + CoreData, + DeviceData, + DeviceValue, + DeviceValueUOM, + DeviceValueUOM_s, + AnalogTypes, + Sensor, + Analog +} from './types'; + +const StyledTableCell = styled(TableCell)(({ theme }) => ({ + [`&.${tableCellClasses.head}`]: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + fontSize: 14 + } +})); + +const StyledTableRow = styled(TableRow)(({ theme }) => ({ + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover + }, + '&:hover': { + backgroundColor: theme.palette.info.light + } +})); + +const DashboardData: FC = () => { + const { loadData, data, errorMessage } = useRest({ read: EMSESP.readCoreData }); + + const { me } = useContext(AuthenticatedContext); + + const { enqueueSnackbar } = useSnackbar(); + + const [deviceData, setDeviceData] = useState(); + const [sensorData, setSensorData] = useState(); + const [deviceValue, setDeviceValue] = useState(); + const [sensor, setSensor] = useState(); + const [analog, setAnalog] = useState(); + const [selectedDevice, setSelectedDevice] = useState(); + const [deviceDialog, setDeviceDialog] = useState(-1); + + const desktopWindow = useMediaQuery('(min-width:600px)'); + + const refreshData = () => { + if (analog || sensor || deviceValue) { + return; + } + loadData(); + + if (selectedDevice === 0) { + fetchSensorData(); + } else if (selectedDevice) { + fetchDeviceData(selectedDevice); + } + }; + + useEffect(() => { + const timer = setInterval(() => refreshData(), 60000); + return () => { + clearInterval(timer); + }; + // eslint-disable-next-line + }, [analog, sensor, deviceValue, selectedDevice]); + + const fetchDeviceData = async (unique_id: number) => { + try { + setDeviceData((await EMSESP.readDeviceData({ id: unique_id })).data); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem fetching device data'), { variant: 'error' }); + } finally { + setSelectedDevice(unique_id); + setSensorData(undefined); + } + }; + + const fetchSensorData = async () => { + try { + setSensorData((await EMSESP.readSensorData()).data); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem fetching sensor data'), { variant: 'error' }); + } finally { + setSelectedDevice(undefined); + } + }; + + const pluralize = (count: number, noun: string, suffix = 's') => + ` ${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? suffix : ''} `; + + const formatDuration = (duration_min: number) => { + const { days, hours, minutes } = parseMilliseconds(duration_min * 60000); + let formatted = ''; + if (days) { + formatted += pluralize(days, 'day'); + } + if (hours) { + formatted += pluralize(hours, 'hour'); + } + if (minutes) { + formatted += pluralize(minutes, 'minute'); + } + return formatted; + }; + + function formatValue(value: any, uom: number) { + if (value === undefined) { + return ''; + } + switch (uom) { + case DeviceValueUOM.HOURS: + return value ? formatDuration(value * 60) : '0 hours'; + case DeviceValueUOM.MINUTES: + return value ? formatDuration(value) : '0 minutes'; + case DeviceValueUOM.NONE: + if (typeof value === 'number') { + return new Intl.NumberFormat().format(value); + } + return value; + case DeviceValueUOM.DEGREES: + case DeviceValueUOM.DEGREES_R: + case DeviceValueUOM.FAHRENHEIT: + return ( + new Intl.NumberFormat(undefined, { + minimumFractionDigits: 1 + }).format(value) + + ' ' + + DeviceValueUOM_s[uom] + ); + case DeviceValueUOM.SECONDS: + return pluralize(value, DeviceValueUOM_s[uom]); + default: + return new Intl.NumberFormat().format(value) + ' ' + DeviceValueUOM_s[uom]; + } + } + + const sendDeviceValue = async () => { + if (selectedDevice && deviceValue) { + try { + const response = await EMSESP.writeValue({ + id: selectedDevice, + devicevalue: deviceValue + }); + if (response.status === 204) { + enqueueSnackbar('Write command failed', { variant: 'error' }); + } else if (response.status === 403) { + enqueueSnackbar('Write access denied', { variant: 'error' }); + } else { + enqueueSnackbar('Write command sent', { variant: 'success' }); + } + setDeviceValue(undefined); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem writing value'), { variant: 'error' }); + } finally { + setDeviceValue(undefined); + fetchDeviceData(selectedDevice); + loadData(); + } + } + }; + + const renderDeviceValueDialog = () => { + if (deviceValue) { + return ( + setDeviceValue(undefined)}> + Change Value + + {deviceValue.l && ( + + {deviceValue.l.map((val) => ( + {val} + ))} + + )} + {!deviceValue.l && ( + {DeviceValueUOM_s[deviceValue.u]} + }} + /> + )} + + + + + + + ); + } + }; + + const addAnalogSensor = () => { + setAnalog({ i: 0, n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); + }; + + const sendSensor = async () => { + if (sensor) { + try { + const response = await EMSESP.writeSensor({ + id_str: sensor.is, + name: sensor.n, + offset: sensor.o + }); + if (response.status === 204) { + enqueueSnackbar('Sensor change failed', { variant: 'error' }); + } else if (response.status === 403) { + enqueueSnackbar('Access denied', { variant: 'error' }); + } else { + enqueueSnackbar('Sensor updated', { variant: 'success' }); + } + setSensor(undefined); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem updating sensor'), { variant: 'error' }); + } finally { + setSensor(undefined); + fetchSensorData(); + } + } + }; + + const renderSensorDialog = () => { + if (sensor) { + return ( + setSensor(undefined)}> + Edit Temperature Sensor + + + Sensor ID {sensor.is} + + + + + + + °C + }} + /> + + + + + + + + + ); + } + }; + + const renderDeviceDialog = () => { + if (data && data.devices.length > 0 && deviceDialog !== -1) { + return ( + setDeviceDialog(-1)}> + Device Details + + + + + + + + + + + + + + + + + + + + + + + + + + + ); + } + }; + + const toggleDeviceData = (index: number) => { + if (selectedDevice === index) { + setSelectedDevice(undefined); + } else { + fetchDeviceData(index); + } + }; + + const toggleSensorData = () => { + if (sensorData) { + setSensorData(undefined); + } else { + fetchSensorData(); + } + }; + + const renderCoreData = () => { + if (!data) { + return ; + } + + return ( + + {data.devices.length === 0 && } + + + + + TYPE + + {desktopWindow && DESCRIPTION} + ENTITIES + + + + + {data.devices.map((device, index) => ( + device.e && toggleDeviceData(device.i)} + > + + + + {device.t} + {desktopWindow && {device.n}} + {device.e} + + setDeviceDialog(index)}> + + + + + ))} + {(data.active_sensors > 0 || data.analog_enabled) && ( + toggleSensorData()}> + + + + Sensors + {desktopWindow && Attached EMS-ESP Sensors} + {data.active_sensors} + + addAnalogSensor()} disabled={!data.analog_enabled}> + + + + + )} + +
+
+ ); + }; + + const renderDeviceData = () => { + if (data?.devices.length === 0 || !deviceData || !selectedDevice) { + return; + } + + const sendCommand = (dv: DeviceValue) => { + if (dv.c && me.admin) { + setDeviceValue(dv); + } + }; + + const renderNameCell = (dv: DeviceValue) => { + if (dv.v === undefined && dv.c) { + return ( + + command: {dv.n} + + ); + } + return ( + + {dv.n} + + ); + }; + + return ( + <> + + {deviceData.label} + + + + + + ENTITY NAME/COMMAND + VALUE + + + + {deviceData.data.map((dv, i) => ( + sendCommand(dv)}> + + {dv.c && me.admin && ( + + + + )} + + {renderNameCell(dv)} + {formatValue(dv.v, dv.u)} + + ))} + +
+ + ); + }; + + const updateSensor = (sensordata: Sensor) => { + if (sensordata && me.admin) { + setSensor(sensordata); + } + }; + + const updateAnalog = (analogdata: Analog) => { + if (me.admin) { + setAnalog(analogdata); + } + }; + + const renderDallasData = () => ( + <> + + Temperature Sensors + + + + + + NAME + TEMPERATURE + + + + {sensorData?.sensors.map((sensor_data) => ( + updateSensor(sensor_data)}> + + {me.admin && ( + + + + )} + + + {sensor_data.n} + + {formatValue(sensor_data.t, sensor_data.u)} + + ))} + +
+ + ); + + const renderAnalogData = () => ( + <> + + Analog Sensors + + + + + + GPIO + NAME + TYPE + VALUE + + + + {sensorData?.analogs.map((analog_data) => ( + updateAnalog(analog_data)}> + + {me.admin && ( + + + + )} + + + {analog_data.i} + + {analog_data.n} + {AnalogTypes[analog_data.t]} + {formatValue(analog_data.v, analog_data.u)} + + ))} + +
+ + ); + + const sendRemoveAnalog = async () => { + if (analog) { + try { + const response = await EMSESP.writeAnalog({ + id: analog.i, + name: analog.n, + offset: analog.o, + factor: analog.f, + uom: analog.u, + type: -1 + }); + + if (response.status === 204) { + enqueueSnackbar('Analog deletion failed', { variant: 'error' }); + } else if (response.status === 403) { + enqueueSnackbar('Access denied', { variant: 'error' }); + } else { + enqueueSnackbar('Analog sensor removed', { variant: 'success' }); + } + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem updating analog sensor'), { variant: 'error' }); + } finally { + setAnalog(undefined); + fetchSensorData(); + } + } + }; + + const sendAnalog = async () => { + if (analog) { + try { + const response = await EMSESP.writeAnalog({ + id: analog.i, + name: analog.n, + offset: analog.o, + factor: analog.f, + uom: analog.u, + type: analog.t + }); + + if (response.status === 204) { + enqueueSnackbar('Analog sensor update failed', { variant: 'error' }); + } else if (response.status === 403) { + enqueueSnackbar('Access denied', { variant: 'error' }); + } else { + enqueueSnackbar('Analog sensor updated', { variant: 'success' }); + } + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem updating analog'), { variant: 'error' }); + } finally { + setAnalog(undefined); + fetchSensorData(); + } + } + }; + + const renderAnalogDialog = () => { + if (analog) { + return ( + setAnalog(undefined)}> + Edit Analog Sensor + + + + + + + + + + + {AnalogTypes.map((val, i) => ( + + {val} + + ))} + + + {analog.t === 3 && ( + <> + + + {DeviceValueUOM_s.map((val, i) => ( + + {val} + + ))} + + + + + mV + }} + /> + + + + + + )} + + + Warning: be careful when assigning a GPIO! + + + + + + + + + + + ); + } + }; + + const content = () => { + if (!data) { + return ; + } + + return ( + <> + {renderCoreData()} + {renderDeviceData()} + {renderDeviceDialog()} + {sensorData && sensorData.sensors.length > 0 && renderDallasData()} + {sensorData && sensorData.analogs.length > 0 && renderAnalogData()} + {renderDeviceValueDialog()} + {renderSensorDialog()} + {renderAnalogDialog()} + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default DashboardData; diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx new file mode 100644 index 000000000..2ed4c980b --- /dev/null +++ b/interface/src/project/DashboardStatus.tsx @@ -0,0 +1,259 @@ +import { FC, useState, useContext, useEffect } from 'react'; +import { useSnackbar } from 'notistack'; +import { + Avatar, + Button, + Table, + TableContainer, + TableBody, + TableCell, + TableHead, + TableRow, + List, + ListItem, + ListItemAvatar, + ListItemText, + Theme, + useTheme, + Box, + Dialog, + DialogActions, + DialogContent, + DialogTitle +} from '@mui/material'; + +import DeviceHubIcon from '@mui/icons-material/DeviceHub'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import PermScanWifiIcon from '@mui/icons-material/PermScanWifi'; +import CancelIcon from '@mui/icons-material/Cancel'; +import DirectionsBusIcon from '@mui/icons-material/DirectionsBus'; + +import { AuthenticatedContext } from '../contexts/authentication'; + +import { ButtonRow, FormLoader, SectionContent } from '../components'; + +import { Status, busConnectionStatus } from './types'; + +import * as EMSESP from './api'; + +import { extractErrorMessage, useRest } from '../utils'; + +export const isConnected = ({ status }: Status) => status !== busConnectionStatus.BUS_STATUS_OFFLINE; + +const busStatusHighlight = ({ status }: Status, theme: Theme) => { + switch (status) { + case busConnectionStatus.BUS_STATUS_TX_ERRORS: + return theme.palette.warning.main; + case busConnectionStatus.BUS_STATUS_CONNECTED: + return theme.palette.success.main; + case busConnectionStatus.BUS_STATUS_OFFLINE: + return theme.palette.error.main; + default: + return theme.palette.warning.main; + } +}; + +const busStatus = ({ status }: Status) => { + switch (status) { + case busConnectionStatus.BUS_STATUS_CONNECTED: + return 'Connected'; + case busConnectionStatus.BUS_STATUS_TX_ERRORS: + return 'Tx issues - try a different Tx-Mode'; + case busConnectionStatus.BUS_STATUS_OFFLINE: + return 'Disconnected'; + default: + return 'Unknown'; + } +}; + +const pluralize = (count: number, noun: string) => + `${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? 's' : ''}`; + +const formatDuration = (duration_sec: number) => { + if (duration_sec === 0) { + return ' '; + } + const roundTowardsZero = duration_sec > 0 ? Math.floor : Math.ceil; + return ( + ', ' + + roundTowardsZero(duration_sec / 86400) + + 'd ' + + (roundTowardsZero(duration_sec / 3600) % 24) + + 'h ' + + (roundTowardsZero(duration_sec / 60) % 60) + + 'm ' + + (roundTowardsZero(duration_sec) % 60) + + 's' + ); +}; + +const formatRow = (name: string, success: number, fail: number, quality: number) => { + if (success === 0 && fail === 0) { + return ( + + {name} + + + + + ); + } + + return ( + + {name} + {Intl.NumberFormat().format(success)} + {Intl.NumberFormat().format(fail)} + {showQuality(quality)} + + ); +}; + +const showQuality = (quality: number) => { + if (quality === 0) { + return ; + } + + if (quality === 100) { + return {quality}%; + } + + if (quality >= 95) { + return {quality}%; + } else { + return {quality}%; + } +}; + +const DashboardStatus: FC = () => { + const { loadData, data, errorMessage } = useRest({ read: EMSESP.readStatus }); + + const theme = useTheme(); + const [confirmScan, setConfirmScan] = useState(false); + const { enqueueSnackbar } = useSnackbar(); + + const { me } = useContext(AuthenticatedContext); + + useEffect(() => { + const timer = setInterval(() => loadData(), 30000); + return () => { + clearInterval(timer); + }; + // eslint-disable-next-line + }, []); + + const scan = async () => { + try { + await EMSESP.scanDevices(); + enqueueSnackbar('Scanning for devices...', { variant: 'info' }); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem initiating scan'), { variant: 'error' }); + } finally { + setConfirmScan(false); + } + }; + + const renderScanDialog = () => ( + setConfirmScan(false)}> + EMS Device Scan + Are you sure you want to initiate a full device scan of the EMS bus? + + + + + + ); + + const content = () => { + if (!data) { + return ; + } + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + SUCCESS + FAIL + QUALITY + + + + {formatRow('EMS Telegrams Received (Rx)', data.rx_received, data.rx_fails, data.rx_quality)} + {formatRow('EMS Reads (Tx)', data.tx_reads, data.tx_read_fails, data.tx_read_quality)} + {formatRow('EMS Writes (Tx)', data.tx_writes, data.tx_write_fails, data.tx_write_quality)} + {formatRow('Temperature Sensor Reads', data.sensor_reads, data.sensor_fails, data.sensor_quality)} + {formatRow('Analog Sensor Reads', data.analog_reads, data.analog_fails, data.analog_quality)} + {formatRow('MQTT Publishes', data.mqtt_count, data.mqtt_fails, data.mqtt_quality)} + {formatRow('API Calls', data.api_calls, data.api_fails, data.api_quality)} + +
+
+
+ {renderScanDialog()} + + + + + + + + + + + + ); + }; + + return ( + + {content()} + + ); +}; + +export default DashboardStatus; diff --git a/interface/src/project/DeviceIcon.tsx b/interface/src/project/DeviceIcon.tsx new file mode 100644 index 000000000..5594cdf40 --- /dev/null +++ b/interface/src/project/DeviceIcon.tsx @@ -0,0 +1,42 @@ +import { FC } from 'react'; + +import { CgSmartHomeBoiler } from 'react-icons/cg'; +import { MdOutlineSensors } from 'react-icons/md'; +import { FaSolarPanel } from 'react-icons/fa'; +import { MdThermostatAuto } from 'react-icons/md'; +import { AiOutlineControl } from 'react-icons/ai'; +import { GiHeatHaze } from 'react-icons/gi'; +import { TiFlowSwitch } from 'react-icons/ti'; +import { VscVmConnect } from 'react-icons/vsc'; +import { AiOutlineGateway } from 'react-icons/ai'; + +interface DeviceIconProps { + type: string; +} + +const DeviceIcon: FC = ({ type }) => { + switch (type) { + case 'Boiler': + return ; + case 'Sensor': + return ; + case 'Solar': + return ; + case 'Thermostat': + return ; + case 'Mixer': + return ; + case 'Heatpump': + return ; + case 'Switch': + return ; + case 'Connect': + return ; + case 'Gateway': + return ; + default: + return null; + } +}; + +export default DeviceIcon; diff --git a/interface/src/project/EMSESPBoardProfiles.tsx b/interface/src/project/EMSESPBoardProfiles.tsx deleted file mode 100644 index 6efecd878..000000000 --- a/interface/src/project/EMSESPBoardProfiles.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import MenuItem from '@material-ui/core/MenuItem'; - -type BoardProfiles = { - [name: string]: string; -}; - -export const BOARD_PROFILES: BoardProfiles = { - S32: 'BBQKees Gateway S32', - E32: 'BBQKees Gateway E32', - NODEMCU: 'NodeMCU 32S', - 'MH-ET': 'MH-ET Live D1 Mini', - LOLIN: 'Lolin D32', - OLIMEX: 'Olimex ESP32-EVB' -}; - -export function boardProfileSelectItems() { - return Object.keys(BOARD_PROFILES).map((code) => ( - - {BOARD_PROFILES[code]} - - )); -} diff --git a/interface/src/project/EMSESPDashboard.tsx b/interface/src/project/EMSESPDashboard.tsx deleted file mode 100644 index 5c781aff9..000000000 --- a/interface/src/project/EMSESPDashboard.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom'; - -import { Tabs, Tab } from '@material-ui/core'; - -import { PROJECT_PATH } from '../api'; -import { MenuAppBar } from '../components'; -import { AuthenticatedRoute } from '../authentication'; - -import EMSESPStatusController from './EMSESPStatusController'; -import EMSESPDataController from './EMSESPDataController'; -import EMSESPHelp from './EMSESPHelp'; - -class EMSESP extends Component { - handleTabChange = (path: string) => { - this.props.history.push(path); - }; - - render() { - return ( - - this.handleTabChange(path)} - variant="fullWidth" - > - - - - - - - - - - - - ); - } -} - -export default EMSESP; diff --git a/interface/src/project/EMSESPDataController.tsx b/interface/src/project/EMSESPDataController.tsx deleted file mode 100644 index 5320497cd..000000000 --- a/interface/src/project/EMSESPDataController.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React, { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; - -import { ENDPOINT_ROOT } from '../api'; -import EMSESPDataForm from './EMSESPDataForm'; -import { EMSESPData } from './EMSESPtypes'; - -export const EMSESP_DATA_ENDPOINT = ENDPOINT_ROOT + 'data'; - -type EMSESPDataControllerProps = RestControllerProps; - -class EMSESPDataController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(EMSESP_DATA_ENDPOINT, EMSESPDataController); diff --git a/interface/src/project/EMSESPDataForm.tsx b/interface/src/project/EMSESPDataForm.tsx deleted file mode 100644 index c3c1c81ef..000000000 --- a/interface/src/project/EMSESPDataForm.tsx +++ /dev/null @@ -1,692 +0,0 @@ -import React, { Component, Fragment } from 'react'; -import { withStyles, Theme, createStyles } from '@material-ui/core/styles'; - -import parseMilliseconds from 'parse-ms'; - -import { Decoder } from '@msgpack/msgpack'; -const decoder = new Decoder(); - -import { - Table, - TableBody, - TableCell, - TableHead, - TableRow, - TableContainer, - withWidth, - WithWidthProps, - isWidthDown, - Button, - Tooltip, - DialogTitle, - DialogContent, - DialogActions, - Box, - Dialog, - Typography -} from '@material-ui/core'; - -import RefreshIcon from '@material-ui/icons/Refresh'; -import ListIcon from '@material-ui/icons/List'; -import IconButton from '@material-ui/core/IconButton'; -import EditIcon from '@material-ui/icons/Edit'; - -import { - redirectingAuthorizedFetch, - withAuthenticatedContext, - AuthenticatedContextProps -} from '../authentication'; - -import { RestFormProps, FormButton, extractEventValue } from '../components'; - -import { - EMSESPData, - EMSESPDeviceData, - Device, - DeviceValue, - DeviceValueUOM, - DeviceValueUOM_s, - Sensor -} from './EMSESPtypes'; - -import ValueForm from './ValueForm'; -import SensorForm from './SensorForm'; - -import { ENDPOINT_ROOT } from '../api'; - -export const SCANDEVICES_ENDPOINT = ENDPOINT_ROOT + 'scanDevices'; -export const DEVICE_DATA_ENDPOINT = ENDPOINT_ROOT + 'deviceData'; -export const WRITE_VALUE_ENDPOINT = ENDPOINT_ROOT + 'writeValue'; -export const WRITE_SENSOR_ENDPOINT = ENDPOINT_ROOT + 'writeSensor'; - -const StyledTableRow = withStyles((theme: Theme) => - createStyles({ - root: { - '&:nth-child(even)': { - backgroundColor: '#4e4e4e' - }, - '&:hover': { - backgroundColor: theme.palette.info.light - } - }, - - selected: { - backgroundColor: theme.palette.common.white - } - }) -)(TableRow); - -const StyledTableRowHeader = withStyles((theme: Theme) => - createStyles({ - head: { - backgroundColor: theme.palette.common.black - } - }) -)(TableRow); - -const StyledTooltip = withStyles((theme: Theme) => ({ - tooltip: { - backgroundColor: theme.palette.secondary.main, - color: 'white', - boxShadow: theme.shadows[1], - fontSize: 11, - border: '1px solid #dadde9' - } -}))(Tooltip); - -function compareDevices(a: Device, b: Device) { - if (a.t < b.t) { - return -1; - } - if (a.t > b.t) { - return 1; - } - return 0; -} - -interface EMSESPDataFormState { - confirmScanDevices: boolean; - processing: boolean; - deviceData?: EMSESPDeviceData; - selectedDevice?: number; - edit_devicevalue?: DeviceValue; - edit_Sensor?: Sensor; -} - -type EMSESPDataFormProps = RestFormProps & - AuthenticatedContextProps & - WithWidthProps; - -const pluralize = (count: number, noun: string, suffix = 's') => - ` ${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? suffix : ''} `; - -export const formatDuration = (duration_min: number) => { - const { days, hours, minutes } = parseMilliseconds(duration_min * 60000); - let formatted = ''; - if (days) { - formatted += pluralize(days, 'day'); - } - if (hours) { - formatted += pluralize(hours, 'hour'); - } - if (minutes) { - formatted += pluralize(minutes, 'minute'); - } - return formatted; -}; - -function formatValue(value: any, uom: number) { - switch (uom) { - case DeviceValueUOM.HOURS: - return value ? formatDuration(value * 60) : '0 hours'; - case DeviceValueUOM.MINUTES: - return value ? formatDuration(value) : '0 minutes'; - case DeviceValueUOM.NONE: - if (typeof value === 'number') { - return new Intl.NumberFormat().format(value); - } - return value; - case DeviceValueUOM.DEGREES: - // always show with one decimal place - return ( - new Intl.NumberFormat(undefined, { - minimumFractionDigits: 1 - }).format(value) + - ' ' + - DeviceValueUOM_s[uom] - ); - case DeviceValueUOM.TIMES: - case DeviceValueUOM.SECONDS: - return pluralize(value, DeviceValueUOM_s[uom]); - default: - return ( - new Intl.NumberFormat().format(value) + ' ' + DeviceValueUOM_s[uom] - ); - } -} - -class EMSESPDataForm extends Component< - EMSESPDataFormProps, - EMSESPDataFormState -> { - state: EMSESPDataFormState = { - confirmScanDevices: false, - processing: false - }; - - handleDeviceValueChange = (name: keyof DeviceValue) => ( - event: React.ChangeEvent - ) => { - this.setState({ - edit_devicevalue: { - ...this.state.edit_devicevalue!, - [name]: extractEventValue(event) - } - }); - }; - - cancelEditingDeviceValue = () => { - this.setState({ edit_devicevalue: undefined }); - }; - - doneEditingDeviceValue = () => { - const { edit_devicevalue, selectedDevice } = this.state; - - redirectingAuthorizedFetch(WRITE_VALUE_ENDPOINT, { - method: 'POST', - body: JSON.stringify({ - id: selectedDevice, - devicevalue: edit_devicevalue - }), - headers: { - 'Content-Type': 'application/json' - } - }) - .then((response) => { - if (response.status === 200) { - this.props.enqueueSnackbar('Write command sent to device', { - variant: 'success' - }); - this.handleRowClick(selectedDevice); - } else if (response.status === 204) { - this.props.enqueueSnackbar('Write command failed', { - variant: 'error' - }); - } else if (response.status === 403) { - this.props.enqueueSnackbar('Write access denied', { - variant: 'error' - }); - } else { - throw Error('Unexpected response code: ' + response.status); - } - }) - .catch((error) => { - this.props.enqueueSnackbar(error.message || 'Problem writing value', { - variant: 'error' - }); - }); - - if (edit_devicevalue) { - this.setState({ edit_devicevalue: undefined }); - } - }; - - sendCommand = (dv: DeviceValue) => { - if (dv.c && this.props.authenticatedContext.me.admin) { - this.setState({ edit_devicevalue: dv }); - } - }; - - handleSensorChange = (name: keyof Sensor) => ( - event: React.ChangeEvent - ) => { - this.setState({ - edit_Sensor: { - ...this.state.edit_Sensor!, - [name]: extractEventValue(event) - } - }); - }; - - cancelEditingSensor = () => { - this.setState({ edit_Sensor: undefined }); - }; - - doneEditingSensor = () => { - const { edit_Sensor } = this.state; - - redirectingAuthorizedFetch(WRITE_SENSOR_ENDPOINT, { - method: 'POST', - body: JSON.stringify({ - // because input field with type=number doens't like negative values, force it here - sensor: { - no: edit_Sensor?.n, // no - id: edit_Sensor?.i, // id - temp: edit_Sensor?.t, // temp - offset: Number(edit_Sensor?.o) // offset - } - }), - headers: { - 'Content-Type': 'application/json' - } - }) - .then((response) => { - if (response.status === 200) { - this.props.enqueueSnackbar('Sensor updated', { - variant: 'success' - }); - this.props.loadData(); - } else if (response.status === 204) { - this.props.enqueueSnackbar('Sensor change failed', { - variant: 'error' - }); - } else if (response.status === 403) { - this.props.enqueueSnackbar('Write access denied', { - variant: 'error' - }); - } else { - throw Error('Unexpected response code: ' + response.status); - } - }) - .catch((error) => { - this.props.enqueueSnackbar(error.message || 'Problem writing value', { - variant: 'error' - }); - }); - - if (edit_Sensor) { - this.setState({ edit_Sensor: undefined }); - } - }; - - sendSensor = (sn: Sensor) => { - if (this.props.authenticatedContext.me.admin) { - this.setState({ edit_Sensor: sn }); - } - }; - - noDevices = () => { - return this.props.data.devices.length === 0; - }; - - noSensors = () => { - return this.props.data.sensors.length === 0; - }; - - noDeviceData = () => { - return (this.state.deviceData?.data || []).length === 0; - }; - - renderDevices() { - const { width, data } = this.props; - return ( - - - EMS Devices - -

- {!this.noDevices() && ( - - - {data.devices.sort(compareDevices).map((device) => ( - this.handleRowClick(device.i)} - > - - - - - - - {device.b + ' ' + device.n}{' '} - - - ))} - -
- )} - {this.noDevices() && ( - - - No EMS devices found. Check the connections and for possible Tx - errors. - - - )} -
- ); - } - - renderSensorData() { - const { data } = this.props; - const me = this.props.authenticatedContext.me; - return ( - -

- - Sensors - - {!this.noSensors() && ( - - - - - Dallas Sensor # - ID / Name - Temperature - - - - {data.sensors.map((sensorData) => ( - this.sendSensor(sensorData)} - > - - {me.admin && ( - - - - - - )} - - - {sensorData.n} - - {sensorData.i} - - {formatValue(sensorData.t, DeviceValueUOM.DEGREES)} - - - ))} - -
- )} - {this.noSensors() && ( - - - no Dallas temperature sensors were detected - - - )} -
- ); - } - - renderAnalogData() { - const { data } = this.props; - return ( - -

- {data.analog > 0 && ( - - - - - Sensor Type - Value - - - - -    - - Analog Input - - - {formatValue(data.analog, DeviceValueUOM.MV)} - - - -
- )} -
- ); - } - - renderScanDevicesDialog() { - return ( - - Confirm Scan Devices - - Are you sure you want to start a scan on the EMS bus for all new - devices? - - - - - - - ); - } - - onScanDevices = () => { - this.setState({ confirmScanDevices: true }); - }; - - onScanDevicesRejected = () => { - this.setState({ confirmScanDevices: false }); - }; - - onScanDevicesConfirmed = () => { - this.setState({ processing: true }); - redirectingAuthorizedFetch(SCANDEVICES_ENDPOINT) - .then((response) => { - if (response.status === 200) { - this.props.enqueueSnackbar('Device scan is starting...', { - variant: 'info' - }); - this.setState({ processing: false, confirmScanDevices: false }); - } else { - throw Error('Invalid status code: ' + response.status); - } - }) - .catch((error) => { - this.props.enqueueSnackbar(error.message || 'Problem with scan', { - variant: 'error' - }); - this.setState({ processing: false, confirmScanDevices: false }); - }); - }; - - handleRowClick = (device: any) => { - this.setState({ selectedDevice: device, deviceData: undefined }); - redirectingAuthorizedFetch(DEVICE_DATA_ENDPOINT, { - method: 'POST', - body: JSON.stringify({ id: device }), - headers: { - 'Content-Type': 'application/json' - } - }) - .then((response) => { - if (response.status === 200) { - return response.arrayBuffer(); - } - throw Error('Unexpected response code: ' + response.status); - }) - .then((arrayBuffer) => { - const json: any = decoder.decode(arrayBuffer); - this.setState({ deviceData: json }); - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem getting device data', - { variant: 'error' } - ); - this.setState({ deviceData: undefined }); - }); - }; - - renderDeviceData() { - const { deviceData } = this.state; - const { width } = this.props; - - if (this.noDevices()) { - return; - } - - if (!deviceData) { - return; - } - - return ( - -

- - - {deviceData.type} Data - - - {!this.noDeviceData() && ( - - - - {deviceData.data.map((item, i) => ( - this.sendCommand(item)} - > - - {item.c && this.props.authenticatedContext.me.admin && ( - - - - - - )} - - - {item.n} - - - {formatValue(item.v, item.u)} - - - ))} - -
-
- )} - {this.noDeviceData() && ( - - - no data available for this device - - - )} -
- ); - } - - render() { - const { edit_devicevalue, edit_Sensor } = this.state; - return ( - -

- {this.renderDevices()} - {this.renderDeviceData()} - {this.renderSensorData()} - {this.renderAnalogData()} -

- - - } - variant="contained" - color="secondary" - onClick={this.props.loadData} - > - Refresh - - - - } - variant="contained" - onClick={this.onScanDevices} - > - Scan Devices - - - - {this.renderScanDevicesDialog()} - {edit_devicevalue && ( - - )} - {edit_Sensor && ( - - )} -
- ); - } -} - -export default withAuthenticatedContext(withWidth()(EMSESPDataForm)); diff --git a/interface/src/project/EMSESPHelp.tsx b/interface/src/project/EMSESPHelp.tsx deleted file mode 100644 index 363eb94c1..000000000 --- a/interface/src/project/EMSESPHelp.tsx +++ /dev/null @@ -1,131 +0,0 @@ -import { Component } from 'react'; -import { - Typography, - Box, - List, - ListItem, - ListItemText, - Link, - ListItemAvatar -} from '@material-ui/core'; -import { SectionContent } from '../components'; - -import CommentIcon from '@material-ui/icons/CommentTwoTone'; -import MenuBookIcon from '@material-ui/icons/MenuBookTwoTone'; -import GitHubIcon from '@material-ui/icons/GitHub'; -import StarIcon from '@material-ui/icons/Star'; -import DownloadIcon from '@material-ui/icons/GetApp'; - -import { FormButton } from '../components'; - -import { API_ENDPOINT_ROOT } from '../api'; - -import { redirectingAuthorizedFetch } from '../authentication'; - -class EMSESPHelp extends Component { - onDownload = (endpoint: string) => { - redirectingAuthorizedFetch(API_ENDPOINT_ROOT + 'system/' + endpoint) - .then((response) => { - if (response.status === 200) { - return response.json(); - } - throw Error( - 'Device returned unexpected response code: ' + response.status - ); - }) - .then((json) => { - const a = document.createElement('a'); - const filename = 'emsesp_system_' + endpoint + '.txt'; - a.href = URL.createObjectURL( - new Blob([JSON.stringify(json, null, 2)], { - type: 'text/plain' - }) - ); - a.setAttribute('download', filename); - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - }); - }; - - render() { - return ( - - - - - - - - For help and information on the latest updates visit the{' '} - - {'online documentation'} - - - - - - - - - - For live community chat join our{' '} - - {'Discord'} server - - - - - - - - - - To report an issue or request a feature go to{' '} - - {'GitHub'} - - - - - - - } - variant="contained" - color="primary" - onClick={() => this.onDownload('info')} - > - download system info - - } - variant="contained" - color="primary" - onClick={() => this.onDownload('settings')} - > - download all settings - - - - - - EMS-ESP is free and open-source. -

Please consider supporting this project by giving it a{' '} - on our{' '} - - {'GitHub page'} - - . -
-
-

-
- ); - } -} - -export default EMSESPHelp; diff --git a/interface/src/project/EMSESPSettings.tsx b/interface/src/project/EMSESPSettings.tsx deleted file mode 100644 index 826130a2e..000000000 --- a/interface/src/project/EMSESPSettings.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom'; - -import { Tabs, Tab } from '@material-ui/core'; - -import { PROJECT_PATH } from '../api'; -import { MenuAppBar } from '../components'; -import { AuthenticatedRoute } from '../authentication'; - -import EMSESPSettingsController from './EMSESPSettingsController'; - -class EMSESP extends Component { - handleTabChange = (path: string) => { - this.props.history.push(path); - }; - - render() { - return ( - - this.handleTabChange(path)} - variant="fullWidth" - > - - - - - - - - ); - } -} - -export default EMSESP; diff --git a/interface/src/project/EMSESPSettingsController.tsx b/interface/src/project/EMSESPSettingsController.tsx deleted file mode 100644 index 08a0eba45..000000000 --- a/interface/src/project/EMSESPSettingsController.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { Component } from 'react'; - -import { ENDPOINT_ROOT } from '../api'; -import EMSESPSettingsForm from './EMSESPSettingsForm'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; - -import { EMSESPSettings } from './EMSESPtypes'; - -export const EMSESP_SETTINGS_ENDPOINT = ENDPOINT_ROOT + 'emsespSettings'; - -type EMSESPSettingsControllerProps = RestControllerProps; - -class EMSESPSettingsController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController( - EMSESP_SETTINGS_ENDPOINT, - EMSESPSettingsController -); diff --git a/interface/src/project/EMSESPSettingsForm.tsx b/interface/src/project/EMSESPSettingsForm.tsx deleted file mode 100644 index a1f228fde..000000000 --- a/interface/src/project/EMSESPSettingsForm.tsx +++ /dev/null @@ -1,644 +0,0 @@ -import { Component } from 'react'; - -import { - ValidatorForm, - TextValidator, - SelectValidator -} from 'react-material-ui-form-validator'; - -import { - Checkbox, - Typography, - Box, - Link, - withWidth, - WithWidthProps, - Grid -} from '@material-ui/core'; - -import SaveIcon from '@material-ui/icons/Save'; -import MenuItem from '@material-ui/core/MenuItem'; - -import { - redirectingAuthorizedFetch, - withAuthenticatedContext, - AuthenticatedContextProps -} from '../authentication'; - -import { - RestFormProps, - FormActions, - FormButton, - BlockFormControlLabel -} from '../components'; - -import { isIPv4, optional, isHostname, or } from '../validators'; - -import { EMSESPSettings } from './EMSESPtypes'; - -import { boardProfileSelectItems } from './EMSESPBoardProfiles'; - -import { ENDPOINT_ROOT } from '../api'; -export const BOARD_PROFILE_ENDPOINT = ENDPOINT_ROOT + 'boardProfile'; - -type EMSESPSettingsFormProps = RestFormProps & - AuthenticatedContextProps & - WithWidthProps; - -interface EMSESPSettingsFormState { - processing: boolean; -} - -class EMSESPSettingsForm extends Component { - state: EMSESPSettingsFormState = { - processing: false - }; - - componentDidMount() { - ValidatorForm.addValidationRule( - 'isOptionalIPorHost', - optional(or(isIPv4, isHostname)) - ); - } - - changeBoardProfile = (event: React.ChangeEvent) => { - const { data, setData } = this.props; - setData({ - ...data, - board_profile: event.target.value - }); - - if (event.target.value === 'CUSTOM') return; - - this.setState({ processing: true }); - redirectingAuthorizedFetch(BOARD_PROFILE_ENDPOINT, { - method: 'POST', - body: JSON.stringify({ code: event.target.value }), - headers: { - 'Content-Type': 'application/json' - } - }) - .then((response) => { - if (response.status === 200) { - return response.json(); - } - throw Error('Unexpected response code: ' + response.status); - }) - .then((json) => { - this.props.enqueueSnackbar('Profile loaded', { variant: 'success' }); - setData({ - ...data, - led_gpio: json.led_gpio, - dallas_gpio: json.dallas_gpio, - rx_gpio: json.rx_gpio, - tx_gpio: json.tx_gpio, - pbutton_gpio: json.pbutton_gpio, - phy_type: json.phy_type, - board_profile: event.target.value - }); - this.setState({ processing: false }); - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem fetching board profile', - { variant: 'warning' } - ); - this.setState({ processing: false }); - }); - }; - - render() { - const { data, saveData, handleValueChange } = this.props; - return ( - - - - - visit the  - - {'online documentation'} - -  for details explaining each setting - - - - -

- - EMS Bus - - - - - - Off - EMS - EMS+ - HT3 - Hardware - - - - - Service Key (0x0B) - Modem (0x0D) - Terminal (0x0A) - Time Module (0x0F) - Alarm Module (0x12) - - - - -

- - Board Profile - - - - - - Select a pre-configured board layout to automatically set the GPIO - pins. Select "Custom..." to view or manually edit the values. - - - - - - {boardProfileSelectItems()} - - Custom... - - - - {data.board_profile === 'CUSTOM' && ( - - - - - - - - - - - - - - - - - - - No Ethernet - LAN8720 - TLK110 - - - - )} - -

- - General Options - - - {data.led_gpio !== 0 && ( - - } - label="Hide LED" - /> - )} - - {data.dallas_gpio !== 0 && ( - - } - label="Use Dallas Sensor parasite power" - /> - )} - - - } - label="Enable ADC" - /> - - } - label="Run at a lower CPU clock speed" - /> - - } - label="Bypass Access Token authorization on API calls" - /> - - - } - label="Enable Shower Timer" - /> - - } - label="Enable Shower Alert" - /> - - -

- - Formatting Options - - - - - - "on"/"off" - "ON"/"OFF" - true/false - 1/0 - - - - - Text - Number - - - - - ID - Number - Name - - - - -

- - Syslog - - - - } - label="Enable Syslog" - /> - - {data.syslog_enabled && ( - - - - - - - - - - OFF - ERR - NOTICE - INFO - DEBUG - ALL - - - - - - - } - label="Output EMS telegrams as hexadecimal bytes" - /> - - )} - -

- - } - variant="contained" - color="primary" - type="submit" - > - Save - - -
- ); - } -} - -export default withAuthenticatedContext(withWidth()(EMSESPSettingsForm)); diff --git a/interface/src/project/EMSESPStatus.ts b/interface/src/project/EMSESPStatus.ts deleted file mode 100644 index b018ff6cc..000000000 --- a/interface/src/project/EMSESPStatus.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Theme } from '@material-ui/core'; -import { EMSESPStatus, busConnectionStatus } from './EMSESPtypes'; - -export const isConnected = ({ status }: EMSESPStatus) => - status !== busConnectionStatus.BUS_STATUS_OFFLINE; - -export const busStatusHighlight = ({ status }: EMSESPStatus, theme: Theme) => { - switch (status) { - case busConnectionStatus.BUS_STATUS_TX_ERRORS: - return theme.palette.warning.main; - case busConnectionStatus.BUS_STATUS_CONNECTED: - return theme.palette.success.main; - case busConnectionStatus.BUS_STATUS_OFFLINE: - return theme.palette.error.main; - default: - return theme.palette.warning.main; - } -}; - -export const busStatus = ({ status }: EMSESPStatus) => { - switch (status) { - case busConnectionStatus.BUS_STATUS_CONNECTED: - return 'Connected'; - case busConnectionStatus.BUS_STATUS_TX_ERRORS: - return 'Tx Errors'; - case busConnectionStatus.BUS_STATUS_OFFLINE: - return 'Disconnected'; - default: - return 'Unknown'; - } -}; - -export const qualityHighlight = (value: number, theme: Theme) => { - if (value >= 95) { - return theme.palette.success.main; - } - - return theme.palette.error.main; -}; diff --git a/interface/src/project/EMSESPStatusController.tsx b/interface/src/project/EMSESPStatusController.tsx deleted file mode 100644 index 837b8db3b..000000000 --- a/interface/src/project/EMSESPStatusController.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { ENDPOINT_ROOT } from '../api'; -import EMSESPStatusForm from './EMSESPStatusForm'; -import { EMSESPStatus } from './EMSESPtypes'; - -export const EMSESP_STATUS_ENDPOINT = ENDPOINT_ROOT + 'emsespStatus'; - -type EMSESPStatusControllerProps = RestControllerProps; - -class EMSESPStatusController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(EMSESP_STATUS_ENDPOINT, EMSESPStatusController); diff --git a/interface/src/project/EMSESPStatusForm.tsx b/interface/src/project/EMSESPStatusForm.tsx deleted file mode 100644 index 9b04a094b..000000000 --- a/interface/src/project/EMSESPStatusForm.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React, { Component, Fragment } from 'react'; - -import { WithTheme, withTheme } from '@material-ui/core/styles'; -import { - TableContainer, - Table, - TableBody, - TableCell, - TableRow, - List, - ListItem, - ListItemAvatar, - ListItemText, - withWidth, - WithWidthProps, - isWidthDown -} from '@material-ui/core'; - -import RefreshIcon from '@material-ui/icons/Refresh'; -import DeviceHubIcon from '@material-ui/icons/DeviceHub'; - -import { - RestFormProps, - FormActions, - FormButton, - HighlightAvatar -} from '../components'; - -import { busStatus, busStatusHighlight, isConnected } from './EMSESPStatus'; - -import { EMSESPStatus } from './EMSESPtypes'; - -function formatNumber(num: number) { - return new Intl.NumberFormat().format(num); -} - -type EMSESPStatusFormProps = RestFormProps & - WithTheme & - WithWidthProps; - -class EMSESPStatusForm extends Component { - createListItems() { - const { data, theme, width } = this.props; - return ( - - - - - - - - - - {isConnected(data) && ( - - - - - Telegrams Received - - {formatNumber(data.rx_received)} (quality{' '} - {data.rx_quality}%) - - - - Telegrams Sent - - {formatNumber(data.tx_sent)} (quality {data.tx_quality} - %) - - - -
-
- )} -
- ); - } - - render() { - return ( - - {this.createListItems()} - - } - variant="contained" - color="secondary" - onClick={this.props.loadData} - > - Refresh - - - - ); - } -} - -export default withTheme(withWidth()(EMSESPStatusForm)); diff --git a/interface/src/project/EMSESPtypes.ts b/interface/src/project/EMSESPtypes.ts deleted file mode 100644 index ae9d071cc..000000000 --- a/interface/src/project/EMSESPtypes.ts +++ /dev/null @@ -1,120 +0,0 @@ -export interface EMSESPSettings { - tx_mode: number; - ems_bus_id: number; - syslog_enabled: boolean; - syslog_level: number; - syslog_mark_interval: number; - syslog_host: string; - syslog_port: number; - master_thermostat: number; - shower_timer: boolean; - shower_alert: boolean; - rx_gpio: number; - tx_gpio: number; - phy_type: number; - dallas_gpio: number; - dallas_parasite: boolean; - led_gpio: number; - hide_led: boolean; - low_clock: boolean; - notoken_api: boolean; - analog_enabled: boolean; - pbutton_gpio: number; - trace_raw: boolean; - board_profile: string; - bool_format: number; - dallas_format: number; - enum_format: number; -} - -export enum busConnectionStatus { - BUS_STATUS_CONNECTED = 0, - BUS_STATUS_TX_ERRORS = 1, - BUS_STATUS_OFFLINE = 2 -} - -export interface EMSESPStatus { - status: busConnectionStatus; - rx_received: number; - tx_sent: number; - rx_quality: number; - tx_quality: number; -} - -export interface Device { - i: number; // id - t: string; // type - b: string; // brand - n: string; // name - d: number; // deviceid - p: number; // productid - v: string; // version -} - -export interface Sensor { - n: number; // np - i: string; // id - t: number; // temp - o: number; // offset -} - -export interface EMSESPData { - devices: Device[]; - sensors: Sensor[]; - analog: number; -} - -export interface DeviceValue { - v: any; // value, in any format - u: number; // uom - n: string; // name - c: string; // command - l: string[]; // list -} - -export interface EMSESPDeviceData { - type: string; - data: DeviceValue[]; -} - -export enum DeviceValueUOM { - NONE = 0, - DEGREES, - PERCENT, - LMIN, - KWH, - WH, - HOURS, - MINUTES, - UA, - BAR, - KW, - W, - KB, - SECONDS, - DBM, - MV, - TIMES, - OCLOCK -} - -export const DeviceValueUOM_s = [ - '', - '°C', - '%', - 'l/min', - 'kWh', - 'Wh', - 'hours', - 'minutes', - 'uA', - 'bar', - 'kW', - 'W', - 'KB', - 'second', - 'dBm', - 'mV', - 'time', - "o'clock" -]; diff --git a/interface/src/project/Help.tsx b/interface/src/project/Help.tsx new file mode 100644 index 000000000..924f936bd --- /dev/null +++ b/interface/src/project/Help.tsx @@ -0,0 +1,27 @@ +import { FC } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { RouterTabs, useRouterTab, useLayoutTitle } from '../components'; + +import HelpInformation from './HelpInformation'; + +const Help: FC = () => { + useLayoutTitle('Help'); + const { routerTab } = useRouterTab(); + + return ( + <> + + + + + } /> + } /> + + + ); +}; + +export default Help; diff --git a/interface/src/project/HelpInformation.tsx b/interface/src/project/HelpInformation.tsx new file mode 100644 index 000000000..9790071e9 --- /dev/null +++ b/interface/src/project/HelpInformation.tsx @@ -0,0 +1,171 @@ +import { FC, useContext } from 'react'; + +import { Typography, Button, Box, List, ListItem, ListItemText, Link, ListItemAvatar } from '@mui/material'; + +import { SectionContent, ButtonRow } from '../components'; + +import { AuthenticatedContext } from '../contexts/authentication'; + +import { useSnackbar } from 'notistack'; + +import CommentIcon from '@mui/icons-material/CommentTwoTone'; +import MenuBookIcon from '@mui/icons-material/MenuBookTwoTone'; +import GitHubIcon from '@mui/icons-material/GitHub'; +import StarIcon from '@mui/icons-material/Star'; +import DownloadIcon from '@mui/icons-material/GetApp'; +import TuneIcon from '@mui/icons-material/Tune'; + +import { extractErrorMessage } from '../utils'; + +import * as EMSESP from './api'; + +const HelpInformation: FC = () => { + const { enqueueSnackbar } = useSnackbar(); + + const { me } = useContext(AuthenticatedContext); + + const onDownload = async (endpoint: string) => { + try { + const response = await EMSESP.API({ + device: 'system', + entity: endpoint, + id: 0 + }); + if (response.status !== 200) { + enqueueSnackbar('API call failed', { variant: 'error' }); + } else { + const json = response.data; + const a = document.createElement('a'); + const filename = 'emsesp_' + endpoint + '.txt'; + a.href = URL.createObjectURL( + new Blob([JSON.stringify(json, null, 2)], { + type: 'text/plain' + }) + ); + a.setAttribute('download', filename); + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + enqueueSnackbar('File downloaded', { variant: 'info' }); + } + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem with downloading'), { variant: 'error' }); + } + }; + + return ( + + + + + + + + For a help on each of the Application Settings see  + + {'Configuring EMS-ESP'} + + + + + + + + + + For general information about EMS-ESP visit the online  + + {'Documentation'} + + + + + + + + + + For live community chat join our  + + {'Discord'} + +  server + + + + + + + + + To report an issue or request a feature, please do via  + + {'GitHub'} + + + + + + {me.admin && ( + <> + + Export Data + + + + Download the current system information, application settings and any customizations using the buttons + below. + + + + + + + + + + + + )} + + + + EMS-ESP is a free and open-source project. +

Please consider supporting us by giving it a  + on  + + {'GitHub'} + +  ! +
+
+
+ ); +}; + +export default HelpInformation; diff --git a/interface/src/project/ProjectMenu.tsx b/interface/src/project/ProjectMenu.tsx index f0bc9811d..d03324eb1 100644 --- a/interface/src/project/ProjectMenu.tsx +++ b/interface/src/project/ProjectMenu.tsx @@ -1,54 +1,31 @@ -import { Component } from 'react'; -import { Link, withRouter, RouteComponentProps } from 'react-router-dom'; +import { FC, useContext } from 'react'; -import { List, ListItem, ListItemIcon, ListItemText } from '@material-ui/core'; +import { List } from '@mui/material'; -import TuneIcon from '@material-ui/icons/Tune'; -import DashboardIcon from '@material-ui/icons/Dashboard'; +import { AuthenticatedContext } from '../contexts/authentication'; -import { - withAuthenticatedContext, - AuthenticatedContextProps -} from '../authentication'; +import { PROJECT_PATH } from '../api/env'; -type ProjectProps = AuthenticatedContextProps & RouteComponentProps; +import TuneIcon from '@mui/icons-material/Tune'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import LayoutMenuItem from '../components/layout/LayoutMenuItem'; +import InfoIcon from '@mui/icons-material/Info'; -class ProjectMenu extends Component { - render() { - const { authenticatedContext } = this.props; - const path = this.props.match.url; - return ( - - - - - - - - - - - - - - - ); - } -} +const ProjectMenu: FC = () => { + const authenticatedContext = useContext(AuthenticatedContext); -export default withRouter(withAuthenticatedContext(ProjectMenu)); + return ( + + + + + + ); +}; + +export default ProjectMenu; diff --git a/interface/src/project/ProjectRouting.tsx b/interface/src/project/ProjectRouting.tsx index 4ab78ad2c..fa1098ae2 100644 --- a/interface/src/project/ProjectRouting.tsx +++ b/interface/src/project/ProjectRouting.tsx @@ -1,38 +1,28 @@ -import { Component } from 'react'; -import { Redirect, Switch } from 'react-router'; +import { FC } from 'react'; +import { Navigate, Routes, Route } from 'react-router-dom'; -import { AuthenticatedRoute } from '../authentication'; +import { RequireAdmin } from '../components'; -import EMSESPDashboard from './EMSESPDashboard'; -import EMSESPSettings from './EMSESPSettings'; +import Dashboard from './Dashboard'; +import Settings from './Settings'; +import Help from './Help'; -class ProjectRouting extends Component { - render() { - return ( - - - - - {/* - * The redirect below caters for the default project route and redirecting invalid paths. - * The "to" property must match one of the routes above for this to work correctly. - */} - - - ); - } -} +const ProjectRouting: FC = () => { + return ( + + } /> + + + + } + /> + } /> + } /> + + ); +}; export default ProjectRouting; diff --git a/interface/src/project/SensorForm.tsx b/interface/src/project/SensorForm.tsx deleted file mode 100644 index ea77f516e..000000000 --- a/interface/src/project/SensorForm.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import React, { RefObject } from 'react'; -import { ValidatorForm, TextValidator } from 'react-material-ui-form-validator'; -import { - Dialog, - DialogTitle, - DialogContent, - DialogActions -} from '@material-ui/core'; - -import { FormButton } from '../components'; -import { Sensor } from './EMSESPtypes'; - -interface SensorFormProps { - sensor: Sensor; - onDoneEditing: () => void; - onCancelEditing: () => void; - handleSensorChange: ( - data: keyof Sensor - ) => (event: React.ChangeEvent) => void; -} - -class SensorForm extends React.Component { - formRef: RefObject = React.createRef(); - - submit = () => { - this.formRef.current.submit(); - }; - - render() { - const { - sensor, - handleSensorChange, - onDoneEditing, - onCancelEditing - } = this.props; - - return ( - - - - Editing Sensor #{sensor.n} - - - - - - - - Cancel - - - Done - - - - - ); - } -} - -export default SensorForm; diff --git a/interface/src/project/Settings.tsx b/interface/src/project/Settings.tsx new file mode 100644 index 000000000..3ce59f639 --- /dev/null +++ b/interface/src/project/Settings.tsx @@ -0,0 +1,30 @@ +import { FC } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; + +import { Tab } from '@mui/material'; + +import { RouterTabs, useRouterTab, useLayoutTitle } from '../components'; + +import SettingsApplication from './SettingsApplication'; +import SettingsCustomization from './SettingsCustomization'; + +const Settings: FC = () => { + useLayoutTitle('Settings'); + const { routerTab } = useRouterTab(); + + return ( + <> + + + + + + } /> + } /> + } /> + + + ); +}; + +export default Settings; diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx new file mode 100644 index 000000000..169a61818 --- /dev/null +++ b/interface/src/project/SettingsApplication.tsx @@ -0,0 +1,541 @@ +import { FC, useState } from 'react'; +import { ValidateFieldsError } from 'async-validator'; + +import { useSnackbar } from 'notistack'; + +import { Box, Button, Checkbox, MenuItem, Grid, Typography, Divider } from '@mui/material'; + +import SaveIcon from '@mui/icons-material/Save'; +import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; + +import { validate } from '../validators'; +import { createSettingsValidator } from './validators'; + +import { + SectionContent, + FormLoader, + BlockFormControlLabel, + ValidatedTextField, + ButtonRow, + MessageBox +} from '../components'; +import { numberValue, extractErrorMessage, updateValue, useRest } from '../utils'; + +import * as EMSESP from './api'; +import { Settings, BOARD_PROFILES } from './types'; + +export function boardProfileSelectItems() { + return Object.keys(BOARD_PROFILES).map((code) => ( + + {BOARD_PROFILES[code]} + + )); +} + +const SettingsApplication: FC = () => { + const { loadData, saveData, saving, setData, data, errorMessage, restartNeeded } = useRest({ + read: EMSESP.readSettings, + update: EMSESP.writeSettings + }); + + const { enqueueSnackbar } = useSnackbar(); + + const updateFormValue = updateValue(setData); + + const [fieldErrors, setFieldErrors] = useState(); + const [processingBoard, setProcessingBoard] = useState(false); + + const updateBoardProfile = async (board_profile: string) => { + setProcessingBoard(true); + try { + const response = await EMSESP.getBoardProfile({ board_profile: board_profile }); + if (data) { + setData({ + ...data, + board_profile: board_profile, + led_gpio: response.data.led_gpio, + dallas_gpio: response.data.dallas_gpio, + rx_gpio: response.data.rx_gpio, + tx_gpio: response.data.tx_gpio, + pbutton_gpio: response.data.pbutton_gpio, + phy_type: response.data.phy_type, + eth_power: response.data.eth_power, + eth_phy_addr: response.data.eth_phy_addr, + eth_clock_mode: response.data.eth_clock_mode + }); + } + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem fetching board profile'), { variant: 'error' }); + } finally { + setProcessingBoard(false); + } + }; + + const content = () => { + if (!data) { + return ; + } + + const validateAndSubmit = async () => { + try { + setFieldErrors(undefined); + await validate(createSettingsValidator(data), data); + saveData(); + } catch (errors: any) { + setFieldErrors(errors); + } + }; + + const changeBoardProfile = (event: React.ChangeEvent) => { + const board_profile = event.target.value; + if (board_profile === 'CUSTOM') { + setData({ + ...data, + board_profile: board_profile + }); + } else { + updateBoardProfile(board_profile); + } + }; + + const restart = async () => { + validateAndSubmit(); + try { + await EMSESP.restart(); + enqueueSnackbar('EMS-ESP is restarting...', { variant: 'info' }); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem restarting device'), { variant: 'error' }); + } + }; + + return ( + <> + + Interface Board Profile + + + + Select a pre-configured interface board profile from the list below or choose "Custom" to configure your own + hardware settings. + + + + {boardProfileSelectItems()} + + + Custom… + + + {data.board_profile === 'CUSTOM' && ( + <> + + + + + + + + + + + + + + + + + + + + No Ethernet Module + LAN8720 + TLK110 + + + {data.phy_type !== 0 && ( + + + + + + + + + + GPIO0_IN + GPIO0_OUT + GPIO16_OUT + GPIO17_OUT + + + + )} + + )} + + EMS Bus Settings + + + + + Off + EMS + EMS+ + HT3 + Hardware + + + + + Service Key (0x0B) + Modem (0x0D) + Terminal (0x0A) + Time Module (0x0F) + Alarm Module (0x12) + + + + + General Options + + {data.led_gpio !== 0 && ( + } + label="Hide LED" + disabled={saving} + /> + )} + } + label="Enable Telnet Console" + disabled={saving} + /> + } + label="Enable Analog Sensors" + disabled={saving} + /> + } + label="Convert temperature values to Fahrenheit" + disabled={saving} + /> + } + label="Underclock CPU speed" + disabled={saving} + /> + } + label="Bypass Access Token authorization on API calls" + disabled={saving} + /> + } + label="Enable Read only mode (blocks all outgoing EMS Tx write commands)" + disabled={saving} + /> + + } + label="Enable Shower Timer" + disabled={saving} + /> + } + label="Enable Shower Alert" + disabled={saving} + /> + + + Formatting Options + + + + + "on"/"off" + "ON"/"OFF" + "true"/"false" + true/false + "1"/"0" + 1/0 + + + + + Value + Index + + + + {data.dallas_gpio !== 0 && ( + <> + + Temperature Sensors + + } + label="Enable parasite power" + disabled={saving} + /> + + )} + + Logging + + } + label="Log EMS telegrams in hexadecimal" + disabled={saving} + /> + + } + label="Enable Syslog" + /> + {data.syslog_enabled && ( + + + + + + + + + + OFF + ERR + NOTICE + INFO + DEBUG + ALL + + + + + + + )} + {restartNeeded && ( + + + + )} + {!restartNeeded && ( + + + + )} + + ); + }; + + return ( + + {content()} + + ); +}; + +export default SettingsApplication; diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx new file mode 100644 index 000000000..e503a8362 --- /dev/null +++ b/interface/src/project/SettingsCustomization.tsx @@ -0,0 +1,281 @@ +import { FC, useState, useEffect, useCallback } from 'react'; + +import { + Button, + Table, + TableBody, + TableHead, + TableRow, + Typography, + Box, + MenuItem, + Dialog, + DialogActions, + DialogContent, + DialogTitle +} from '@mui/material'; + +import TableCell, { tableCellClasses } from '@mui/material/TableCell'; + +import { styled } from '@mui/material/styles'; + +import { useSnackbar } from 'notistack'; + +import SaveIcon from '@mui/icons-material/Save'; +import CloseIcon from '@mui/icons-material/Close'; +import CancelIcon from '@mui/icons-material/Cancel'; +import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; + +import { ButtonRow, FormLoader, ValidatedTextField, SectionContent } from '../components'; + +import * as EMSESP from './api'; + +import { extractErrorMessage } from '../utils'; + +import { DeviceShort, Devices, DeviceEntity } from './types'; + +const StyledTableCell = styled(TableCell)(({ theme }) => ({ + [`&.${tableCellClasses.head}`]: { + backgroundColor: '#607d8b', + color: theme.palette.common.white, + fontSize: 11 + }, + [`&.${tableCellClasses.body}`]: { + fontSize: 11 + } +})); + +const SettingsCustomization: FC = () => { + const { enqueueSnackbar } = useSnackbar(); + + const [deviceEntities, setDeviceEntities] = useState(); + const [devices, setDevices] = useState(); + const [errorMessage, setErrorMessage] = useState(); + const [selectedDevice, setSelectedDevice] = useState(0); + const [confirmReset, setConfirmReset] = useState(false); + + const fetchDevices = useCallback(async () => { + try { + setDevices((await EMSESP.readDevices()).data); + } catch (error: any) { + setErrorMessage(extractErrorMessage(error, 'Failed to fetch device list')); + } + }, []); + + const fetchDeviceEntities = async (unique_id: number) => { + try { + setDeviceEntities((await EMSESP.readDeviceEntities({ id: unique_id })).data); + } catch (error: any) { + setErrorMessage(extractErrorMessage(error, 'Problem fetching device entities')); + } + }; + + useEffect(() => { + fetchDevices(); + }, [fetchDevices]); + + function formatValue(value: any) { + if (typeof value === 'number') { + return new Intl.NumberFormat().format(value); + } else if (value === undefined) { + return ''; + } else if (typeof value === 'boolean') { + return value ? 'true' : 'false'; + } + return value; + } + + const renderDeviceList = () => { + if (!devices) { + return ; + } + + function compareDevices(a: DeviceShort, b: DeviceShort) { + if (a.s < b.s) { + return -1; + } + if (a.s > b.s) { + return 1; + } + return 0; + } + + const changeSelectedDevice = (event: React.ChangeEvent) => { + const selected_device = parseInt(event.target.value, 10); + setSelectedDevice(selected_device); + fetchDeviceEntities(selected_device); + }; + + return ( + <> + + + Customize which entities to exclude from all all services (MQTT, API). This will have immediate effect. + + + + + Select a device... + + {devices.devices.sort(compareDevices).map((device: DeviceShort, index) => ( + + {device.s} + + ))} + + + ); + }; + + const saveCustomization = async () => { + if (deviceEntities && selectedDevice) { + const exclude_entities = deviceEntities.filter((de) => de.x).map((new_de) => new_de.i); + try { + const response = await EMSESP.writeExcludeEntities({ + id: selectedDevice, + entity_ids: exclude_entities + }); + if (response.status === 200) { + enqueueSnackbar('Customization saved', { variant: 'success' }); + } else { + enqueueSnackbar('Customization save failed', { variant: 'error' }); + } + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem sending entity list'), { variant: 'error' }); + } + } + }; + + const renderDeviceData = () => { + if (devices?.devices.length === 0 || !deviceEntities) { + return; + } + + const toggleDeviceEntity = (id: number) => { + setDeviceEntities( + deviceEntities.map((o) => { + if (o.i === id) { + return { ...o, x: !o.x }; + } + return o; + }) + ); + }; + + return ( + <> + + + + + ({deviceEntities.reduce((a, v) => (v.x ? a + 1 : a), 0)}/{deviceEntities.length}) + + ENTITY NAME + CODE + VALUE + + + + {deviceEntities.map((de) => ( + toggleDeviceEntity(de.i)} + sx={de.x ? { backgroundColor: '#f8696b' } : { backgroundColor: 'black' }} + > + {de.x && } + + {de.n} + + {de.s} + {formatValue(de.v)} + + ))} + +
+ + ); + }; + + const resetCustomization = async () => { + try { + await EMSESP.resetCustomizations(); + enqueueSnackbar('All customizations have been removed. Restarting...', { variant: 'info' }); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem resetting customizations'), { variant: 'error' }); + } finally { + setConfirmReset(false); + } + }; + + const renderResetDialog = () => ( + setConfirmReset(false)}> + Reset + + Are you sure you want remove all customizations? EMS-ESP will then restart. + + + + + + + ); + + const content = () => { + return ( + <> + + Device Entities + + {renderDeviceList()} + {renderDeviceData()} + + + + + + + + + + + {renderResetDialog()} + + ); + }; + + return ( + + {content()} + + ); +}; + +export default SettingsCustomization; diff --git a/interface/src/project/ValueForm.tsx b/interface/src/project/ValueForm.tsx deleted file mode 100644 index 3b439fdf9..000000000 --- a/interface/src/project/ValueForm.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import React, { RefObject } from 'react'; -import { ValidatorForm } from 'react-material-ui-form-validator'; -import { - Dialog, - DialogTitle, - DialogContent, - DialogActions, - Box, - Typography, - FormHelperText, - OutlinedInput, - InputAdornment, - TextField, - MenuItem -} from '@material-ui/core'; - -import { FormButton } from '../components'; -import { DeviceValue, DeviceValueUOM_s } from './EMSESPtypes'; - -interface ValueFormProps { - devicevalue: DeviceValue; - onDoneEditing: () => void; - onCancelEditing: () => void; - handleValueChange: ( - data: keyof DeviceValue - ) => (event: React.ChangeEvent) => void; -} -class ValueForm extends React.Component { - formRef: RefObject = React.createRef(); - - submit = () => { - this.formRef.current.submit(); - }; - - render() { - const { - devicevalue, - handleValueChange, - onDoneEditing, - onCancelEditing - } = this.props; - - return ( - - - Change Value - - {devicevalue.l && ( - - {devicevalue.l.map((val) => ( - {val} - ))} - - )} - {!devicevalue.l && ( - - {DeviceValueUOM_s[devicevalue.u]} - - } - /> - )} - {devicevalue.n} - - - - Note: it may take a few seconds before the change is - registered with the EMS device. - - - - - - - Cancel - - - Done - - - - - ); - } -} - -export default ValueForm; diff --git a/interface/src/project/api.ts b/interface/src/project/api.ts new file mode 100644 index 000000000..f3a29a6bc --- /dev/null +++ b/interface/src/project/api.ts @@ -0,0 +1,89 @@ +import { AxiosPromise } from 'axios'; +import { AXIOS, AXIOS_API, AXIOS_BIN } from '../api/endpoints'; + +import { + BoardProfile, + BoardProfileName, + APIcall, + Settings, + Status, + CoreData, + Devices, + DeviceData, + DeviceEntity, + UniqueID, + ExcludeEntities, + WriteValue, + WriteSensor, + WriteAnalog, + SensorData +} from './types'; + +export function restart(): AxiosPromise { + return AXIOS.post('/restart'); +} + +export function readSettings(): AxiosPromise { + return AXIOS.get('/settings'); +} + +export function writeSettings(settings: Settings): AxiosPromise { + return AXIOS.post('/settings', settings); +} + +export function getBoardProfile(boardProfile: BoardProfileName): AxiosPromise { + return AXIOS.post('/boardProfile', boardProfile); +} + +export function readStatus(): AxiosPromise { + return AXIOS.get('/status'); +} + +export function readCoreData(): AxiosPromise { + return AXIOS.get('/coreData'); +} + +export function readDevices(): AxiosPromise { + return AXIOS.get('/devices'); +} + +export function scanDevices(): AxiosPromise { + return AXIOS.post('/scanDevices'); +} + +export function readDeviceData(unique_id: UniqueID): AxiosPromise { + return AXIOS_BIN.post('/deviceData', unique_id); +} + +export function readSensorData(): AxiosPromise { + return AXIOS.get('/sensorData'); +} + +export function readDeviceEntities(unique_id: UniqueID): AxiosPromise { + return AXIOS_BIN.post('/deviceEntities', unique_id); +} + +export function writeExcludeEntities(excludeEntities: ExcludeEntities): AxiosPromise { + return AXIOS.post('/excludeEntities', excludeEntities); +} + +export function writeValue(writevalue: WriteValue): AxiosPromise { + return AXIOS.post('/writeValue', writevalue); +} + +export function writeSensor(writesensor: WriteSensor): AxiosPromise { + return AXIOS.post('/writeSensor', writesensor); +} + +export function writeAnalog(writeanalog: WriteAnalog): AxiosPromise { + return AXIOS.post('/writeAnalog', writeanalog); +} + +export function resetCustomizations(): AxiosPromise { + return AXIOS.post('/resetCustomizations'); +} + +// EMS-ESP API calls +export function API(apiCall: APIcall): AxiosPromise { + return AXIOS_API.post('/', apiCall); +} diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts new file mode 100644 index 000000000..84ea398b9 --- /dev/null +++ b/interface/src/project/types.ts @@ -0,0 +1,254 @@ +export interface Settings { + tx_mode: number; + ems_bus_id: number; + syslog_enabled: boolean; + syslog_level: number; + syslog_mark_interval: number; + syslog_host: string; + syslog_port: number; + master_thermostat: number; + shower_timer: boolean; + shower_alert: boolean; + rx_gpio: number; + tx_gpio: number; + telnet_enabled: boolean; + dallas_gpio: number; + dallas_parasite: boolean; + led_gpio: number; + hide_led: boolean; + low_clock: boolean; + notoken_api: boolean; + readonly_mode: boolean; + analog_enabled: boolean; + pbutton_gpio: number; + trace_raw: boolean; + board_profile: string; + bool_format: number; + enum_format: number; + fahrenheit: boolean; + phy_type: number; + eth_power: number; + eth_phy_addr: number; + eth_clock_mode: number; +} + +export enum busConnectionStatus { + BUS_STATUS_CONNECTED = 0, + BUS_STATUS_TX_ERRORS = 1, + BUS_STATUS_OFFLINE = 2 +} + +export interface Status { + status: busConnectionStatus; + tx_mode: number; + rx_received: number; + tx_reads: number; + tx_writes: number; + rx_quality: number; + tx_read_quality: number; + tx_write_quality: number; + tx_read_fails: number; + tx_write_fails: number; + rx_fails: number; + sensor_fails: number; + sensor_reads: number; + sensor_quality: number; + analog_fails: number; + analog_reads: number; + analog_quality: number; + mqtt_count: number; + mqtt_fails: number; + mqtt_quality: number; + api_calls: number; + api_fails: number; + api_quality: number; + num_devices: number; + num_sensors: number; + num_analogs: number; + uptime: number; +} + +export interface Device { + i: number; // id + t: string; // type + b: string; // brand + n: string; // name + d: number; // deviceid + p: number; // productid + v: string; // version + e: number; // number of entries +} + +export interface Sensor { + is: string; // id string + n: string; // name/alias + t?: number; // temp, optional + o: number; // offset + u: number; // uom +} + +export interface Analog { + i: number; + n: string; + v?: number; + u: number; + o: number; + f: number; + t: number; +} + +export interface WriteSensor { + id_str: string; + name: string; + offset: number; +} + +export interface SensorData { + sensors: Sensor[]; + analogs: Analog[]; +} + +export interface CoreData { + devices: Device[]; + active_sensors: number; + analog_enabled: boolean; +} + +export interface DeviceShort { + i: number; // id + d: number; // deviceid + p: number; // productid + s: string; // shortname +} + +export interface Devices { + devices: DeviceShort[]; +} + +export interface DeviceValue { + v?: any; // value, in any format + u: number; // uom + n: string; // name + c: string; // command + l: string[]; // list +} + +export interface DeviceData { + label: string; + data: DeviceValue[]; +} + +export interface DeviceEntity { + v?: any; // value, in any format + n: string; // name + s: string; // shortname + x: boolean; // excluded flag + i: number; // unique id +} + +export interface ExcludeEntities { + id: number; + entity_ids: number[]; +} + +export interface UniqueID { + id: number; +} + +export enum DeviceValueUOM { + NONE = 0, + DEGREES, + DEGREES_R, + PERCENT, + LMIN, + KWH, + WH, + HOURS, + MINUTES, + UA, + BAR, + KW, + W, + KB, + SECONDS, + DBM, + FAHRENHEIT, + MV, + SQM +} + +export const DeviceValueUOM_s = [ + '', + '°C', + '°C', + '%', + 'l/min', + 'kWh', + 'Wh', + 'hours', + 'minutes', + 'uA', + 'bar', + 'kW', + 'W', + 'KB', + 'second', + 'dBm', + '°F', + 'mV', + 'sqm', + "o'clock" +]; + +export const AnalogTypes = ['(disabled)', 'Digital in', 'Counter', 'ADC']; + +type BoardProfiles = { + [name: string]: string; +}; + +export const BOARD_PROFILES: BoardProfiles = { + S32: 'BBQKees Gateway S32', + E32: 'BBQKees Gateway E32', + NODEMCU: 'NodeMCU 32S', + 'MH-ET': 'MH-ET Live D1 Mini', + LOLIN: 'Lolin D32', + OLIMEX: 'Olimex ESP32-EVB', + OLIMEXPOE: 'Olimex ESP32-POE' +}; + +export interface BoardProfileName { + board_profile: string; +} + +export interface BoardProfile { + board_profile: string; + led_gpio: number; + dallas_gpio: number; + rx_gpio: number; + tx_gpio: number; + pbutton_gpio: number; + phy_type: number; + eth_power: number; + eth_phy_addr: number; + eth_clock_mode: number; +} + +export interface APIcall { + device: string; + entity: string; + id: any; +} + +export interface WriteValue { + id: number; + devicevalue: DeviceValue; +} + +export interface WriteAnalog { + id: number; + name: string; + factor: number; + offset: number; + uom: number; + type: number; +} diff --git a/interface/src/project/validators.ts b/interface/src/project/validators.ts new file mode 100644 index 000000000..88742d3e4 --- /dev/null +++ b/interface/src/project/validators.ts @@ -0,0 +1,44 @@ +import Schema, { InternalRuleItem } from 'async-validator'; +import { IP_OR_HOSTNAME_VALIDATOR } from '../validators/shared'; +import { Settings } from './types'; + +export const GPIO_VALIDATOR = { + validator(rule: InternalRuleItem, value: number, callback: (error?: string) => void) { + if ( + value && + (value === 1 || + (value >= 6 && value <= 12) || + (value >= 14 && value <= 15) || + value === 20 || + value === 24 || + (value >= 28 && value <= 31) || + value > 40) + ) { + callback('Must be an valid GPIO port'); + } else { + callback(); + } + } +}; + +export const createSettingsValidator = (settings: Settings) => + new Schema({ + ...(settings.board_profile === 'CUSTOM' && { + led_gpio: [{ required: true, message: 'LED GPIO is required' }, GPIO_VALIDATOR], + dallas_gpio: [{ required: true, message: 'GPIO is required' }, GPIO_VALIDATOR], + pbutton_gpio: [{ required: true, message: 'Button GPIO is required' }, GPIO_VALIDATOR], + tx_gpio: [{ required: true, message: 'Tx GPIO is required' }, GPIO_VALIDATOR], + rx_gpio: [{ required: true, message: 'Rx GPIO is required' }, GPIO_VALIDATOR] + }), + ...(settings.syslog_enabled && { + syslog_host: [{ required: true, message: 'Host is required' }, IP_OR_HOSTNAME_VALIDATOR], + syslog_port: [ + { required: true, message: 'Port is required' }, + { type: 'number', min: 0, max: 65535, message: 'Port must be between 0 and 65535' } + ], + syslog_mark_interval: [ + { required: true, message: 'Mark interval is required' }, + { type: 'number', min: 0, max: 10, message: 'Port must be between 0 and 10' } + ] + }) + }); diff --git a/interface/src/security/GenerateToken.tsx b/interface/src/security/GenerateToken.tsx deleted file mode 100644 index 6c6ee19b2..000000000 --- a/interface/src/security/GenerateToken.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import React, { Fragment } from 'react'; -import { - Dialog, - DialogTitle, - DialogContent, - DialogActions, - Box, - LinearProgress, - Typography, - TextField -} from '@material-ui/core'; - -import { FormButton } from '../components'; -import { redirectingAuthorizedFetch } from '../authentication'; -import { GENERATE_TOKEN_ENDPOINT } from '../api'; -import { withSnackbar, WithSnackbarProps } from 'notistack'; - -interface GenerateTokenProps extends WithSnackbarProps { - username: string; - onClose: () => void; -} - -interface GenerateTokenState { - token?: string; -} - -class GenerateToken extends React.Component< - GenerateTokenProps, - GenerateTokenState -> { - state: GenerateTokenState = {}; - - componentDidMount() { - const { username } = this.props; - redirectingAuthorizedFetch( - GENERATE_TOKEN_ENDPOINT + '?' + new URLSearchParams({ username }), - { method: 'GET' } - ) - .then((response) => { - if (response.status === 200) { - return response.json(); - } else { - throw Error('Error generating token: ' + response.status); - } - }) - .then((generatedToken) => { - this.setState({ token: generatedToken.token }); - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem generating token', - { variant: 'error' } - ); - }); - } - - render() { - const { onClose, username } = this.props; - const { token } = this.state; - return ( - - - Token for: {username} - - - {token ? ( - - - - The token below may be used to access the secured APIs, either - as a Bearer authentication in the "Authorization" header or - using the "access_token" query parameter. - - - - - - - ) : ( - - - Generating token… - - )} - - - - Close - - - - ); - } -} - -export default withSnackbar(GenerateToken); diff --git a/interface/src/security/ManageUsersController.tsx b/interface/src/security/ManageUsersController.tsx deleted file mode 100644 index 02ed43da6..000000000 --- a/interface/src/security/ManageUsersController.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { SECURITY_SETTINGS_ENDPOINT } from '../api'; - -import ManageUsersForm from './ManageUsersForm'; -import { SecuritySettings } from './types'; - -type ManageUsersControllerProps = RestControllerProps; - -class ManageUsersController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController( - SECURITY_SETTINGS_ENDPOINT, - ManageUsersController -); diff --git a/interface/src/security/ManageUsersForm.tsx b/interface/src/security/ManageUsersForm.tsx deleted file mode 100644 index c79172d64..000000000 --- a/interface/src/security/ManageUsersForm.tsx +++ /dev/null @@ -1,259 +0,0 @@ -import React, { Fragment } from 'react'; -import { ValidatorForm } from 'react-material-ui-form-validator'; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableFooter, - TableRow, - withWidth, - WithWidthProps, - isWidthDown -} from '@material-ui/core'; -import { Box, Button, Typography } from '@material-ui/core'; - -import EditIcon from '@material-ui/icons/Edit'; -import DeleteIcon from '@material-ui/icons/Delete'; -import CloseIcon from '@material-ui/icons/Close'; -import CheckIcon from '@material-ui/icons/Check'; -import IconButton from '@material-ui/core/IconButton'; -import SaveIcon from '@material-ui/icons/Save'; -import PersonAddIcon from '@material-ui/icons/PersonAdd'; -import VpnKeyIcon from '@material-ui/icons/VpnKey'; - -import { - withAuthenticatedContext, - AuthenticatedContextProps -} from '../authentication'; -import { - RestFormProps, - FormActions, - FormButton, - extractEventValue -} from '../components'; - -import UserForm from './UserForm'; -import { SecuritySettings, User } from './types'; -import GenerateToken from './GenerateToken'; - -function compareUsers(a: User, b: User) { - if (a.username < b.username) { - return -1; - } - if (a.username > b.username) { - return 1; - } - return 0; -} - -type ManageUsersFormProps = RestFormProps & - AuthenticatedContextProps & - WithWidthProps; - -type ManageUsersFormState = { - creating: boolean; - user?: User; - generateTokenFor?: string; -}; - -class ManageUsersForm extends React.Component< - ManageUsersFormProps, - ManageUsersFormState -> { - state: ManageUsersFormState = { - creating: false - }; - - createUser = () => { - this.setState({ - creating: true, - user: { - username: '', - password: '', - admin: true - } - }); - }; - - uniqueUsername = (username: string) => { - return !this.props.data.users.find((u) => u.username === username); - }; - - noAdminConfigured = () => { - return !this.props.data.users.find((u) => u.admin); - }; - - removeUser = (user: User) => { - const { data } = this.props; - const users = data.users.filter((u) => u.username !== user.username); - this.props.setData({ ...data, users }); - }; - - closeGenerateToken = () => { - this.setState({ - generateTokenFor: undefined - }); - }; - - generateToken = (user: User) => { - this.setState({ - generateTokenFor: user.username - }); - }; - - startEditingUser = (user: User) => { - this.setState({ - creating: false, - user - }); - }; - - cancelEditingUser = () => { - this.setState({ - user: undefined - }); - }; - - doneEditingUser = () => { - const { user } = this.state; - if (user) { - const { data } = this.props; - const users = data.users.filter((u) => u.username !== user.username); - users.push(user); - this.props.setData({ ...data, users }); - this.setState({ - user: undefined - }); - } - }; - - handleUserValueChange = (name: keyof User) => ( - event: React.ChangeEvent - ) => { - this.setState({ - user: { ...this.state.user!, [name]: extractEventValue(event) } - }); - }; - - onSubmit = () => { - this.props.saveData(); - this.props.authenticatedContext.refresh(); - }; - - render() { - const { width, data } = this.props; - const { user, creating, generateTokenFor } = this.state; - return ( - - - - - - Username - Admin? - - - - - {data.users.sort(compareUsers).map((user) => ( - - - {user.username} - - - {user.admin ? : } - - - this.generateToken(user)} - > - - - this.removeUser(user)} - > - - - this.startEditingUser(user)} - > - - - - - ))} - - - - - - - - - -
- {this.noAdminConfigured() && ( - - - You must have at least one admin user configured. - - - )} - - } - variant="contained" - color="primary" - type="submit" - disabled={this.noAdminConfigured()} - > - Save - - -
- {generateTokenFor && ( - - )} - {user && ( - - )} -
- ); - } -} - -export default withAuthenticatedContext(withWidth()(ManageUsersForm)); diff --git a/interface/src/security/Security.tsx b/interface/src/security/Security.tsx deleted file mode 100644 index cab47a709..000000000 --- a/interface/src/security/Security.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom'; - -import { Tabs, Tab } from '@material-ui/core'; - -import { - AuthenticatedContextProps, - AuthenticatedRoute -} from '../authentication'; -import { MenuAppBar } from '../components'; - -import ManageUsersController from './ManageUsersController'; -import SecuritySettingsController from './SecuritySettingsController'; - -type SecurityProps = AuthenticatedContextProps & RouteComponentProps; - -class Security extends Component { - handleTabChange = (path: string) => { - this.props.history.push(path); - }; - - render() { - return ( - - this.handleTabChange(path)} - variant="fullWidth" - > - - - - - - - - - - ); - } -} - -export default Security; diff --git a/interface/src/security/SecuritySettingsController.tsx b/interface/src/security/SecuritySettingsController.tsx deleted file mode 100644 index e98885011..000000000 --- a/interface/src/security/SecuritySettingsController.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React, { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { SECURITY_SETTINGS_ENDPOINT } from '../api'; - -import SecuritySettingsForm from './SecuritySettingsForm'; -import { SecuritySettings } from './types'; - -type SecuritySettingsControllerProps = RestControllerProps; - -class SecuritySettingsController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController( - SECURITY_SETTINGS_ENDPOINT, - SecuritySettingsController -); diff --git a/interface/src/security/SecuritySettingsForm.tsx b/interface/src/security/SecuritySettingsForm.tsx deleted file mode 100644 index fa770f8ce..000000000 --- a/interface/src/security/SecuritySettingsForm.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from 'react'; -import { ValidatorForm } from 'react-material-ui-form-validator'; - -import { Box, Typography } from '@material-ui/core'; -import SaveIcon from '@material-ui/icons/Save'; - -import { - withAuthenticatedContext, - AuthenticatedContextProps -} from '../authentication'; -import { - RestFormProps, - PasswordValidator, - FormActions, - FormButton -} from '../components'; - -import { SecuritySettings } from './types'; - -type SecuritySettingsFormProps = RestFormProps & - AuthenticatedContextProps; - -class SecuritySettingsForm extends React.Component { - onSubmit = () => { - this.props.saveData(); - this.props.authenticatedContext.refresh(); - }; - - render() { - const { data, handleValueChange } = this.props; - return ( - - - - - The Super User password is used to sign authentication tokens and is - also the Console's `su` password. If you modify this all users will - be signed out. - - - - } - variant="contained" - color="primary" - type="submit" - > - Save - - - - ); - } -} - -export default withAuthenticatedContext(SecuritySettingsForm); diff --git a/interface/src/security/UserForm.tsx b/interface/src/security/UserForm.tsx deleted file mode 100644 index db7d140a5..000000000 --- a/interface/src/security/UserForm.tsx +++ /dev/null @@ -1,142 +0,0 @@ -import React, { RefObject } from 'react'; -import { TextValidator, ValidatorForm } from 'react-material-ui-form-validator'; - -import { - Dialog, - DialogTitle, - DialogContent, - DialogActions, - Checkbox -} from '@material-ui/core'; - -import { - PasswordValidator, - BlockFormControlLabel, - FormButton -} from '../components'; - -import { User } from './types'; - -interface UserFormProps { - creating: boolean; - user: User; - uniqueUsername: (value: any) => boolean; - handleValueChange: ( - name: keyof User - ) => (event: React.ChangeEvent) => void; - onDoneEditing: () => void; - onCancelEditing: () => void; -} - -class UserForm extends React.Component { - formRef: RefObject = React.createRef(); - - componentDidMount() { - ValidatorForm.addValidationRule( - 'uniqueUsername', - this.props.uniqueUsername - ); - } - - submit = () => { - this.formRef.current.submit(); - }; - - render() { - const { - user, - creating, - handleValueChange, - onDoneEditing, - onCancelEditing - } = this.props; - return ( - - - - {creating ? 'Add' : 'Modify'} User - - - - - - } - label="Admin?" - /> - - - - Cancel - - - Done - - - - - ); - } -} - -export default UserForm; diff --git a/interface/src/serviceWorker.ts b/interface/src/serviceWorker.ts deleted file mode 100644 index d9941b314..000000000 --- a/interface/src/serviceWorker.ts +++ /dev/null @@ -1,142 +0,0 @@ -// This optional code is used to register a service worker. -// register() is not called by default. - -// This lets the app load faster on subsequent visits in production, and gives -// it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on subsequent visits to a page, after all the -// existing tabs open on the page have been closed, since previously cached -// resources are updated in the background. - -// To learn more about the benefits of this model and instructions on how to -// opt-in, read https://bit.ly/CRA-PWA - -const isLocalhost = Boolean( - window.location.hostname === 'localhost' || - // [::1] is the IPv6 localhost address. - window.location.hostname === '[::1]' || - // 127.0.0.0/8 are considered localhost for IPv4. - window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ - ) -); - -type Config = { - onSuccess?: (registration: ServiceWorkerRegistration) => void; - onUpdate?: (registration: ServiceWorkerRegistration) => void; -}; - -export function register(config?: Config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebook/create-react-app/issues/2374 - return; - } - - window.addEventListener('load', () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; - - if (isLocalhost) { - // This is running on localhost. Let's check if a service worker still exists or not. - checkValidServiceWorker(swUrl, config); - - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit https://bit.ly/CRA-PWA' - ); - }); - } else { - // Is not localhost. Just register service worker - registerValidSW(swUrl, config); - } - }); - } -} - -function registerValidSW(swUrl: string, config?: Config) { - navigator.serviceWorker - .register(swUrl) - .then((registration) => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker == null) { - return; - } - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' - ); - - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration); - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); - - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration); - } - } - } - }; - }; - }) - .catch((error) => { - console.error('Error during service worker registration:', error); - }); -} - -function checkValidServiceWorker(swUrl: string, config?: Config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl, { - headers: { 'Service-Worker': 'script' } - }) - .then((response) => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); - if ( - response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then((registration) => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config); - } - }) - .catch(() => { - console.log( - 'No internet connection found. App is running in offline mode.' - ); - }); -} - -export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then((registration) => { - registration.unregister(); - }); - } -} diff --git a/interface/src/setupProxy.js b/interface/src/setupProxy.js index 5a8e4ac3d..cbf791050 100644 --- a/interface/src/setupProxy.js +++ b/interface/src/setupProxy.js @@ -1,21 +1,19 @@ +const pkg = require('../package.json'); const { createProxyMiddleware } = require('http-proxy-middleware'); +const target = process.env.PROXY || pkg.proxy; module.exports = function (app) { app.use( - '/rest/*', - createProxyMiddleware({ - target: 'http://localhost:3080', - secure: false, - changeOrigin: true + createProxyMiddleware('/api', { + target }) ); - app.use( - '/es/*', - createProxyMiddleware({ - target: 'http://localhost:3090', - secure: false, - changeOrigin: true - }) - ); + // app.use( + // createProxyMiddleware('/ws', { + // target: target, + // // target: target.replace(/^http(s?):\/\//, 'ws$1://'), + // ws: true + // }) + // ); }; diff --git a/interface/src/system/LogEventConsole.tsx b/interface/src/system/LogEventConsole.tsx deleted file mode 100644 index 87ee55f6e..000000000 --- a/interface/src/system/LogEventConsole.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { FC } from 'react'; - -import { LogEvent, LogLevel } from './types'; -import { Theme, makeStyles, Box } from '@material-ui/core'; -import { useWindowSize } from '../components'; - -interface LogEventConsoleProps { - events: LogEvent[]; - compact: boolean; - level: number; -} - -interface Offsets { - topOffset: () => number; - leftOffset: () => number; -} - -const topOffset = () => - document.getElementById('log-window')?.getBoundingClientRect().bottom || 0; - -const leftOffset = () => - document.getElementById('log-window')?.getBoundingClientRect().left || 0; - -const useStyles = makeStyles((theme: Theme) => ({ - console: { - padding: theme.spacing(1), - position: 'absolute', - left: (offsets: Offsets) => offsets.leftOffset(), - right: 24, - top: (offsets: Offsets) => offsets.topOffset(), - bottom: 24, - backgroundColor: 'black', - overflow: 'auto' - }, - entry: { - color: '#bbbbbb', - fontFamily: 'monospace', - fontSize: '14px', - letterSpacing: 'normal', - whiteSpace: 'nowrap' - }, - debug: { - color: '#00FFFF' - }, - trace: { - color: '#00FFFF' - }, - info: { - color: '#ffff00' - }, - notice: { - color: '#ffff00' - }, - error: { - color: '#ff0000' - }, - warning: { - color: '#ff0000' - }, - default: { - color: '#ffffff' - } -})); - -const LogEventConsole: FC = (props) => { - useWindowSize(); - const classes = useStyles({ topOffset, leftOffset }); - const { events, compact } = props; - - const styleLevel = (level: LogLevel) => { - switch (level) { - case LogLevel.DEBUG: - return classes.debug; - case LogLevel.TRACE: - return classes.trace; - case LogLevel.INFO: - return classes.info; - case LogLevel.NOTICE: - return classes.notice; - case LogLevel.WARNING: - return classes.warning; - case LogLevel.ERROR: - return classes.error; - default: - return classes.default; - } - }; - - const levelLabel = (level: LogLevel) => { - switch (level) { - case LogLevel.ERROR: - return 'ERROR'; - case LogLevel.WARNING: - return 'WARNING'; - case LogLevel.NOTICE: - return 'NOTICE'; - case LogLevel.INFO: - return 'INFO'; - case LogLevel.DEBUG: - return 'DEBUG'; - case LogLevel.TRACE: - return 'TRACE'; - default: - return ''; - } - }; - - const paddedLevelLabel = (level: LogLevel, compact: boolean) => { - const label = levelLabel(level); - return compact ? ' ' + label[0] : label.padStart(8, '\xa0'); - }; - - const paddedNameLabel = (name: string, compact: boolean) => { - const label = '[' + name + ']'; - return compact ? label : label.padEnd(12, '\xa0'); - }; - - const paddedIDLabel = (id: number, compact: boolean) => { - const label = id + ':'; - return compact ? label : label.padEnd(7, '\xa0'); - }; - - return ( - - {events.map((e) => ( -
- {e.t} - {compact && {paddedLevelLabel(e.l, compact)} } - {!compact && ( - - {paddedLevelLabel(e.l, compact)}{' '} - - )} - {paddedIDLabel(e.i, compact)} - {paddedNameLabel(e.n, compact)} - {e.m} -
- ))} -
- ); -}; - -export default LogEventConsole; diff --git a/interface/src/system/LogEventController.tsx b/interface/src/system/LogEventController.tsx deleted file mode 100644 index 9a4cca052..000000000 --- a/interface/src/system/LogEventController.tsx +++ /dev/null @@ -1,344 +0,0 @@ -import { Component } from 'react'; - -import { - restController, - RestControllerProps, - SectionContent, - BlockFormControlLabel -} from '../components'; - -import { - ValidatorForm, - SelectValidator -} from 'react-material-ui-form-validator'; - -import { - Grid, - Slider, - FormLabel, - Checkbox, - MenuItem, - Button -} from '@material-ui/core'; - -import { - addAccessTokenParameter, - redirectingAuthorizedFetch -} from '../authentication'; - -import DownloadIcon from '@material-ui/icons/GetApp'; - -import { ENDPOINT_ROOT, EVENT_SOURCE_ROOT } from '../api'; -export const FETCH_LOG_ENDPOINT = ENDPOINT_ROOT + 'fetchLog'; -export const LOG_SETTINGS_ENDPOINT = ENDPOINT_ROOT + 'logSettings'; -export const LOG_EVENT_EVENT_SOURCE_URL = EVENT_SOURCE_ROOT + 'log'; - -import LogEventConsole from './LogEventConsole'; -import { LogEvent, LogSettings, LogLevel } from './types'; - -import { Decoder } from '@msgpack/msgpack'; -const decoder = new Decoder(); - -interface LogEventControllerState { - eventSource?: EventSource; - events: LogEvent[]; - compact: boolean; - level: number; - max_messages: number; - last_id: number; -} - -type LogEventControllerProps = RestControllerProps; - -class LogEventController extends Component< - LogEventControllerProps, - LogEventControllerState -> { - eventSource?: EventSource; - reconnectTimeout?: NodeJS.Timeout; - - constructor(props: LogEventControllerProps) { - super(props); - this.state = { - events: [], - compact: false, - level: 6, - max_messages: 25, - last_id: 0 - }; - } - - componentDidMount() { - this.fetchValues(); - this.fetchLog(); - this.configureEventSource(); - } - - componentWillUnmount() { - if (this.eventSource) { - this.eventSource.close(); - } - if (this.reconnectTimeout) { - clearTimeout(this.reconnectTimeout); - } - } - - changeCompact = ( - event: React.ChangeEvent, - checked: boolean - ) => { - this.setState({ - compact: checked - }); - this.send_data( - this.state.level, - this.state.max_messages, - checked as boolean - ); - }; - - fetchLog = () => { - fetch(FETCH_LOG_ENDPOINT) - .then((response) => { - if (response.status === 200) { - return response.arrayBuffer(); - } else { - throw Error('Unexpected status code: ' + response.status); - } - }) - .then((arrayBuffer) => { - const json: any = decoder.decode(arrayBuffer); - this.setState({ events: json.events }); - }) - .catch((error) => { - this.setState({ events: [] }); - throw Error('Unexpected error: ' + error); - }); - }; - - fetchValues = () => { - redirectingAuthorizedFetch(LOG_SETTINGS_ENDPOINT) - .then((response) => { - if (response.status === 200) { - return response.json(); - } - throw Error('Unexpected status code: ' + response.status); - }) - .then((json) => { - this.setState({ - level: json.level, - max_messages: json.max_messages, - compact: json.compact - }); - }) - .catch((error) => { - const errorMessage = error.message || 'Unknown error'; - this.props.enqueueSnackbar('Problem fetching: ' + errorMessage, { - variant: 'error' - }); - }); - }; - - configureEventSource = () => { - this.eventSource = new EventSource( - addAccessTokenParameter(LOG_EVENT_EVENT_SOURCE_URL) - ); - this.eventSource.onmessage = this.onMessage; - this.eventSource.onerror = this.onError; - }; - - onError = () => { - if (this.eventSource && this.reconnectTimeout) { - this.eventSource.close(); - this.eventSource = undefined; - this.reconnectTimeout = setTimeout(this.configureEventSource, 1000); - } - }; - - onMessage = (event: MessageEvent) => { - const rawData = event.data; - if (typeof rawData === 'string' || rawData instanceof String) { - const event = JSON.parse(rawData as string) as LogEvent; - if (event.i > this.state.last_id) { - this.setState({ last_id: event.i }); - this.setState((state) => ({ events: [...state.events, event] })); - } - } - }; - - changeMaxMessages = ( - event: React.ChangeEvent<{}>, - value: number | number[] - ) => { - this.setState({ - max_messages: value as number - }); - this.send_data(this.state.level, value as number, this.state.compact); - }; - - changeLevel = (event: React.ChangeEvent) => { - this.setState({ - level: parseInt(event.target.value) - }); - this.send_data( - parseInt(event.target.value), - this.state.max_messages, - this.state.compact - ); - }; - - send_data = (level: number, max_messages: number, compact: boolean) => { - redirectingAuthorizedFetch(LOG_SETTINGS_ENDPOINT, { - method: 'POST', - body: JSON.stringify({ - level: level, - max_messages: max_messages, - compact: compact - }), - headers: { - 'Content-Type': 'application/json' - } - }) - .then((response) => { - if (response.status !== 200) { - throw Error('Unexpected response code: ' + response.status); - } - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem applying log settings', - { variant: 'warning' } - ); - }); - }; - - levelLabel = (level: LogLevel) => { - switch (level) { - case LogLevel.ERROR: - return 'E'; - case LogLevel.WARNING: - return 'W'; - case LogLevel.NOTICE: - return 'N'; - case LogLevel.INFO: - return 'I'; - case LogLevel.DEBUG: - return 'D'; - case LogLevel.TRACE: - return 'T'; - default: - return ''; - } - }; - - onDownload = () => { - const { events } = this.state; - let result = ''; - for (const i in events) { - result += - events[i].t + - ' ' + - this.levelLabel(events[i].l) + - ' ' + - events[i].i + - ': [' + - events[i].n + - '] ' + - events[i].m + - '\n'; - } - const a = document.createElement('a'); - a.setAttribute( - 'href', - 'data:text/plain;charset=utf-8,' + encodeURIComponent(result) - ); - a.setAttribute('download', 'log.txt'); - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - }; - - render() { - const { saveData } = this.props; - return ( - - - - - - ERROR - WARNING - NOTICE - INFO - DEBUG - ALL - - - - Buffer size - - - - - } - label="Compact Layout" - /> - - - - - - - - - - ); - } -} - -export default restController(LOG_SETTINGS_ENDPOINT, LogEventController); diff --git a/interface/src/system/OTASettingsController.tsx b/interface/src/system/OTASettingsController.tsx deleted file mode 100644 index b18f5ce5a..000000000 --- a/interface/src/system/OTASettingsController.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { OTA_SETTINGS_ENDPOINT } from '../api'; - -import OTASettingsForm from './OTASettingsForm'; -import { OTASettings } from './types'; - -type OTASettingsControllerProps = RestControllerProps; - -class OTASettingsController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(OTA_SETTINGS_ENDPOINT, OTASettingsController); diff --git a/interface/src/system/OTASettingsForm.tsx b/interface/src/system/OTASettingsForm.tsx deleted file mode 100644 index 394eba4a8..000000000 --- a/interface/src/system/OTASettingsForm.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react'; -import { TextValidator, ValidatorForm } from 'react-material-ui-form-validator'; - -import { Checkbox } from '@material-ui/core'; -import SaveIcon from '@material-ui/icons/Save'; - -import { - RestFormProps, - BlockFormControlLabel, - PasswordValidator, - FormButton, - FormActions -} from '../components'; - -import { isIP, isHostname, or } from '../validators'; - -import { OTASettings } from './types'; - -type OTASettingsFormProps = RestFormProps; - -class OTASettingsForm extends React.Component { - componentDidMount() { - ValidatorForm.addValidationRule('isIPOrHostname', or(isIP, isHostname)); - } - - render() { - const { data, handleValueChange, saveData } = this.props; - return ( - - - } - label="Enable OTA Updates" - /> - - - - } - variant="contained" - color="primary" - type="submit" - > - Save - - - - ); - } -} - -export default OTASettingsForm; diff --git a/interface/src/system/System.tsx b/interface/src/system/System.tsx deleted file mode 100644 index e9bdf0394..000000000 --- a/interface/src/system/System.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { Component } from 'react'; -import { Redirect, Switch, RouteComponentProps } from 'react-router-dom'; - -import { Tabs, Tab } from '@material-ui/core'; - -import { WithFeaturesProps, withFeatures } from '../features/FeaturesContext'; - -import { - withAuthenticatedContext, - AuthenticatedContextProps, - AuthenticatedRoute -} from '../authentication'; -import { MenuAppBar } from '../components'; - -import SystemStatusController from './SystemStatusController'; -import OTASettingsController from './OTASettingsController'; -import UploadFirmwareController from './UploadFirmwareController'; -import LogEventController from './LogEventController'; - -type SystemProps = AuthenticatedContextProps & - RouteComponentProps & - WithFeaturesProps; - -class System extends Component { - handleTabChange = (path: string) => { - this.props.history.push(path); - }; - - render() { - const { authenticatedContext, features } = this.props; - return ( - - this.handleTabChange(path)} - variant="fullWidth" - > - - - {features.ota && ( - - )} - {features.upload_firmware && ( - - )} - - - - - {features.ota && ( - - )} - {features.upload_firmware && ( - - )} - - - - ); - } -} - -export default withFeatures(withAuthenticatedContext(System)); diff --git a/interface/src/system/SystemStatusController.tsx b/interface/src/system/SystemStatusController.tsx deleted file mode 100644 index 4d77ef1ab..000000000 --- a/interface/src/system/SystemStatusController.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React, { Component } from 'react'; - -import { - restController, - RestControllerProps, - RestFormLoader, - SectionContent -} from '../components'; -import { SYSTEM_STATUS_ENDPOINT } from '../api'; - -import SystemStatusForm from './SystemStatusForm'; -import { SystemStatus } from './types'; - -type SystemStatusControllerProps = RestControllerProps; - -class SystemStatusController extends Component { - componentDidMount() { - this.props.loadData(); - } - - render() { - return ( - - } - /> - - ); - } -} - -export default restController(SYSTEM_STATUS_ENDPOINT, SystemStatusController); diff --git a/interface/src/system/SystemStatusForm.tsx b/interface/src/system/SystemStatusForm.tsx deleted file mode 100644 index 2b5df2b00..000000000 --- a/interface/src/system/SystemStatusForm.tsx +++ /dev/null @@ -1,376 +0,0 @@ -import React, { Component, Fragment } from 'react'; - -import { - Avatar, - Button, - Divider, - Dialog, - DialogTitle, - DialogContent, - DialogActions, - Box -} from '@material-ui/core'; -import { - List, - ListItem, - ListItemAvatar, - ListItemText -} from '@material-ui/core'; - -import DevicesIcon from '@material-ui/icons/Devices'; -import MemoryIcon from '@material-ui/icons/Memory'; -import ShowChartIcon from '@material-ui/icons/ShowChart'; -import FolderIcon from '@material-ui/icons/Folder'; -import AppsIcon from '@material-ui/icons/Apps'; -import PowerSettingsNewIcon from '@material-ui/icons/PowerSettingsNew'; -import RefreshIcon from '@material-ui/icons/Refresh'; -import SettingsBackupRestoreIcon from '@material-ui/icons/SettingsBackupRestore'; -import TimerIcon from '@material-ui/icons/Timer'; -import BuildIcon from '@material-ui/icons/Build'; - -import { - redirectingAuthorizedFetch, - AuthenticatedContextProps, - withAuthenticatedContext -} from '../authentication'; - -import { RestFormProps, FormButton, ErrorButton } from '../components'; -import { FACTORY_RESET_ENDPOINT, RESTART_ENDPOINT } from '../api'; - -import { SystemStatus, EspPlatform } from './types'; - -import VersionCheck from './VersionCheck'; - -interface SystemStatusFormState { - confirmRestart: boolean; - confirmFactoryReset: boolean; - processing: boolean; - currentVersion?: string; -} - -type SystemStatusFormProps = AuthenticatedContextProps & - RestFormProps; - -function formatNumber(num: number) { - return new Intl.NumberFormat().format(num); -} - -class SystemStatusForm extends Component< - SystemStatusFormProps, - SystemStatusFormState -> { - state: SystemStatusFormState = { - confirmRestart: false, - confirmFactoryReset: false, - processing: false - }; - - onVersionCheck = (version: string) => { - this.setState({ currentVersion: version }); - }; - - closeVersionCheck = () => { - this.setState({ - currentVersion: undefined - }); - }; - - createListItems() { - const { data } = this.props; - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {data.esp_platform === EspPlatform.ESP32 && data.psram_size > 0 && ( - - - - - - - - - - - - )} - - - - - - - - - - - - ); - } - - renderRestartDialog() { - return ( - - Confirm Restart - - Are you sure you want to restart the device? - - - - - - - ); - } - - onRestart = () => { - this.setState({ confirmRestart: true }); - }; - - onRestartRejected = () => { - this.setState({ confirmRestart: false }); - }; - - onRestartConfirmed = () => { - this.setState({ processing: true }); - redirectingAuthorizedFetch(RESTART_ENDPOINT, { method: 'POST' }) - .then((response) => { - if (response.status === 200) { - this.props.enqueueSnackbar('Device is restarting', { - variant: 'info' - }); - this.setState({ processing: false, confirmRestart: false }); - } else { - throw Error('Invalid status code: ' + response.status); - } - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem restarting device', - { variant: 'error' } - ); - this.setState({ processing: false, confirmRestart: false }); - }); - }; - - renderFactoryResetDialog() { - return ( - - Confirm Factory Reset - - Are you sure you want to reset the device to its factory defaults? - - - - } - variant="contained" - onClick={this.onFactoryResetConfirmed} - disabled={this.state.processing} - autoFocus - > - Factory Reset - - - - ); - } - - onFactoryReset = () => { - this.setState({ confirmFactoryReset: true }); - }; - - onFactoryResetRejected = () => { - this.setState({ confirmFactoryReset: false }); - }; - - onFactoryResetConfirmed = () => { - this.setState({ processing: true }); - redirectingAuthorizedFetch(FACTORY_RESET_ENDPOINT, { method: 'POST' }) - .then((response) => { - if (response.status === 200) { - this.props.enqueueSnackbar('Factory reset in progress.', { - variant: 'error' - }); - this.setState({ processing: false, confirmFactoryReset: false }); - } else { - throw Error('Invalid status code: ' + response.status); - } - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem factory resetting device', - { variant: 'error' } - ); - this.setState({ processing: false, confirmRestart: false }); - }); - }; - - render() { - const me = this.props.authenticatedContext.me; - const { currentVersion } = this.state; - return ( - - {this.createListItems()} - {currentVersion && ( - - )} - - - } - variant="contained" - color="secondary" - onClick={this.props.loadData} - > - Refresh - - - {me.admin && ( - - } - variant="contained" - color="primary" - onClick={this.onRestart} - > - Restart - - } - variant="contained" - onClick={this.onFactoryReset} - > - Factory reset - - - )} - - {this.renderRestartDialog()} - {this.renderFactoryResetDialog()} - - ); - } -} - -export default withAuthenticatedContext(SystemStatusForm); diff --git a/interface/src/system/UploadFirmwareController.tsx b/interface/src/system/UploadFirmwareController.tsx deleted file mode 100644 index 931ae9eaf..000000000 --- a/interface/src/system/UploadFirmwareController.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { Component } from 'react'; - -import { SectionContent } from '../components'; -import { UPLOAD_FIRMWARE_ENDPOINT } from '../api'; - -import UploadFirmwareForm from './UploadFirmwareForm'; -import { redirectingAuthorizedUpload } from '../authentication'; -import { withSnackbar, WithSnackbarProps } from 'notistack'; - -interface UploadFirmwareControllerState { - xhr?: XMLHttpRequest; - progress?: ProgressEvent; -} - -class UploadFirmwareController extends Component< - WithSnackbarProps, - UploadFirmwareControllerState -> { - state: UploadFirmwareControllerState = { - xhr: undefined, - progress: undefined - }; - - componentWillUnmount() { - this.state.xhr?.abort(); - } - - updateProgress = (progress: ProgressEvent) => { - this.setState({ progress }); - }; - - uploadFile = (file: File) => { - if (this.state.xhr) { - return; - } - const xhr = new XMLHttpRequest(); - this.setState({ xhr }); - redirectingAuthorizedUpload( - xhr, - UPLOAD_FIRMWARE_ENDPOINT, - file, - this.updateProgress - ) - .then(() => { - if (xhr.status !== 200) { - throw Error('Invalid status code: ' + xhr.status); - } - this.props.enqueueSnackbar('Activating new firmware', { - variant: 'success' - }); - this.setState({ xhr: undefined, progress: undefined }); - }) - .catch((error: Error) => { - if (error.name === 'AbortError') { - this.props.enqueueSnackbar('Upload cancelled by user', { - variant: 'warning' - }); - } else { - const errorMessage = - error.name === 'UploadError' - ? 'Error during upload' - : error.message || 'Unknown error'; - this.props.enqueueSnackbar('Problem uploading: ' + errorMessage, { - variant: 'error' - }); - this.setState({ xhr: undefined, progress: undefined }); - } - }); - }; - - cancelUpload = () => { - if (this.state.xhr) { - this.state.xhr.abort(); - this.setState({ xhr: undefined, progress: undefined }); - } - }; - - render() { - const { xhr, progress } = this.state; - return ( - - - - ); - } -} - -export default withSnackbar(UploadFirmwareController); diff --git a/interface/src/system/UploadFirmwareForm.tsx b/interface/src/system/UploadFirmwareForm.tsx deleted file mode 100644 index cb3e16073..000000000 --- a/interface/src/system/UploadFirmwareForm.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React, { Fragment } from 'react'; -import { SingleUpload } from '../components'; -import { Box } from '@material-ui/core'; - -interface UploadFirmwareFormProps { - uploading: boolean; - progress?: ProgressEvent; - onFileSelected: (file: File) => void; - onCancel: () => void; -} - -class UploadFirmwareForm extends React.Component { - handleDrop = (files: File[]) => { - const file = files[0]; - if (file) { - this.props.onFileSelected(files[0]); - } - }; - - render() { - const { uploading, progress, onCancel } = this.props; - return ( - - - Upload a new firmware file (.bin or .bin.gz) below to replace the - existing firmware. -

This can take up to a minute. Wait until you see "Activating - new firmware" and EMS-ESP will then automatically restart. -
- -
- ); - } -} - -export default UploadFirmwareForm; diff --git a/interface/src/system/VersionCheck.tsx b/interface/src/system/VersionCheck.tsx deleted file mode 100644 index 1e7504c62..000000000 --- a/interface/src/system/VersionCheck.tsx +++ /dev/null @@ -1,211 +0,0 @@ -import React, { Fragment } from 'react'; -import { - Dialog, - DialogTitle, - DialogContent, - DialogActions, - Box, - Link, - LinearProgress, - Typography -} from '@material-ui/core'; - -import { FormButton } from '../components'; -import { withSnackbar, WithSnackbarProps } from 'notistack'; - -export const VERSIONCHECK_ENDPOINT = - 'https://api.github.com/repos/emsesp/EMS-ESP32/releases/latest'; - -export const VERSIONCHECK_DEV_ENDPOINT = - 'https://api.github.com/repos/emsesp/EMS-ESP32/releases/tags/latest'; - -export const uploadURL = window.location.origin + '/system/upload'; - -interface VersionCheckProps extends WithSnackbarProps { - currentVersion: string; - onClose: () => void; -} - -interface VersionCheckState { - latestVersion?: string; - latestVersionUrl?: string; - latestVersionChangelog?: string; - latestDevVersion?: string; - latestDevVersionUrl?: string; - latestDevVersionChangelog?: string; -} - -class VersionCheck extends React.Component< - VersionCheckProps, - VersionCheckState -> { - state: VersionCheckState = {}; - - componentDidMount() { - fetch(VERSIONCHECK_ENDPOINT) - .then((response) => { - if (response.status === 200) { - return response.json(); - } else { - throw Error( - 'Unable to get version information. Check internet connection. (' + - response.status + - ')' - ); - } - }) - .then((data) => { - this.setState({ - latestVersion: data.name, - latestVersionUrl: data.assets[1].browser_download_url, - latestVersionChangelog: data.html_url - }); - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem getting response', - { variant: 'error' } - ); - this.setState({ latestVersion: undefined }); - this.props.onClose(); - }); - - fetch(VERSIONCHECK_DEV_ENDPOINT) - .then((response) => { - if (response.status === 200) { - return response.json(); - } else { - throw Error( - 'Unable to get version information. Check internet connection. (' + - response.status + - ')' - ); - } - }) - .then((data) => { - this.setState({ - latestDevVersion: data.name.split(/\s+/).splice(-1), - latestDevVersionUrl: data.assets[1].browser_download_url, - latestDevVersionChangelog: data.assets[0].browser_download_url - }); - }) - .catch((error) => { - this.props.enqueueSnackbar( - error.message || 'Problem getting response', - { variant: 'error' } - ); - this.setState({ latestDevVersion: undefined }); - this.props.onClose(); - }); - } - - render() { - const { onClose, currentVersion } = this.props; - const { - latestVersion, - latestVersionUrl, - latestDevVersion, - latestDevVersionUrl, - latestVersionChangelog, - latestDevVersionChangelog - } = this.state; - return ( - - - Firmware Update Check - - - {latestVersion ? ( - - - - You are currently running EMS-ESP version{' '} - v{currentVersion} - - - - The latest stable version is {latestVersion} -  ( - - {'release notes'} - - ) ( - - {'download'} - - ) - - - The latest development version is  - {latestDevVersion} -  ( - - {'release notes'} - - ) ( - - {'download'} - - ) - - - - - Use  - - {'UPLOAD FIRMWARE'} - -  to install any new firmware versions. - - - - - ) : ( - - - - Fetching version details… - - - )} - - - - Close - - - - ); - } -} - -export default withSnackbar(VersionCheck); diff --git a/interface/src/ap/types.ts b/interface/src/types/ap.ts similarity index 87% rename from interface/src/ap/types.ts rename to interface/src/types/ap.ts index 437d0e63c..f2d81cd6f 100644 --- a/interface/src/ap/types.ts +++ b/interface/src/types/ap.ts @@ -21,6 +21,9 @@ export interface APSettings { provision_mode: APProvisionMode; ssid: string; password: string; + channel: number; + ssid_hidden: boolean; + max_clients: number; local_ip: string; gateway_ip: string; subnet_mask: string; diff --git a/interface/src/features/types.ts b/interface/src/types/features.ts similarity index 100% rename from interface/src/features/types.ts rename to interface/src/types/features.ts diff --git a/interface/src/types/index.ts b/interface/src/types/index.ts new file mode 100644 index 000000000..632d8907b --- /dev/null +++ b/interface/src/types/index.ts @@ -0,0 +1,9 @@ +export * from './ap'; +export * from './features'; +export * from './me'; +export * from './mqtt'; +export * from './ntp'; +export * from './security'; +export * from './signin'; +export * from './system'; +export * from './network'; diff --git a/interface/src/types/me.ts b/interface/src/types/me.ts new file mode 100644 index 000000000..ff3fed73e --- /dev/null +++ b/interface/src/types/me.ts @@ -0,0 +1,4 @@ +export interface Me { + username: string; + admin: boolean; +} diff --git a/interface/src/mqtt/types.ts b/interface/src/types/mqtt.ts similarity index 94% rename from interface/src/mqtt/types.ts rename to interface/src/types/mqtt.ts index c439f75ec..a372f217f 100644 --- a/interface/src/mqtt/types.ts +++ b/interface/src/types/mqtt.ts @@ -37,7 +37,8 @@ export interface MqttSettings { mqtt_qos: number; mqtt_retain: boolean; ha_enabled: boolean; - ha_climate_format: number; nested_format: number; send_response: boolean; + publish_single: boolean; + discovery_prefix: string; } diff --git a/interface/src/network/types.ts b/interface/src/types/network.ts similarity index 96% rename from interface/src/network/types.ts rename to interface/src/types/network.ts index 538020903..cb12e57a0 100644 --- a/interface/src/network/types.ts +++ b/interface/src/types/network.ts @@ -12,8 +12,8 @@ export enum NetworkConnectionStatus { export enum WiFiEncryptionType { WIFI_AUTH_OPEN = 0, WIFI_AUTH_WEP = 1, - WIFI_AUTH_WPA_PSK = 2, - WIFI_AUTH_WPA2_PSK = 3, + WIFI_AUTH_WEP_PSK = 2, + WIFI_AUTH_WEP2_PSK = 3, WIFI_AUTH_WPA_WPA2_PSK = 4, WIFI_AUTH_WPA2_ENTERPRISE = 5 } diff --git a/interface/src/ntp/types.ts b/interface/src/types/ntp.ts similarity index 100% rename from interface/src/ntp/types.ts rename to interface/src/types/ntp.ts diff --git a/interface/src/security/types.ts b/interface/src/types/security.ts similarity index 84% rename from interface/src/security/types.ts rename to interface/src/types/security.ts index 87fb64418..90db06a1e 100644 --- a/interface/src/security/types.ts +++ b/interface/src/types/security.ts @@ -9,6 +9,6 @@ export interface SecuritySettings { jwt_secret: string; } -export interface GeneratedToken { +export interface Token { token: string; } diff --git a/interface/src/types/signin.ts b/interface/src/types/signin.ts new file mode 100644 index 000000000..3c81dd7cc --- /dev/null +++ b/interface/src/types/signin.ts @@ -0,0 +1,8 @@ +export interface SignInRequest { + username: string; + password: string; +} + +export interface SignInResponse { + access_token: string; +} diff --git a/interface/src/system/types.ts b/interface/src/types/system.ts similarity index 83% rename from interface/src/system/types.ts rename to interface/src/types/system.ts index e0301c756..69fdef6c4 100644 --- a/interface/src/system/types.ts +++ b/interface/src/types/system.ts @@ -47,7 +47,7 @@ export enum LogLevel { ALL = 9 } -export interface LogEvent { +export interface LogEntry { t: string; l: LogLevel; i: number; @@ -55,8 +55,18 @@ export interface LogEvent { m: string; } -export interface LogSettings { - level: LogLevel; - max_messages: number; - compact: boolean; +export interface LogEntries { + events: LogEntry[]; +} + +export interface LogSettings { + level: number; + max_messages: number; + compact: false; +} + +export interface Version { + version: string; + url: string; + changelog: string; } diff --git a/interface/src/utils/binding.ts b/interface/src/utils/binding.ts index dac942044..2fcb67235 100644 --- a/interface/src/utils/binding.ts +++ b/interface/src/utils/binding.ts @@ -1,8 +1,8 @@ type UpdateEntity = (state: (prevState: Readonly) => S) => void; -export const extractEventValue = ( - event: React.ChangeEvent -) => { +export const numberValue = (value: number) => (isNaN(value) ? '' : value.toString()); + +export const extractEventValue = (event: React.ChangeEvent) => { switch (event.target.type) { case 'number': return event.target.valueAsNumber; @@ -13,21 +13,11 @@ export const extractEventValue = ( } }; -export const updateValue = (updateEntity: UpdateEntity) => ( - event: React.ChangeEvent -) => { - updateEntity((prevState) => ({ - ...prevState, - [event.target.name]: extractEventValue(event) - })); -}; - -export const updateBooleanValue = (updateEntity: UpdateEntity) => ( - name: string, - value?: boolean -) => { - updateEntity((prevState) => ({ - ...prevState, - [name]: value - })); -}; +export const updateValue = + (updateEntity: UpdateEntity) => + (event: React.ChangeEvent) => { + updateEntity((prevState) => ({ + ...prevState, + [event.target.name]: extractEventValue(event) + })); + }; diff --git a/interface/src/utils/endpoints.ts b/interface/src/utils/endpoints.ts new file mode 100644 index 000000000..86265b0a5 --- /dev/null +++ b/interface/src/utils/endpoints.ts @@ -0,0 +1,4 @@ +import { AxiosError } from 'axios'; + +export const extractErrorMessage = (error: AxiosError, defaultMessage: string) => + (error.response && error.response.data ? error.response.data.message : error.message) || defaultMessage; diff --git a/interface/src/utils/index.ts b/interface/src/utils/index.ts index 1ad877297..c1fb87d8f 100644 --- a/interface/src/utils/index.ts +++ b/interface/src/utils/index.ts @@ -1 +1,6 @@ export * from './binding'; +export * from './endpoints'; +export * from './route'; +export * from './submit'; +export * from './time'; +export * from './useRest'; diff --git a/interface/src/utils/route.ts b/interface/src/utils/route.ts new file mode 100644 index 000000000..21773adfb --- /dev/null +++ b/interface/src/utils/route.ts @@ -0,0 +1 @@ +export const routeMatches = (route: string, pathname: string) => pathname.startsWith(route + '/') || pathname === route; diff --git a/interface/src/utils/submit.ts b/interface/src/utils/submit.ts new file mode 100644 index 000000000..ed808fde4 --- /dev/null +++ b/interface/src/utils/submit.ts @@ -0,0 +1,8 @@ +export const onEnterCallback = + (callback: () => void): ((event: React.KeyboardEvent) => void) => + (event: React.KeyboardEvent) => { + if (event.key === 'Enter') { + callback(); + event.preventDefault(); + } + }; diff --git a/interface/src/ntp/TimeFormat.ts b/interface/src/utils/time.ts similarity index 87% rename from interface/src/ntp/TimeFormat.ts rename to interface/src/utils/time.ts index 273c5df14..ba4a841df 100644 --- a/interface/src/ntp/TimeFormat.ts +++ b/interface/src/utils/time.ts @@ -15,15 +15,12 @@ export const formatDateTime = (dateTime: string) => { }; export const formatLocalDateTime = (date: Date) => { - return new Date(date.getTime() - date.getTimezoneOffset() * 60000) - .toISOString() - .slice(0, -1) - .substr(0, 19); + return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, -1).substr(0, 19); }; export const formatDuration = (duration: number) => { const { days, hours, minutes, seconds } = parseMilliseconds(duration * 1000); - let formatted = ''; + var formatted = ''; if (days) { formatted += pluralize(days, 'day'); } @@ -39,5 +36,5 @@ export const formatDuration = (duration: number) => { return formatted; }; -const pluralize = (count: number, noun: string, suffix = 's') => +const pluralize = (count: number, noun: string, suffix: string = 's') => ` ${count} ${noun}${count !== 1 ? suffix : ''} `; diff --git a/interface/src/utils/useRest.ts b/interface/src/utils/useRest.ts new file mode 100644 index 000000000..ca948d0ec --- /dev/null +++ b/interface/src/utils/useRest.ts @@ -0,0 +1,66 @@ +import { useCallback, useEffect, useState } from 'react'; +import { useSnackbar } from 'notistack'; +import { AxiosPromise } from 'axios'; + +import { extractErrorMessage } from '.'; + +export interface RestRequestOptions { + read: () => AxiosPromise; + update?: (value: D) => AxiosPromise; +} + +export const useRest = ({ read, update }: RestRequestOptions) => { + const { enqueueSnackbar } = useSnackbar(); + + const [saving, setSaving] = useState(false); + const [data, setData] = useState(); + const [errorMessage, setErrorMessage] = useState(); + const [restartNeeded, setRestartNeeded] = useState(false); + + const loadData = useCallback(async () => { + setData(undefined); + setErrorMessage(undefined); + try { + setData((await read()).data); + } catch (error: any) { + const message = extractErrorMessage(error, 'Problem loading data'); + enqueueSnackbar(message, { variant: 'error' }); + setErrorMessage(message); + } + }, [read, enqueueSnackbar]); + + const save = useCallback( + async (toSave: D) => { + if (!update) { + return; + } + setSaving(true); + setRestartNeeded(false); + setErrorMessage(undefined); + try { + const response = await update(toSave); + setData(response.data); + if (response.status === 202) { + setRestartNeeded(true); + } else { + enqueueSnackbar('Settings saved', { variant: 'success' }); + } + } catch (error: any) { + const message = extractErrorMessage(error, 'Problem saving data'); + enqueueSnackbar(message, { variant: 'error' }); + setErrorMessage(message); + } finally { + setSaving(false); + } + }, + [update, enqueueSnackbar] + ); + + const saveData = () => data && save(data); + + useEffect(() => { + loadData(); + }, [loadData]); + + return { loadData, saveData, saving, setData, data, errorMessage, restartNeeded } as const; +}; diff --git a/interface/src/utils/useWs.ts b/interface/src/utils/useWs.ts new file mode 100644 index 000000000..6a10fc2a4 --- /dev/null +++ b/interface/src/utils/useWs.ts @@ -0,0 +1,94 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; +import Sockette from 'sockette'; +import { debounce } from 'lodash'; + +import { addAccessTokenParameter } from '../api/authentication'; + +interface WebSocketIdMessage { + type: 'id'; + id: string; +} + +interface WebSocketPayloadMessage { + type: 'payload'; + origin_id: string; + payload: D; +} + +export type WebSocketMessage = WebSocketIdMessage | WebSocketPayloadMessage; + +export const useWs = (wsUrl: string, wsThrottle: number = 100) => { + const ws = useRef(); + const clientId = useRef(); + + const [connected, setConnected] = useState(false); + const [data, setData] = useState(); + const [transmit, setTransmit] = useState(); + const [clear, setClear] = useState(); + + const onMessage = useCallback((event: MessageEvent) => { + const rawData = event.data; + if (typeof rawData === 'string' || rawData instanceof String) { + const message = JSON.parse(rawData as string) as WebSocketMessage; + switch (message.type) { + case 'id': + clientId.current = message.id; + break; + case 'payload': + if (clientId.current) { + setData((existingData) => (clientId.current === message.origin_id && existingData) || message.payload); + } + break; + } + } + }, []); + + const doSaveData = useCallback((newData: D, clearData: boolean = false) => { + if (!ws.current) { + return; + } + if (clearData) { + setData(undefined); + } + ws.current.json(newData); + }, []); + + const saveData = useRef(debounce(doSaveData, wsThrottle)); + + const updateData = ( + newData: React.SetStateAction, + transmitData: boolean = true, + clearData: boolean = false + ) => { + setData(newData); + setTransmit(transmitData); + setClear(clearData); + }; + + useEffect(() => { + if (!transmit) { + return; + } + data && saveData.current(data, clear); + setTransmit(false); + setClear(false); + }, [doSaveData, data, transmit, clear]); + + useEffect(() => { + const instance = new Sockette(addAccessTokenParameter(wsUrl), { + onmessage: onMessage, + onopen: () => { + setConnected(true); + }, + onclose: () => { + clientId.current = undefined; + setConnected(false); + setData(undefined); + } + }); + ws.current = instance; + return instance.close; + }, [wsUrl, onMessage]); + + return { connected, data, updateData } as const; +}; diff --git a/interface/src/validators/ap.ts b/interface/src/validators/ap.ts new file mode 100644 index 000000000..36a394f05 --- /dev/null +++ b/interface/src/validators/ap.ts @@ -0,0 +1,30 @@ +import Schema from 'async-validator'; +import { isAPEnabled } from '../framework/ap/APSettingsForm'; +import { APSettings } from '../types'; +import { IP_ADDRESS_VALIDATOR } from './shared'; + +export const createAPSettingsValidator = (apSettings: APSettings) => + new Schema({ + provision_mode: { required: true, message: 'Please provide a provision mode' }, + ...(isAPEnabled(apSettings) && { + ssid: [ + { required: true, message: 'Please provide an SSID' }, + { type: 'string', max: 32, message: 'SSID must be 32 characters or less' } + ], + password: [ + { required: true, message: 'Please provide an access point password' }, + { type: 'string', min: 8, max: 64, message: 'Password must be 8-64 characters' } + ], + channel: [ + { required: true, message: 'Please provide a network channel' }, + { type: 'number', message: 'Channel must be between 1 and 14' } + ], + max_clients: [ + { required: true, message: 'Please specify a value for max clients' }, + { type: 'number', min: 1, max: 9, message: 'Max clients must be between 1 and 9' } + ], + local_ip: [{ required: true, message: 'Local IP address is required' }, IP_ADDRESS_VALIDATOR], + gateway_ip: [{ required: true, message: 'Gateway IP address is required' }, IP_ADDRESS_VALIDATOR], + subnet_mask: [{ required: true, message: 'Subnet mask is required' }, IP_ADDRESS_VALIDATOR] + }) + }); diff --git a/interface/src/validators/authentication.ts b/interface/src/validators/authentication.ts new file mode 100644 index 000000000..ebf42fb68 --- /dev/null +++ b/interface/src/validators/authentication.ts @@ -0,0 +1,12 @@ +import Schema from 'async-validator'; + +export const SIGN_IN_REQUEST_VALIDATOR = new Schema({ + username: { + required: true, + message: 'Please provide a username' + }, + password: { + required: true, + message: 'Please provide a password' + } +}); diff --git a/interface/src/validators/index.ts b/interface/src/validators/index.ts index 24224ffd2..c7c2a695a 100644 --- a/interface/src/validators/index.ts +++ b/interface/src/validators/index.ts @@ -1,6 +1,8 @@ -export { default as isHostname } from './isHostname'; -export { default as isIP } from './isIP'; -export { default as optional } from './optional'; -export { default as or } from './or'; -export { default as isPath } from './isPath'; -export { default as isIPv4 } from './isIPv4'; +export * from './ap'; +export * from './authentication'; +export * from './mqtt'; +export * from './ntp'; +export * from './security'; +export * from './shared'; +export * from './system'; +export * from './network'; diff --git a/interface/src/validators/isHostname.ts b/interface/src/validators/isHostname.ts deleted file mode 100644 index 04d4687c8..000000000 --- a/interface/src/validators/isHostname.ts +++ /dev/null @@ -1,8 +0,0 @@ -const hostnameLengthRegex = /^.{0,48}$/; -const hostnamePatternRegex = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/; - -export default function isHostname(hostname: string) { - return ( - hostnameLengthRegex.test(hostname) && hostnamePatternRegex.test(hostname) - ); -} diff --git a/interface/src/validators/isIP.ts b/interface/src/validators/isIP.ts deleted file mode 100644 index 36ffee158..000000000 --- a/interface/src/validators/isIP.ts +++ /dev/null @@ -1,5 +0,0 @@ -const ipAddressRegexp = /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/; - -export default function isIp(ipAddress: string) { - return ipAddressRegexp.test(ipAddress); -} diff --git a/interface/src/validators/isIPv4.ts b/interface/src/validators/isIPv4.ts deleted file mode 100644 index 160bda7c5..000000000 --- a/interface/src/validators/isIPv4.ts +++ /dev/null @@ -1,5 +0,0 @@ -const ipv4AddressRegexp = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; - -export default function isIpv4(ipAddress: string) { - return ipv4AddressRegexp.test(ipAddress); -} diff --git a/interface/src/validators/isPath.ts b/interface/src/validators/isPath.ts deleted file mode 100644 index d7945109c..000000000 --- a/interface/src/validators/isPath.ts +++ /dev/null @@ -1,6 +0,0 @@ -const pathLengthRegex = /^[^.]{0,108}$/; -const pathPatternRegex = /^([a-zA-Z0-9_][a-zA-Z0-9/_-]*[a-zA-Z0-9_])$/; - -export default function isPath(path: string) { - return pathLengthRegex.test(path) && pathPatternRegex.test(path); -} diff --git a/interface/src/validators/mqtt.ts b/interface/src/validators/mqtt.ts new file mode 100644 index 000000000..b26619e82 --- /dev/null +++ b/interface/src/validators/mqtt.ts @@ -0,0 +1,18 @@ +import Schema from 'async-validator'; +import { IP_OR_HOSTNAME_VALIDATOR } from './shared'; + +export const MQTT_SETTINGS_VALIDATOR = new Schema({ + host: [{ required: true, message: 'Host is required' }, IP_OR_HOSTNAME_VALIDATOR], + port: [ + { required: true, message: 'Port is required' }, + { type: 'number', min: 0, max: 65535, message: 'Port must be between 0 and 65535' } + ], + keep_alive: [ + { required: true, message: 'Keep alive is required' }, + { type: 'number', min: 1, max: 86400, message: 'Keep alive must be between 1 and 86400' } + ], + max_topic_length: [ + { required: true, message: 'Max topic length is required' }, + { type: 'number', min: 16, max: 1024, message: 'Max topic length must be between 16 and 1024' } + ] +}); diff --git a/interface/src/validators/network.ts b/interface/src/validators/network.ts new file mode 100644 index 000000000..e52a64acd --- /dev/null +++ b/interface/src/validators/network.ts @@ -0,0 +1,21 @@ +import Schema from 'async-validator'; +import { NetworkSettings } from '../types'; +import { HOSTNAME_VALIDATOR, IP_ADDRESS_VALIDATOR } from './shared'; + +export const createNetworkSettingsValidator = (networkSettings: NetworkSettings) => + new Schema({ + ssid: [{ type: 'string', max: 32, message: 'SSID must be 32 characters or less' }], + password: { type: 'string', max: 64, message: 'Password must be 64 characters or less' }, + hostname: [{ required: true, message: 'Hostname is required' }, HOSTNAME_VALIDATOR], + ...(networkSettings.static_ip_config && { + local_ip: [{ required: true, message: 'Local IP is required' }, IP_ADDRESS_VALIDATOR], + gateway_ip: [{ required: true, message: 'Gateway IP is required' }, IP_ADDRESS_VALIDATOR], + subnet_mask: [{ required: true, message: 'Subnet mask is required' }, IP_ADDRESS_VALIDATOR], + dns_ip_1: IP_ADDRESS_VALIDATOR, + dns_ip_2: IP_ADDRESS_VALIDATOR + }), + tx_power: [ + { required: true, message: 'Tx Power is required' }, + { type: 'number', min: 0, max: 20, message: 'Tx Power must be between 0 and 20dBm' } + ] + }); diff --git a/interface/src/validators/ntp.ts b/interface/src/validators/ntp.ts new file mode 100644 index 000000000..9600c7161 --- /dev/null +++ b/interface/src/validators/ntp.ts @@ -0,0 +1,10 @@ +import Schema from 'async-validator'; +import { IP_OR_HOSTNAME_VALIDATOR } from './shared'; + +export const NTP_SETTINGS_VALIDATOR = new Schema({ + server: [{ required: true, message: 'Server is required' }, IP_OR_HOSTNAME_VALIDATOR], + tz_label: { + required: true, + message: 'Time zone is required' + } +}); diff --git a/interface/src/validators/optional.ts b/interface/src/validators/optional.ts deleted file mode 100644 index ec241419b..000000000 --- a/interface/src/validators/optional.ts +++ /dev/null @@ -1,4 +0,0 @@ -const OPTIONAL = (validator: (value: any) => boolean) => (value: any) => - !value || validator(value); - -export default OPTIONAL; diff --git a/interface/src/validators/or.ts b/interface/src/validators/or.ts deleted file mode 100644 index eb189e65b..000000000 --- a/interface/src/validators/or.ts +++ /dev/null @@ -1,8 +0,0 @@ -const OR = ( - validator1: (value: any) => boolean, - validator2: (value: any) => boolean -) => { - return (value: any) => validator1(value) || validator2(value); -}; - -export default OR; diff --git a/interface/src/validators/security.ts b/interface/src/validators/security.ts new file mode 100644 index 000000000..9211f78b1 --- /dev/null +++ b/interface/src/validators/security.ts @@ -0,0 +1,36 @@ +import Schema, { InternalRuleItem } from 'async-validator'; +import { User } from '../types'; + +export const SECURITY_SETTINGS_VALIDATOR = new Schema({ + jwt_secret: [ + { required: true, message: 'JWT secret is required' }, + { type: 'string', min: 1, max: 64, message: 'JWT secret must be between 1 and 64 characters' } + ] +}); + +export const createUserValidator = (users: User[], creating: boolean) => + new Schema({ + username: [ + { required: true, message: 'Username is required' }, + { + type: 'string', + pattern: /^[a-zA-Z0-9_\\.]{1,24}$/, + message: "Must be 1-24 characters: alpha numeric, '_' or '.'" + }, + ...(creating ? [createUniqueUsernameValidator(users)] : []) + ], + password: [ + { required: true, message: 'Please provide a password' }, + { type: 'string', min: 1, max: 64, message: 'Password must be 1-64 characters' } + ] + }); + +export const createUniqueUsernameValidator = (users: User[]) => ({ + validator(rule: InternalRuleItem, username: string, callback: (error?: string) => void) { + if (username && users.find((u) => u.username === username)) { + callback('Username already in use'); + } else { + callback(); + } + } +}); diff --git a/interface/src/validators/shared.ts b/interface/src/validators/shared.ts new file mode 100644 index 000000000..9f0c42e5c --- /dev/null +++ b/interface/src/validators/shared.ts @@ -0,0 +1,60 @@ +import Schema, { InternalRuleItem, ValidateOption } from 'async-validator'; + +export const validate = ( + validator: Schema, + source: Partial, + options?: ValidateOption +): Promise => { + return new Promise((resolve, reject) => { + validator.validate(source, options ? options : {}, (errors, fieldErrors) => { + if (errors) { + reject(fieldErrors); + } else { + resolve(source as T); + } + }); + }); +}; + +// updated to support both IPv4 and IPv6 +const IP_ADDRESS_REGEXP = + // eslint-disable-next-line max-len + /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/; + +const isValidIpAddress = (value: string) => IP_ADDRESS_REGEXP.test(value); + +export const IP_ADDRESS_VALIDATOR = { + validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) { + if (value && !isValidIpAddress(value)) { + callback('Must be an IP address'); + } else { + callback(); + } + } +}; + +const HOSTNAME_LENGTH_REGEXP = /^.{0,63}$/; +const HOSTNAME_PATTERN_REGEXP = + /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/; + +const isValidHostname = (value: string) => HOSTNAME_LENGTH_REGEXP.test(value) && HOSTNAME_PATTERN_REGEXP.test(value); + +export const HOSTNAME_VALIDATOR = { + validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) { + if (value && !isValidHostname(value)) { + callback('Must be a valid hostname of up to 63 characters'); + } else { + callback(); + } + } +}; + +export const IP_OR_HOSTNAME_VALIDATOR = { + validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) { + if (value && !(isValidIpAddress(value) || isValidHostname(value))) { + callback('Must be a valid IP address or hostname of up to 63 characters'); + } else { + callback(); + } + } +}; diff --git a/interface/src/validators/system.ts b/interface/src/validators/system.ts new file mode 100644 index 000000000..6bf3bc8fe --- /dev/null +++ b/interface/src/validators/system.ts @@ -0,0 +1,12 @@ +import Schema from 'async-validator'; + +export const OTA_SETTINGS_VALIDATOR = new Schema({ + port: [ + { required: true, message: 'Port is required' }, + { type: 'number', min: 1025, max: 65535, message: 'Port must be between 1025 and 65535' } + ], + password: [ + { required: true, message: 'Password is required' }, + { type: 'string', min: 1, max: 64, message: 'Password must be between 1 and 64 characters' } + ] +}); diff --git a/interface/tsconfig.json b/interface/tsconfig.json index cc47c36d4..9d379a3c4 100644 --- a/interface/tsconfig.json +++ b/interface/tsconfig.json @@ -8,13 +8,13 @@ "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx", - "noFallthroughCasesInSwitch": true + "jsx": "react-jsx" }, "include": ["src"] } diff --git a/lib/ArduinoJson/ArduinoJson.h b/lib/ArduinoJson/ArduinoJson.h index ba79dc8e3..7e3afa58a 100644 --- a/lib/ArduinoJson/ArduinoJson.h +++ b/lib/ArduinoJson/ArduinoJson.h @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #include "src/ArduinoJson.h" diff --git a/lib/ArduinoJson/CHANGELOG.md b/lib/ArduinoJson/CHANGELOG.md index f368129f0..47dff0bf0 100644 --- a/lib/ArduinoJson/CHANGELOG.md +++ b/lib/ArduinoJson/CHANGELOG.md @@ -1,6 +1,40 @@ ArduinoJson: change log ======================= +v6.19.1 (2022-01-14) +------- + +* Fix crash when adding an object member in a too small `JsonDocument` +* Fix filter not working in zero-copy mode (issue #1697) + +v6.19.0 (2022-01-08) +------- + +* Remove `ARDUINOJSON_EMBEDDED_MODE` and assume we run on an embedded platform. + Dependent settings (like `ARDUINOJSON_DEFAULT_NESTING_LIMIT`) must be set individually. +* Change the default of `ARDUINOJSON_USE_DOUBLE` to `1` +* Change the default of `ARDUINOJSON_USE_LONG_LONG` to `1` on 32-bit platforms +* Add `as()` and `is()` +* Add safe bool idiom in `JsonString` +* Add support for NUL in string values (issue #1646) +* Add support for arbitrary array rank in `copyArray()` +* Add support for `char[][]` in `copyArray()` +* Remove `DeserializationError == bool` and `DeserializationError != bool` +* Renamed undocumented function `isUndefined()` to `isUnbound()` +* Fix `JsonVariant::memoryUsage()` for raw strings +* Fix `call of overloaded 'swap(BasicJsonDocument&, BasicJsonDocument&)' is ambiguous` (issue #1678) +* Fix inconsistent pool capacity between `BasicJsonDocument`'s copy and move constructors +* Fix inconsistent pool capacity between `BasicJsonDocument`'s copy and move assignments +* Fix return type of `StaticJsonDocument::operator=` +* Avoid pool reallocation in `BasicJsonDocument`'s copy assignment if capacity is the same +* Avoid including `Arduino.h` when all its features are disabled (issue #1692, PR #1693 by @paulocsanz) +* Assume `PROGMEM` is available as soon as `ARDUINO` is defined (consequence of #1693) + +v6.18.5 (2021-09-28) +------- + +* Set `ARDUINOJSON_EMBEDDED_MODE` to `1` on Nios II (issue #1657) + v6.18.4 (2021-09-06) ------- @@ -726,423 +760,3 @@ v6.0.0-beta (2018-06-07) > obj["key"] = "value"; > serializeJson(doc, Serial); > ``` - -v5.13.2 -------- - -* Fixed `JsonBuffer::parse()` not respecting nesting limit correctly (issue #693) -* Fixed inconsistencies in nesting level counting (PR #695 from Zhenyu Wu) -* Fixed null values that could be pass to `strcmp()` (PR #745 from Mike Karlesky) -* Added macros `ARDUINOJSON_VERSION`, `ARDUINOJSON_VERSION_MAJOR`... - -v5.13.1 -------- - -* Fixed `JsonVariant::operator|(int)` that returned the default value if the variant contained a double (issue #675) -* Allowed non-quoted key to contain underscores (issue #665) - -v5.13.0 -------- - -* Changed the rules of string duplication (issue #658) -* `RawJson()` accepts any kind of string and obeys to the same rules for duplication -* Changed the return type of `strdup()` to `const char*` to prevent double duplication -* Marked `strdup()` as deprecated - -> ### New rules for string duplication -> -> | type | duplication | -> |:---------------------------|:------------| -> | const char* | no | -> | char* | ~~no~~ yes | -> | String | yes | -> | std::string | yes | -> | const __FlashStringHelper* | yes | -> -> These new rules make `JsonBuffer::strdup()` useless. - -v5.12.0 -------- - -* Added `JsonVariant::operator|` to return a default value (see below) -* Added a clear error message when compiled as C instead of C++ (issue #629) -* Added detection of MPLAB XC compiler (issue #629) -* Added detection of Keil ARM Compiler (issue #629) -* Added an example that shows how to save and load a configuration file -* Reworked all other examples - -> ### How to use the new feature? -> -> If you have a block like this: -> -> ```c++ -> const char* ssid = root["ssid"]; -> if (!ssid) -> ssid = "default ssid"; -> ``` -> -> You can simplify like that: -> -> ```c++ -> const char* ssid = root["ssid"] | "default ssid"; -> ``` - -v5.11.2 -------- - -* Fixed `DynamicJsonBuffer::clear()` not resetting allocation size (issue #561) -* Fixed incorrect rounding for float values (issue #588) - -v5.11.1 -------- - -* Removed dependency on `PGM_P` as Particle 0.6.2 doesn't define it (issue #546) -* Fixed warning "dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]" -* Fixed warning "floating constant exceeds range of 'float' [-Woverflow]" (issue #544) -* Fixed warning "this statement may fall through" [-Wimplicit-fallthrough=] (issue #539) -* Removed `ARDUINOJSON_DOUBLE_IS_64BITS` as it became useless. -* Fixed too many decimals places in float serialization (issue #543) - -v5.11.0 -------- - -* Made `JsonBuffer` non-copyable (PR #524 by @luisrayas3) -* Added `StaticJsonBuffer::clear()` -* Added `DynamicJsonBuffer::clear()` - -v5.10.1 -------- - -* Fixed IntelliSense errors in Visual Micro (issue #483) -* Fixed compilation in IAR Embedded Workbench (issue #515) -* Fixed reading "true" as a float (issue #516) -* Added `ARDUINOJSON_DOUBLE_IS_64BITS` -* Added `ARDUINOJSON_EMBEDDED_MODE` - -v5.10.0 -------- - -* Removed configurable number of decimal places (issues #288, #427 and #506) -* Changed exponentiation thresholds to `1e7` and `1e-5` (issues #288, #427 and #506) -* `JsonVariant::is()` now returns `true` for integers -* Fixed error `IsBaseOf is not a member of ArduinoJson::TypeTraits` (issue #495) -* Fixed error `forming reference to reference` (issue #495) - -> ### BREAKING CHANGES :warning: -> -> | Old syntax | New syntax | -> |:--------------------------------|:--------------------| -> | `double_with_n_digits(3.14, 2)` | `3.14` | -> | `float_with_n_digits(3.14, 2)` | `3.14f` | -> | `obj.set("key", 3.14, 2)` | `obj["key"] = 3.14` | -> | `arr.add(3.14, 2)` | `arr.add(3.14)` | -> -> | Input | Old output | New output | -> |:----------|:-----------|:-----------| -> | `3.14159` | `3.14` | `3.14159` | -> | `42.0` | `42.00` | `42` | -> | `0.0` | `0.00` | `0` | -> -> | Expression | Old result | New result | -> |:-------------------------------|:-----------|:-----------| -> | `JsonVariant(42).is()` | `true` | `true` | -> | `JsonVariant(42).is()` | `false` | `true` | -> | `JsonVariant(42).is()` | `false` | `true` | - -v5.9.0 ------- - -* Added `JsonArray::remove(iterator)` (issue #479) -* Added `JsonObject::remove(iterator)` -* Renamed `JsonArray::removeAt(size_t)` into `remove(size_t)` -* Renamed folder `include/` to `src/` -* Fixed warnings `floating constant exceeds range of float`and `floating constant truncated to zero` (issue #483) -* Removed `Print` class and converted `printTo()` to a template method (issue #276) -* Removed example `IndentedPrintExample.ino` -* Now compatible with Particle 0.6.1, thanks to Jacob Nite (issue #294 and PR #461 by @foodbag) - -v5.8.4 ------- - -* Added custom implementation of `strtod()` (issue #453) -* Added custom implementation of `strtol()` (issue #465) -* `char` is now treated as an integral type (issue #337, #370) - -v5.8.3 ------- - -* Fixed an access violation in `DynamicJsonBuffer` when memory allocation fails (issue #433) -* Added operators `==` and `!=` for two `JsonVariant`s (issue #436) -* Fixed `JsonVariant::operator[const FlashStringHelper*]` (issue #441) - -v5.8.2 ------- - -* Fixed parsing of comments (issue #421) -* Fixed ignored `Stream` timeout (issue #422) -* Made sure we don't read more that necessary (issue #422) -* Fixed error when the key of a `JsonObject` is a `char[]` (issue #423) -* Reduced code size when using `const` references -* Fixed error with string of type `unsigned char*` (issue #428) -* Added `deprecated` attribute on `asArray()`, `asObject()` and `asString()` (issue #420) - -v5.8.1 ------- - -* Fixed error when assigning a `volatile int` to a `JsonVariant` (issue #415) -* Fixed errors with Variable Length Arrays (issue #416) -* Fixed error when both `ARDUINOJSON_ENABLE_STD_STREAM` and `ARDUINOJSON_ENABLE_ARDUINO_STREAM` are set to `1` -* Fixed error "Stream does not name a type" (issue #412) - -v5.8.0 ------- - -* Added operator `==` to compare `JsonVariant` and strings (issue #402) -* Added support for `Stream` (issue #300) -* Reduced memory consumption by not duplicating spaces and comments - -> ### BREAKING CHANGES :warning: -> -> `JsonBuffer::parseObject()` and `JsonBuffer::parseArray()` have been pulled down to the derived classes `DynamicJsonBuffer` and `StaticJsonBufferBase`. -> -> This means that if you have code like: -> -> ```c++ -> void myFunction(JsonBuffer& jsonBuffer); -> ``` -> -> you need to replace it with one of the following: -> -> ```c++ -> void myFunction(DynamicJsonBuffer& jsonBuffer); -> void myFunction(StaticJsonBufferBase& jsonBuffer); -> template void myFunction(TJsonBuffer& jsonBuffer); -> ``` - -v5.7.3 ------- - -* Added an `printTo(char[N])` and `prettyPrintTo(char[N])` (issue #292) -* Added ability to set a nested value like this: `root["A"]["B"] = "C"` (issue #352) -* Renamed `*.ipp` to `*Impl.hpp` because they were ignored by Arduino IDE (issue #396) - -v5.7.2 ------- - -* Made PROGMEM available on more platforms (issue #381) -* Fixed PROGMEM causing an exception on ESP8266 (issue #383) - -v5.7.1 ------- - -* Added support for PROGMEM (issue #76) -* Fixed compilation error when index is not an `int` (issue #381) - -v5.7.0 ------- - -* Templatized all functions using `String` or `std::string` -* Removed `ArduinoJson::String` -* Removed `JsonVariant::defaultValue()` -* Removed non-template `JsonObject::get()` and `JsonArray.get()` -* Fixed support for `StringSumHelper` (issue #184) -* Replaced `ARDUINOJSON_USE_ARDUINO_STRING` by `ARDUINOJSON_ENABLE_STD_STRING` and `ARDUINOJSON_ENABLE_ARDUINO_STRING` (issue #378) -* Added example `StringExample.ino` to show where `String` can be used -* Increased default nesting limit to 50 when compiled for a computer (issue #349) - -> ### BREAKING CHANGES :warning: -> -> The non-template functions `JsonObject::get()` and `JsonArray.get()` have been removed. This means that you need to explicitely tell the type you expect in return. -> -> Old code: -> -> ```c++ -> #define ARDUINOJSON_USE_ARDUINO_STRING 0 -> JsonVariant value1 = myObject.get("myKey"); -> JsonVariant value2 = myArray.get(0); -> ``` -> -> New code: -> -> ```c++ -> #define ARDUINOJSON_ENABLE_ARDUINO_STRING 0 -> #define ARDUINOJSON_ENABLE_STD_STRING 1 -> JsonVariant value1 = myObject.get("myKey"); -> JsonVariant value2 = myArray.get(0); -> ``` - -v5.6.7 ------- - -* Fixed `array[idx].as()` and `object[key].as()` -* Fixed return value of `JsonObject::set()` (issue #350) -* Fixed undefined behavior in `Prettyfier` and `Print` (issue #354) -* Fixed parser that incorrectly rejected floats containing a `+` (issue #349) - -v5.6.6 ------- - -* Fixed `-Wparentheses` warning introduced in v5.6.5 (PR #335 by @nuket) -* Added `.mbedignore` for ARM mbdeb (PR #334 by @nuket) -* Fixed `JsonVariant::success()` which didn't propagate `JsonArray::success()` nor `JsonObject::success()` (issue #342). - -v5.6.5 ------- - -* `as()` now returns `true` when input is `null` (issue #330) - -v5.6.4 ------- - -* Fixed error in float serialization (issue #324) - -v5.6.3 ------- - -* Improved speed of float serialization (about twice faster) -* Added `as()` as a synonym for `as()`... (issue #291) -* Fixed `call of overloaded isinf(double&) is ambiguous` (issue #284) - -v5.6.2 ------- - -* Fixed build when another lib does `#undef isnan` (issue #284) - -v5.6.1 ------- - -* Added missing `#pragma once` (issue #310) - -v5.6.0 ------- - -* ArduinoJson is now a header-only library (issue #199) - -v5.5.1 ------- - -* Fixed compilation error with Intel Galileo (issue #299) - -v5.5.0 ------- - -* Added `JsonVariant::success()` (issue #279) -* Renamed `JsonVariant::invalid()` to `JsonVariant::defaultValue()` - -v5.4.0 ------- - -* Changed `::String` to `ArduinoJson::String` (issue #275) -* Changed `::Print` to `ArduinoJson::Print` too - -v5.3.0 ------- - -* Added custom implementation of `ftoa` (issues #266, #267, #269 and #270) -* Added `JsonVariant JsonBuffer::parse()` (issue #265) -* Fixed `unsigned long` printed as `signed long` (issue #170) - -v5.2.0 ------- - -* Added `JsonVariant::as()` as a synonym for `JsonVariant::as()` (issue #257) -* Added example `JsonHttpClient` (issue #256) -* Added `JsonArray::copyTo()` and `JsonArray::copyFrom()` (issue #254) -* Added `RawJson()` to insert pregenerated JSON portions (issue #259) - -v5.1.1 ------- - -* Removed `String` duplication when one replaces a value in a `JsonObject` (PR #232 by @ulion) - -v5.1.0 ------- - -* Added support of `long long` (issue #171) -* Moved all build settings to `ArduinoJson/Configuration.hpp` - -> ### BREAKING CHANGE :warning: -> -> If you defined `ARDUINOJSON_ENABLE_STD_STREAM`, you now need to define it to `1`. - -v5.0.8 ------- - -* Made the library compatible with [PlatformIO](http://platformio.org/) (issue #181) -* Fixed `JsonVariant::is()` that was incorrectly returning false (issue #214) - -v5.0.7 ------- - -* Made library easier to use from a CMake project: simply `add_subdirectory(ArduinoJson/src)` -* Changed `String` to be a `typedef` of `std::string` (issues #142 and #161) - -> ### BREAKING CHANGES :warning: -> -> - `JsonVariant(true).as()` now returns `"true"` instead of `"1"` -> - `JsonVariant(false).as()` now returns `"false"` instead of `"0"` - -v5.0.6 ------- - -* Added parameter to `DynamicJsonBuffer` constructor to set initial size (issue #152) -* Fixed warning about library category in Arduino 1.6.6 (issue #147) -* Examples: Added a loop to wait for serial port to be ready (issue #156) - -v5.0.5 ------- - -* Added overload `JsonObjectSuscript::set(value, decimals)` (issue #143) -* Use `float` instead of `double` to reduce the size of `JsonVariant` (issue #134) - -v5.0.4 ------- - -* Fixed ambiguous overload with `JsonArraySubscript` and `JsonObjectSubscript` (issue #122) - -v5.0.3 ------- - -* Fixed `printTo(String)` which wrote numbers instead of strings (issue #120) -* Fixed return type of `JsonArray::is()` and some others (issue #121) - -v5.0.2 ------- - -* Fixed segmentation fault in `parseObject(String)` and `parseArray(String)`, when the - `StaticJsonBuffer` is too small to hold a copy of the string -* Fixed Clang warning "register specifier is deprecated" (issue #102) -* Fixed GCC warning "declaration shadows a member" (issue #103) -* Fixed memory alignment, which made ESP8266 crash (issue #104) -* Fixed compilation on Visual Studio 2010 and 2012 (issue #107) - -v5.0.1 ------- - -* Fixed compilation with Arduino 1.0.6 (issue #99) - -v5.0.0 ------- - -* Added support of `String` class (issues #55, #56, #70, #77) -* Added `JsonBuffer::strdup()` to make a copy of a string (issues #10, #57) -* Implicitly call `strdup()` for `String` but not for `char*` (issues #84, #87) -* Added support of non standard JSON input (issue #44) -* Added support of comments in JSON input (issue #88) -* Added implicit cast between numerical types (issues #64, #69, #93) -* Added ability to read number values as string (issue #90) -* Redesigned `JsonVariant` to leverage converting constructors instead of assignment operators (issue #66) -* Switched to new the library layout (requires Arduino 1.0.6 or above) - -> ### BREAKING CHANGES :warning: -> -> - `JsonObject::add()` was renamed to `set()` -> - `JsonArray::at()` and `JsonObject::at()` were renamed to `get()` -> - Number of digits of floating point value are now set with `double_with_n_digits()` - -**Personal note about the `String` class**: -Support of the `String` class has been added to the library because many people use it in their programs. -However, you should not see this as an invitation to use the `String` class. -The `String` class is **bad** because it uses dynamic memory allocation. -Compared to static allocation, it compiles to a bigger, slower program, and is less predictable. -You certainly don't want that in an embedded environment! diff --git a/lib/ArduinoJson/LICENSE.md b/lib/ArduinoJson/LICENSE.md index 901bbb1b7..dee0b5ba4 100644 --- a/lib/ArduinoJson/LICENSE.md +++ b/lib/ArduinoJson/LICENSE.md @@ -1,7 +1,7 @@ The MIT License (MIT) --------------------- -Copyright © 2014-2021 Benoit BLANCHON +Copyright © 2014-2022, Benoit BLANCHON Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/lib/ArduinoJson/README.md b/lib/ArduinoJson/README.md index da9849177..78436e28d 100644 --- a/lib/ArduinoJson/README.md +++ b/lib/ArduinoJson/README.md @@ -2,12 +2,15 @@ --- -[![arduino-library-badge](https://www.ardu-badge.com/badge/ArduinoJson.svg?version=6.18.4)](https://www.ardu-badge.com/ArduinoJson/6.18.4) -[![Continuous Integration](https://github.com/bblanchon/ArduinoJson/workflows/Continuous%20Integration/badge.svg?branch=6.x)](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A6.x) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/bblanchon/ArduinoJson/Continuous%20Integration?logo=github)](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A6.x) [![Continuous Integration](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/6.x?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/6.x) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/arduinojson.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson) -[![Coverage Status](https://coveralls.io/repos/github/bblanchon/ArduinoJson/badge.svg?branch=6.x)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x) -[![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat)](https://github.com/bblanchon/ArduinoJson/stargazers) +[![LGTM Grade](https://img.shields.io/lgtm/grade/cpp/github/bblanchon/ArduinoJson?label=quality&logo=lgtm)](https://lgtm.com/projects/g/bblanchon/ArduinoJson/) +[![Coveralls branch](https://img.shields.io/coveralls/github/bblanchon/ArduinoJson/6.x?logo=coveralls)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x) +[![Arduino Library Manager](https://img.shields.io/static/v1?label=Arduino&message=v6.19.1&logo=arduino&logoColor=white&color=blue)](https://www.ardu-badge.com/ArduinoJson/6.19.1) +[![PlatformIO Registry](https://badges.registry.platformio.org/packages/bblanchon/library/ArduinoJson.svg?version=6.19.1)](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.19.1) +[![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat&logo=github)](https://github.com/bblanchon/ArduinoJson/stargazers) +[![GitHub Sponsors](https://img.shields.io/github/sponsors/bblanchon?logo=github)](https://github.com/sponsors/bblanchon) ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). @@ -31,10 +34,10 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). * [Consumes roughly 10% less RAM than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/?utm_source=github&utm_medium=readme) * [Fixed memory allocation, no heap fragmentation](https://arduinojson.org/v6/api/jsondocument/?utm_source=github&utm_medium=readme) * [Optionally works without heap memory (zero malloc)](https://arduinojson.org/v6/api/staticjsondocument/?utm_source=github&utm_medium=readme) - * Deduplicates strings + * [Deduplicates strings](https://arduinojson.org/news/2020/08/01/version-6-16-0/?utm_source=github&utm_medium=readme) * Versatile * Supports [custom allocators (to use external RAM chip, for example)](https://arduinojson.org/v6/how-to/use-external-ram-on-esp32/?utm_source=github&utm_medium=readme) - * Supports [`String`](https://arduinojson.org/v6/api/config/enable_arduino_string/?utm_source=github&utm_medium=readme), [`std::string`](https://arduinojson.org/v6/api/config/enable_std_string/?utm_source=github&utm_medium=readme) and [`std::string_view`](https://arduinojson.org/v6/api/config/enable_string_view/?utm_source=github&utm_medium=readme) + * Supports [`String`](https://arduinojson.org/v6/api/config/enable_arduino_string/?utm_source=github&utm_medium=readme), [`std::string`](https://arduinojson.org/v6/api/config/enable_std_string/?utm_source=github&utm_medium=readme), and [`std::string_view`](https://arduinojson.org/v6/api/config/enable_string_view/?utm_source=github&utm_medium=readme) * Supports [`Stream`](https://arduinojson.org/v6/api/config/enable_arduino_stream/?utm_source=github&utm_medium=readme) and [`std::istream`/`std::ostream`](https://arduinojson.org/v6/api/config/enable_std_stream/?utm_source=github&utm_medium=readme) * Supports [Flash strings](https://arduinojson.org/v6/api/config/enable_progmem/?utm_source=github&utm_medium=readme) * Supports [custom readers](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme#custom-reader) and [custom writers](https://arduinojson.org/v6/api/json/serializejson/?utm_source=github&utm_medium=readme#custom-writer) @@ -48,9 +51,10 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). * Arduino boards: [Uno](https://amzn.to/38aL2ik), [Due](https://amzn.to/36YkWi2), [Micro](https://amzn.to/35WkdwG), [Nano](https://amzn.to/2QTvwRX), [Mega](https://amzn.to/36XWhuf), [Yun](https://amzn.to/30odURc), [Leonardo](https://amzn.to/36XWjlR)... * Espressif chips: [ESP8266](https://amzn.to/36YluV8), [ESP32](https://amzn.to/2G4pRCB) * Lolin (WeMos) boards: [D1 mini](https://amzn.to/2QUpz7q), [D1 Mini Pro](https://amzn.to/36UsGSs)... - * Teensy boards: [4.0](https://amzn.to/30ljXGq), [3.2](https://amzn.to/2FT0EuC), [2.0](https://amzn.to/2QXUMXj) + * Teensy boards: [4.0](https://amzn.to/30ljXGq), [3.2](https://amzn.to/2FT0EuC), [2.0](https://amzn.to/2QXUMXj) * Particle boards: [Argon](https://amzn.to/2FQHa9X), [Boron](https://amzn.to/36WgLUd), [Electron](https://amzn.to/30vEc4k), [Photon](https://amzn.to/387F9Cd)... * Texas Instruments boards: [MSP430](https://amzn.to/30nJWgg)... + * Soft cores: [Nios II](https://en.wikipedia.org/wiki/Nios_II)... * Tested on all major development environments * [Arduino IDE](https://www.arduino.cc/en/Main/Software) * [Atmel Studio](http://www.atmel.com/microsite/atmel-studio/) @@ -77,7 +81,7 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). * Well tested * [Unit test coverage close to 100%](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x) * Continuously tested on - * [Visual Studio 2010, 2012, 2013, 2015, 2017, 2019](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/6.x) + * [Visual Studio 2010, 2012, 2013, 2015, 2017, 2019, 2022](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/6.x) * [GCC 4.4, 4.6, 4.7, 4.8, 4.9, 5, 6, 7, 8, 9, 10, 11](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22) * [Clang 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0, 6.0, 7, 8, 9, 10](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22) * [Continuously fuzzed with Google OSS Fuzz](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson) @@ -94,6 +98,7 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). * Most popular of all Arduino libraries on [GitHub](https://github.com/search?o=desc&q=arduino+library&s=stars&type=Repositories) * [Used in hundreds of projects](https://www.hackster.io/search?i=projects&q=arduinojson) * [Responsive support](https://github.com/bblanchon/ArduinoJson/issues?q=is%3Aissue+is%3Aclosed) + * [Discord server](https://discord.gg/DzN6hHHD4h) ## Quickstart @@ -134,11 +139,24 @@ serializeJson(doc, Serial); See the [tutorial on arduinojson.org](https://arduinojson.org/doc/encoding/?utm_source=github&utm_medium=readme) -## Support the project ❤️ +## Sponsors -Do you like this library? -Please [star this project on GitHub](https://github.com/bblanchon/ArduinoJson/stargazers)! +ArduinoJson is thankful to its sponsors. Please give them a visit; they deserve it! -What? You don't like it but you *love* it? -You can support the project by [purchasing my book](https://arduinojson.org/book/?utm_source=github&utm_medium=readme). -Alternatively, you can make a recurring donation via [GitHub Sponsors](https://github.com/sponsors/bblanchon). + +

+ + 1technophile + +

+ +If you run a commercial project that embeds ArduinoJson, think about [sponsoring the library's development](https://github.com/sponsors/bblanchon): it ensures the code that your products rely on stays actively maintained. It can also give your project some exposure to the makers' community. + +If you are an individual user and want to support the development (or give a sign of appreciation), consider purchasing the book [Mastering ArduinoJson](https://arduinojson.org/book/) ❤, or simply [cast a star](https://github.com/bblanchon/ArduinoJson/stargazers) ⭐. diff --git a/lib/ArduinoJson/SUPPORT.md b/lib/ArduinoJson/SUPPORT.md deleted file mode 100644 index c47e1b1ba..000000000 --- a/lib/ArduinoJson/SUPPORT.md +++ /dev/null @@ -1,27 +0,0 @@ -# ArduinoJson Support - -First off, thank you very much for using ArduinoJson. - -We'll be very happy to help you, but first please read the following. - -## Before asking for help - -1. Read the [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=support) -2. Search in the [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=support) - -If you did not find the answer, please create a [new issue on GitHub](https://github.com/bblanchon/ArduinoJson/issues/new). - -It is OK to add a comment to a currently opened issue, but please avoid adding comments to a closed issue. - -## Before hitting the Submit button - -Please provide all the relevant information: - -* Good title -* Short description of the problem -* Target platform -* Compiler model and version -* [MVCE](https://stackoverflow.com/help/mcve) -* Compiler output - -Good questions get fast answers! diff --git a/lib/ArduinoJson/src/ArduinoJson.h b/lib/ArduinoJson/src/ArduinoJson.h index 2984c2379..f79212dbc 100644 --- a/lib/ArduinoJson/src/ArduinoJson.h +++ b/lib/ArduinoJson/src/ArduinoJson.h @@ -1,12 +1,12 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #ifdef __cplusplus -#include "ArduinoJson.hpp" +# include "ArduinoJson.hpp" using namespace ArduinoJson; diff --git a/lib/ArduinoJson/src/ArduinoJson.hpp b/lib/ArduinoJson/src/ArduinoJson.hpp index d16ca08cd..abb8dd1fa 100644 --- a/lib/ArduinoJson/src/ArduinoJson.hpp +++ b/lib/ArduinoJson/src/ArduinoJson.hpp @@ -1,11 +1,18 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include "ArduinoJson/Configuration.hpp" +// Include Arduino.h before stdlib.h to avoid conflict with atexit() +// https://github.com/bblanchon/ArduinoJson/pull/1693#issuecomment-1001060240 +#if ARDUINOJSON_ENABLE_ARDUINO_STRING || ARDUINOJSON_ENABLE_ARDUINO_STREAM || \ + ARDUINOJSON_ENABLE_ARDUINO_PRINT || ARDUINOJSON_ENABLE_PROGMEM +# include +#endif + #if !ARDUINOJSON_DEBUG # ifdef __clang__ # pragma clang system_header diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayFunctions.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayFunctions.hpp index e7cdc4c5c..0b4d342f2 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayFunctions.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayFunctions.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp index ae06b2046..dcb4ff0b3 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayIterator.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayIterator.hpp index fcacc6b6a..cde9a246d 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayIterator.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayIterator.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayRef.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayRef.hpp index 4f8d0c631..a5df7abcd 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayRef.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayRef.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayShortcuts.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayShortcuts.hpp index fd26d04ae..1854a8c38 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayShortcuts.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayShortcuts.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp index c1016eb01..d54de4947 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp index 619b91d8d..b8e87f218 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp @@ -1,133 +1,103 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include #include -#include namespace ARDUINOJSON_NAMESPACE { -// Copy a 1D array to a JsonArray +// Trivial form to stop the recursion +template +inline typename enable_if::value, bool>::type copyArray( + const T& src, VariantRef dst) { + return dst.set(src); +} + +// Copy array to a JsonArray/JsonVariant/MemberProxy/ElementProxy template -inline typename enable_if::value && - !is_base_of::value, +inline typename enable_if::value, bool>::type copyArray(T (&src)[N], const TDestination& dst) { return copyArray(src, N, dst); } -// Copy a 1D array to a JsonDocument -template -inline bool copyArray(T (&src)[N], JsonDocument& dst) { - return copyArray(src, dst.to()); -} - -// Copy a 1D array to a JsonArray +// Copy ptr+size to a JsonArray/JsonVariant/MemberProxy/ElementProxy template -inline typename enable_if::value && - !is_base_of::value, +inline typename enable_if::value, bool>::type -copyArray(T* src, size_t len, const TDestination& dst) { +copyArray(const T* src, size_t len, const TDestination& dst) { bool ok = true; for (size_t i = 0; i < len; i++) { - ok &= dst.add(src[i]); + ok &= copyArray(src[i], dst.addElement()); } return ok; } -// Copy a 1D array to a JsonDocument +// Special case for char[] which much be treated as const char* +template +inline bool copyArray(const char* src, size_t, const TDestination& dst) { + return dst.set(src); +} + +// Copy array to a JsonDocument template -inline bool copyArray(T* src, size_t len, JsonDocument& dst) { +inline bool copyArray(const T& src, JsonDocument& dst) { + return copyArray(src, dst.to()); +} + +// Copy a ptr+size array to a JsonDocument +template +inline bool copyArray(const T* src, size_t len, JsonDocument& dst) { return copyArray(src, len, dst.to()); } -// Copy a 2D array to a JsonArray -template -inline typename enable_if::value, - bool>::type -copyArray(T (&src)[N1][N2], const TDestination& dst) { - bool ok = true; - for (size_t i = 0; i < N1; i++) { - ArrayRef nestedArray = dst.createNestedArray(); - for (size_t j = 0; j < N2; j++) { - ok &= nestedArray.add(src[i][j]); - } - } - return ok; -} - -// Copy a 2D array to a JsonDocument -template -inline bool copyArray(T (&src)[N1][N2], JsonDocument& dst) { - return copyArray(src, dst.to()); -} - +// Trivial case form to stop the recursion template -class ArrayCopier1D : public Visitor { - public: - ArrayCopier1D(T* destination, size_t capacity) - : _destination(destination), _capacity(capacity) {} - - size_t visitArray(const CollectionData& array) { - size_t size = 0; - VariantSlot* slot = array.head(); - - while (slot != 0 && size < _capacity) { - _destination[size++] = - Converter::fromJson(VariantConstRef(slot->data())); - slot = slot->next(); - } - return size; - } - - private: - T* _destination; - size_t _capacity; -}; - -template -class ArrayCopier2D : public Visitor { - public: - ArrayCopier2D(T (*destination)[N1][N2]) : _destination(destination) {} - - void visitArray(const CollectionData& array) { - VariantSlot* slot = array.head(); - size_t n = 0; - while (slot != 0 && n < N1) { - ArrayCopier1D copier((*_destination)[n++], N2); - variantAccept(slot->data(), copier); - slot = slot->next(); - } - } - - private: - T (*_destination)[N1][N2]; - size_t _capacity1, _capacity2; -}; - -// Copy a JsonArray to a 1D array -template inline typename enable_if::value, size_t>::type copyArray( - const TSource& src, T (&dst)[N]) { + VariantConstRef src, T& dst) { + dst = src.as(); + return 1; +} + +// Copy a JsonArray to array +template +inline size_t copyArray(ArrayConstRef src, T (&dst)[N]) { return copyArray(src, dst, N); } -// Copy a JsonArray to a 1D array -template -inline size_t copyArray(const TSource& src, T* dst, size_t len) { - ArrayCopier1D copier(dst, len); - - return src.accept(copier); +// Copy a JsonArray to ptr+size +template +inline size_t copyArray(ArrayConstRef src, T* dst, size_t len) { + size_t i = 0; + for (ArrayConstRef::iterator it = src.begin(); it != src.end() && i < len; + ++it) + copyArray(*it, dst[i++]); + return i; } -// Copy a JsonArray to a 2D array -template -inline void copyArray(const TSource& src, T (&dst)[N1][N2]) { - ArrayCopier2D copier(&dst); - src.accept(copier); +// Special case for char[] which must be treated as a string +template +inline size_t copyArray(VariantConstRef src, char (&dst)[N]) { + String s = src; + size_t len = N - 1; + if (len > s.size()) + len = s.size(); + memcpy(dst, s.c_str(), len); + dst[len] = 0; + return 1; +} + +// Copy a JsonDocument to an array +// (JsonDocument doesn't implicitly convert to JsonArrayConst) +template +inline typename enable_if::value && + is_base_of::value, + size_t>::type +copyArray(const TSource& src, T& dst) { + return copyArray(src.template as(), dst); } } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionData.hpp b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionData.hpp index d2bca45f0..74b605466 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionData.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionData.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -40,14 +40,15 @@ class CollectionData { // Object only - template - VariantData *addMember(TAdaptedString key, MemoryPool *pool); + template + VariantData *addMember(TAdaptedString key, MemoryPool *pool, TStoragePolicy); template VariantData *getMember(TAdaptedString key) const; - template - VariantData *getOrAddMember(TAdaptedString key, MemoryPool *pool); + template + VariantData *getOrAddMember(TAdaptedString key, MemoryPool *pool, + TStoragePolicy); template void removeMember(TAdaptedString key) { diff --git a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp index f814bcdf2..60f5cb11b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -1,10 +1,12 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include +#include +#include #include namespace ARDUINOJSON_NAMESPACE { @@ -34,11 +36,12 @@ inline VariantData* CollectionData::addElement(MemoryPool* pool) { return slotData(addSlot(pool)); } -template +template inline VariantData* CollectionData::addMember(TAdaptedString key, - MemoryPool* pool) { + MemoryPool* pool, + TStoragePolicy storage) { VariantSlot* slot = addSlot(pool); - if (!slotSetKey(slot, key, pool)) { + if (!slotSetKey(slot, key, pool, storage)) { removeSlot(slot); return 0; } @@ -61,10 +64,8 @@ inline bool CollectionData::copyFrom(const CollectionData& src, for (VariantSlot* s = src._head; s; s = s->next()) { VariantData* var; if (s->key() != 0) { - if (s->ownsKey()) - var = addMember(adaptString(const_cast(s->key())), pool); - else - var = addMember(adaptString(s->key()), pool); + String key(s->key(), !s->ownsKey()); + var = addMember(adaptString(key), pool, getStringStoragePolicy(key)); } else { var = addElement(pool); } @@ -105,9 +106,11 @@ inline bool CollectionData::equalsArray(const CollectionData& other) const { template inline VariantSlot* CollectionData::getSlot(TAdaptedString key) const { + if (key.isNull()) + return 0; VariantSlot* slot = _head; while (slot) { - if (key.compare(slot->key()) == 0) + if (stringEquals(key, adaptString(slot->key()))) break; slot = slot->next(); } @@ -137,9 +140,9 @@ inline VariantData* CollectionData::getMember(TAdaptedString key) const { return slot ? slot->data() : 0; } -template -inline VariantData* CollectionData::getOrAddMember(TAdaptedString key, - MemoryPool* pool) { +template +inline VariantData* CollectionData::getOrAddMember( + TAdaptedString key, MemoryPool* pool, TStoragePolicy storage_policy) { // ignore null key if (key.isNull()) return 0; @@ -149,7 +152,7 @@ inline VariantData* CollectionData::getOrAddMember(TAdaptedString key, if (slot) return slot->data(); - return addMember(key, pool); + return addMember(key, pool, storage_policy); } inline VariantData* CollectionData::getElement(size_t index) const { diff --git a/lib/ArduinoJson/src/ArduinoJson/Configuration.hpp b/lib/ArduinoJson/src/ArduinoJson/Configuration.hpp index 332abb6a7..ed5687a39 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Configuration.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Configuration.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -26,134 +26,96 @@ # define ARDUINOJSON_HAS_INT64 0 #endif -// Small or big machine? -#ifndef ARDUINOJSON_EMBEDDED_MODE -# if defined(ARDUINO) /* Arduino*/ \ - || defined(__IAR_SYSTEMS_ICC__) /* IAR Embedded Workbench */ \ - || defined(__XC) /* MPLAB XC compiler */ \ - || defined(__ARMCC_VERSION) /* Keil ARM Compiler */ \ - || defined(__AVR) /* Atmel AVR8/GNU C Compiler */ -# define ARDUINOJSON_EMBEDDED_MODE 1 -# else -# define ARDUINOJSON_EMBEDDED_MODE 0 -# endif -#endif - -// Auto enable std::stream if the right headers are here and no conflicting -// macro is defined -#if !defined(ARDUINOJSON_ENABLE_STD_STREAM) && defined(__has_include) -# if __has_include() && \ +// Support std::istream and std::ostream +#ifndef ARDUINOJSON_ENABLE_STD_STREAM +# ifdef __has_include +# if __has_include() && \ __has_include() && \ !defined(min) && \ !defined(max) -# define ARDUINOJSON_ENABLE_STD_STREAM 1 +# define ARDUINOJSON_ENABLE_STD_STREAM 1 +# else +# define ARDUINOJSON_ENABLE_STD_STREAM 0 +# endif # else -# define ARDUINOJSON_ENABLE_STD_STREAM 0 +# ifdef ARDUINO +# define ARDUINOJSON_ENABLE_STD_STREAM 0 +# else +# define ARDUINOJSON_ENABLE_STD_STREAM 1 +# endif # endif #endif -// Auto enable std::string if the right header is here and no conflicting -// macro is defined -#if !defined(ARDUINOJSON_ENABLE_STD_STRING) && defined(__has_include) -# if __has_include() && !defined(min) && !defined(max) -# define ARDUINOJSON_ENABLE_STD_STRING 1 +// Support std::string +#ifndef ARDUINOJSON_ENABLE_STD_STRING +# ifdef __has_include +# if __has_include() && !defined(min) && !defined(max) +# define ARDUINOJSON_ENABLE_STD_STRING 1 +# else +# define ARDUINOJSON_ENABLE_STD_STRING 0 +# endif # else -# define ARDUINOJSON_ENABLE_STD_STRING 0 +# ifdef ARDUINO +# define ARDUINOJSON_ENABLE_STD_STRING 0 +# else +# define ARDUINOJSON_ENABLE_STD_STRING 1 +# endif # endif #endif +// Support for std::string_view #ifndef ARDUINOJSON_ENABLE_STRING_VIEW # ifdef __has_include # if __has_include() && __cplusplus >= 201703L # define ARDUINOJSON_ENABLE_STRING_VIEW 1 +# else +# define ARDUINOJSON_ENABLE_STRING_VIEW 0 # endif +# else +# define ARDUINOJSON_ENABLE_STRING_VIEW 0 # endif #endif -#ifndef ARDUINOJSON_ENABLE_STRING_VIEW -# define ARDUINOJSON_ENABLE_STRING_VIEW 0 + +// Store floating-point values with float (0) or double (1) +#ifndef ARDUINOJSON_USE_DOUBLE +# define ARDUINOJSON_USE_DOUBLE 1 #endif -#if ARDUINOJSON_EMBEDDED_MODE - -// Store floats by default to reduce the memory usage (issue #134) -# ifndef ARDUINOJSON_USE_DOUBLE -# define ARDUINOJSON_USE_DOUBLE 0 -# endif - -// Store longs by default, because they usually match the size of a float. -# ifndef ARDUINOJSON_USE_LONG_LONG -# define ARDUINOJSON_USE_LONG_LONG 0 -# endif - -// Embedded systems usually don't have std::string -# ifndef ARDUINOJSON_ENABLE_STD_STRING -# define ARDUINOJSON_ENABLE_STD_STRING 0 -# endif - -// Embedded systems usually don't have std::stream -# ifndef ARDUINOJSON_ENABLE_STD_STREAM -# define ARDUINOJSON_ENABLE_STD_STREAM 0 +// Store integral values with long (0) or long long (1) +#ifndef ARDUINOJSON_USE_LONG_LONG +# if ARDUINOJSON_HAS_LONG_LONG && defined(__SIZEOF_POINTER__) && \ + __SIZEOF_POINTER__ >= 4 || \ + defined(_MSC_VER) +# define ARDUINOJSON_USE_LONG_LONG 1 # endif +#endif +#ifndef ARDUINOJSON_USE_LONG_LONG +# define ARDUINOJSON_USE_LONG_LONG 0 +#endif // Limit nesting as the stack is likely to be small -# ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT -# define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10 -# endif +#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT +# define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10 +#endif // Number of bits to store the pointer to next node // (saves RAM but limits the number of values in a document) -# ifndef ARDUINOJSON_SLOT_OFFSET_SIZE -# if defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 2 +#ifndef ARDUINOJSON_SLOT_OFFSET_SIZE +# if defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ <= 2 // Address space == 16-bit => max 127 values -# define ARDUINOJSON_SLOT_OFFSET_SIZE 1 -# else -// Address space > 16-bit => max 32767 values -# define ARDUINOJSON_SLOT_OFFSET_SIZE 2 -# endif -# endif - -#else // ARDUINOJSON_EMBEDDED_MODE - -// On a computer we have plenty of memory so we can use doubles -# ifndef ARDUINOJSON_USE_DOUBLE -# define ARDUINOJSON_USE_DOUBLE 1 -# endif - -// Use long long when available -# ifndef ARDUINOJSON_USE_LONG_LONG -# if ARDUINOJSON_HAS_LONG_LONG || ARDUINOJSON_HAS_INT64 -# define ARDUINOJSON_USE_LONG_LONG 1 -# else -# define ARDUINOJSON_USE_LONG_LONG 0 -# endif -# endif - -// On a computer, we can use std::string -# ifndef ARDUINOJSON_ENABLE_STD_STRING -# define ARDUINOJSON_ENABLE_STD_STRING 1 -# endif - -// On a computer, we can assume std::stream -# ifndef ARDUINOJSON_ENABLE_STD_STREAM -# define ARDUINOJSON_ENABLE_STD_STREAM 1 -# endif - -// On a computer, the stack is large so we can increase nesting limit -# ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT -# define ARDUINOJSON_DEFAULT_NESTING_LIMIT 50 -# endif - -// Number of bits to store the pointer to next node -# ifndef ARDUINOJSON_SLOT_OFFSET_SIZE +# define ARDUINOJSON_SLOT_OFFSET_SIZE 1 +# elif defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ >= 8 || \ + defined(_WIN64) && _WIN64 +// Address space == 64-bit => max 2147483647 values # define ARDUINOJSON_SLOT_OFFSET_SIZE 4 +# else +// Address space == 32-bit => max 32767 values +# define ARDUINOJSON_SLOT_OFFSET_SIZE 2 # endif - -#endif // ARDUINOJSON_EMBEDDED_MODE +#endif #ifdef ARDUINO -# include - // Enable support for Arduino's String class # ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING # define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 @@ -169,6 +131,11 @@ # define ARDUINOJSON_ENABLE_ARDUINO_PRINT 1 # endif +// Enable support for PROGMEM +# ifndef ARDUINOJSON_ENABLE_PROGMEM +# define ARDUINOJSON_ENABLE_PROGMEM 1 +# endif + #else // ARDUINO // Disable support for Arduino's String class @@ -186,16 +153,12 @@ # define ARDUINOJSON_ENABLE_ARDUINO_PRINT 0 # endif -#endif // ARDUINO - -#ifndef ARDUINOJSON_ENABLE_PROGMEM -# if defined(PROGMEM) && defined(pgm_read_byte) && defined(pgm_read_dword) && \ - defined(pgm_read_ptr) && defined(pgm_read_float) -# define ARDUINOJSON_ENABLE_PROGMEM 1 -# else +// Disable support for PROGMEM +# ifndef ARDUINOJSON_ENABLE_PROGMEM # define ARDUINOJSON_ENABLE_PROGMEM 0 # endif -#endif + +#endif // ARDUINO // Convert unicode escape sequence (\u0123) to UTF-8 #ifndef ARDUINOJSON_DECODE_UNICODE diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/DeserializationError.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/DeserializationError.hpp index 11ec7df66..96b3a178b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/DeserializationError.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/DeserializationError.hpp @@ -1,9 +1,10 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once +#include #include #include #include @@ -14,11 +15,7 @@ namespace ARDUINOJSON_NAMESPACE { -class DeserializationError { - // safe bool idiom - typedef void (DeserializationError::*bool_type)() const; - void safeBoolHelper() const {} - +class DeserializationError : public SafeBoolIdom { public: enum Code { Ok, @@ -58,19 +55,7 @@ class DeserializationError { // Behaves like a bool operator bool_type() const { - return _code != Ok ? &DeserializationError::safeBoolHelper : 0; - } - friend bool operator==(bool value, const DeserializationError& err) { - return static_cast(err) == value; - } - friend bool operator==(const DeserializationError& err, bool value) { - return static_cast(err) == value; - } - friend bool operator!=(bool value, const DeserializationError& err) { - return static_cast(err) != value; - } - friend bool operator!=(const DeserializationError& err, bool value) { - return static_cast(err) != value; + return _code != Ok ? safe_true() : safe_false(); } // Returns internal enum, useful for switch statement diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Filter.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Filter.hpp index de94b9400..8a091bb1f 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Filter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Filter.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/NestingLimit.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/NestingLimit.hpp index 06964b43e..af5724d0a 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/NestingLimit.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/NestingLimit.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Reader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Reader.hpp index 20f77afef..4e1958c75 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Reader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Reader.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp index 724638f92..179e37681 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/ArduinoStringReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/ArduinoStringReader.hpp index 71571d416..652409a0f 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/ArduinoStringReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/ArduinoStringReader.hpp @@ -1,9 +1,11 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once +#include + namespace ARDUINOJSON_NAMESPACE { template diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/FlashReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/FlashReader.hpp index 7eca134d7..c48248c1d 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/FlashReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/FlashReader.hpp @@ -1,9 +1,11 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once +#include + namespace ARDUINOJSON_NAMESPACE { template <> diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp index 37c3c317d..1c470c048 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/RamReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/RamReader.hpp index 67cf6825b..1181297ed 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/RamReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/RamReader.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/StdStreamReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/StdStreamReader.hpp index eebaa2cc0..c92f7931b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/StdStreamReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/StdStreamReader.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp index e56e26264..569fa2c57 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/deserialize.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/deserialize.hpp index 23295421c..805cbb04c 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/deserialize.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/deserialize.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Document/BasicJsonDocument.hpp b/lib/ArduinoJson/src/ArduinoJson/Document/BasicJsonDocument.hpp index 5c85d8a78..1b02c86bd 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Document/BasicJsonDocument.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Document/BasicJsonDocument.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -14,7 +14,6 @@ template class AllocatorOwner { public: AllocatorOwner() {} - AllocatorOwner(const AllocatorOwner& src) : _allocator(src._allocator) {} AllocatorOwner(TAllocator a) : _allocator(a) {} void* allocate(size_t size) { @@ -98,7 +97,9 @@ class BasicJsonDocument : AllocatorOwner, public JsonDocument { template BasicJsonDocument& operator=(const T& src) { - reallocPoolIfTooSmall(src.memoryUsage()); + size_t requiredSize = src.memoryUsage(); + if (requiredSize > capacity()) + reallocPool(requiredSize); set(src); return *this; } @@ -136,8 +137,9 @@ class BasicJsonDocument : AllocatorOwner, public JsonDocument { return MemoryPool(reinterpret_cast(this->allocate(capa)), capa); } - void reallocPoolIfTooSmall(size_t requiredSize) { - if (requiredSize <= capacity()) + void reallocPool(size_t requiredSize) { + size_t capa = addPadding(requiredSize); + if (capa == _pool.capacity()) return; freePool(); replacePool(allocPool(addPadding(requiredSize))); @@ -148,7 +150,7 @@ class BasicJsonDocument : AllocatorOwner, public JsonDocument { } void copyAssignFrom(const JsonDocument& src) { - reallocPoolIfTooSmall(src.capacity()); + reallocPool(src.capacity()); set(src); } diff --git a/lib/ArduinoJson/src/ArduinoJson/Document/DynamicJsonDocument.hpp b/lib/ArduinoJson/src/ArduinoJson/Document/DynamicJsonDocument.hpp index de6f41131..514fe3abf 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Document/DynamicJsonDocument.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Document/DynamicJsonDocument.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp b/lib/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp index d81853c3a..90e22e798 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -138,14 +139,14 @@ class JsonDocument : public Visitable { // containsKey(const __FlashStringHelper*) const template bool containsKey(TChar* key) const { - return !getMember(key).isUndefined(); + return !getMember(key).isUnbound(); } // containsKey(const std::string&) const // containsKey(const String&) const template bool containsKey(const TString& key) const { - return !getMember(key).isUndefined(); + return !getMember(key).isUnbound(); } // operator[](const std::string&) @@ -244,14 +245,18 @@ class JsonDocument : public Visitable { // getOrAddMember(const __FlashStringHelper*) template FORCE_INLINE VariantRef getOrAddMember(TChar* key) { - return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool)); + return VariantRef(&_pool, + _data.getOrAddMember(adaptString(key), &_pool, + getStringStoragePolicy(key))); } // getOrAddMember(const std::string&) // getOrAddMember(const String&) template FORCE_INLINE VariantRef getOrAddMember(const TString& key) { - return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool)); + return VariantRef(&_pool, + _data.getOrAddMember(adaptString(key), &_pool, + getStringStoragePolicy(key))); } FORCE_INLINE VariantRef addElement() { diff --git a/lib/ArduinoJson/src/ArduinoJson/Document/StaticJsonDocument.hpp b/lib/ArduinoJson/src/ArduinoJson/Document/StaticJsonDocument.hpp index fbbadd43a..557c99946 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Document/StaticJsonDocument.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Document/StaticJsonDocument.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -33,13 +33,13 @@ class StaticJsonDocument : public JsonDocument { set(src); } - StaticJsonDocument operator=(const StaticJsonDocument& src) { + StaticJsonDocument& operator=(const StaticJsonDocument& src) { set(src); return *this; } template - StaticJsonDocument operator=(const T& src) { + StaticJsonDocument& operator=(const T& src) { set(src); return *this; } diff --git a/lib/ArduinoJson/src/ArduinoJson/Json/EscapeSequence.hpp b/lib/ArduinoJson/src/ArduinoJson/Json/EscapeSequence.hpp index 811e82522..c21a58e2c 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Json/EscapeSequence.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Json/EscapeSequence.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Json/JsonDeserializer.hpp b/lib/ArduinoJson/src/ArduinoJson/Json/JsonDeserializer.hpp index 1a07be866..3d517175e 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -231,12 +231,12 @@ class JsonDeserializer { return false; } - const char *key = _stringStorage.c_str(); + String key = _stringStorage.str(); - TFilter memberFilter = filter[key]; + TFilter memberFilter = filter[key.c_str()]; if (memberFilter.allow()) { - VariantData *variant = object.getMember(adaptString(key)); + VariantData *variant = object.getMember(adaptString(key.c_str())); if (!variant) { // Save key in memory pool. // This MUST be done before adding the slot. @@ -249,7 +249,7 @@ class JsonDeserializer { return false; } - slot->setKey(key, typename TStringStorage::storage_policy()); + slot->setKey(key); variant = slot->data(); } @@ -345,8 +345,7 @@ class JsonDeserializer { _stringStorage.startString(); if (!parseQuotedString()) return false; - const char *value = _stringStorage.save(); - variant.setStringPointer(value, typename TStringStorage::storage_policy()); + variant.setString(_stringStorage.save()); return true; } @@ -402,8 +401,6 @@ class JsonDeserializer { _stringStorage.append(c); } - _stringStorage.append('\0'); - if (!_stringStorage.isValid()) { _error = DeserializationError::NoMemory; return false; @@ -427,8 +424,6 @@ class JsonDeserializer { return false; } - _stringStorage.append('\0'); - if (!_stringStorage.isValid()) { _error = DeserializationError::NoMemory; return false; diff --git a/lib/ArduinoJson/src/ArduinoJson/Json/JsonSerializer.hpp b/lib/ArduinoJson/src/ArduinoJson/Json/JsonSerializer.hpp index 5cb9aa270..db5803c96 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Json/JsonSerializer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Json/JsonSerializer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -8,6 +8,7 @@ #include #include #include +#include namespace ARDUINOJSON_NAMESPACE { @@ -68,6 +69,11 @@ class JsonSerializer : public Visitor { return bytesWritten(); } + size_t visitString(const char *value, size_t n) { + _formatter.writeString(value, n); + return bytesWritten(); + } + size_t visitRawJson(const char *data, size_t n) { _formatter.writeRaw(data, n); return bytesWritten(); diff --git a/lib/ArduinoJson/src/ArduinoJson/Json/Latch.hpp b/lib/ArduinoJson/src/ArduinoJson/Json/Latch.hpp index 70866d6b7..c422fef16 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Json/Latch.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Json/Latch.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Json/PrettyJsonSerializer.hpp b/lib/ArduinoJson/src/ArduinoJson/Json/PrettyJsonSerializer.hpp index dbb0c1723..cbd66540b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Json/PrettyJsonSerializer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Json/PrettyJsonSerializer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Json/TextFormatter.hpp b/lib/ArduinoJson/src/ArduinoJson/Json/TextFormatter.hpp index 7795671ff..26754d838 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Json/TextFormatter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Json/TextFormatter.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -41,13 +41,22 @@ class TextFormatter { writeRaw('\"'); } + void writeString(const char *value, size_t n) { + ARDUINOJSON_ASSERT(value != NULL); + writeRaw('\"'); + while (n--) writeChar(*value++); + writeRaw('\"'); + } + void writeChar(char c) { char specialChar = EscapeSequence::escapeChar(c); if (specialChar) { writeRaw('\\'); writeRaw(specialChar); - } else { + } else if (c) { writeRaw(c); + } else { + writeRaw("\\u0000"); } } diff --git a/lib/ArduinoJson/src/ArduinoJson/Json/Utf16.hpp b/lib/ArduinoJson/src/ArduinoJson/Json/Utf16.hpp index e2b901056..3a22bf3a6 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Json/Utf16.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Json/Utf16.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Json/Utf8.hpp b/lib/ArduinoJson/src/ArduinoJson/Json/Utf8.hpp index c8f11036b..0ec23ac76 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Json/Utf8.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Json/Utf8.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Memory/Alignment.hpp b/lib/ArduinoJson/src/ArduinoJson/Memory/Alignment.hpp index bf1679879..c505fe8ad 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Memory/Alignment.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Memory/Alignment.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Memory/MemoryPool.hpp b/lib/ArduinoJson/src/ArduinoJson/Memory/MemoryPool.hpp index 04e5b2d28..3745bfda0 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Memory/MemoryPool.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Memory/MemoryPool.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -60,7 +60,7 @@ class MemoryPool { } template - const char* saveString(const TAdaptedString& str) { + const char* saveString(TAdaptedString str) { if (str.isNull()) return 0; @@ -74,7 +74,7 @@ class MemoryPool { char* newCopy = allocString(n + 1); if (newCopy) { - str.copyTo(newCopy, n); + stringGetChars(str, newCopy, n); newCopy[n] = 0; // force null-terminator } return newCopy; @@ -87,13 +87,14 @@ class MemoryPool { const char* saveStringFromFreeZone(size_t len) { #if ARDUINOJSON_ENABLE_STRING_DEDUPLICATION - const char* dup = findString(adaptString(_left)); + const char* dup = findString(adaptString(_left, len)); if (dup) return dup; #endif const char* str = _left; _left += len; + *_left++ = 0; checkInvariants(); return str; } @@ -165,9 +166,10 @@ class MemoryPool { #if ARDUINOJSON_ENABLE_STRING_DEDUPLICATION template - const char* findString(const TAdaptedString& str) { - for (char* next = _begin; next < _left; ++next) { - if (str.compare(next) == 0) + const char* findString(const TAdaptedString& str) const { + size_t n = str.size(); + for (char* next = _begin; next + n < _left; ++next) { + if (next[n] == '\0' && stringEquals(str, adaptString(next, n))) return next; // jump to next terminator diff --git a/lib/ArduinoJson/src/ArduinoJson/Misc/SafeBoolIdiom.hpp b/lib/ArduinoJson/src/ArduinoJson/Misc/SafeBoolIdiom.hpp new file mode 100644 index 000000000..ff4bf53a3 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Misc/SafeBoolIdiom.hpp @@ -0,0 +1,26 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include + +namespace ARDUINOJSON_NAMESPACE { + +template +class SafeBoolIdom { + protected: + typedef void (T::*bool_type)() const; + void safeBoolHelper() const {} + + static bool_type safe_true() { + return &SafeBoolIdom::safeBoolHelper; + } + + static bool_type safe_false() { + return 0; + } +}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Misc/SerializedValue.hpp b/lib/ArduinoJson/src/ArduinoJson/Misc/SerializedValue.hpp index 30173bf86..217c6f3c5 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Misc/SerializedValue.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Misc/SerializedValue.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Misc/Visitable.hpp b/lib/ArduinoJson/src/ArduinoJson/Misc/Visitable.hpp index f25d12f2b..2efced641 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Misc/Visitable.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Misc/Visitable.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index 1b153a7ca..5916bac81 100644 --- a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -48,6 +48,11 @@ class MsgPackDeserializer { bool allowValue = filter.allowValue(); + if (allowValue) { + // callers pass a null pointer only when value must be ignored + ARDUINOJSON_ASSERT(variant != 0); + } + switch (code) { case 0xc0: // already null @@ -331,8 +336,7 @@ class MsgPackDeserializer { bool readString(VariantData *variant, size_t n) { if (!readString(n)) return false; - variant->setStringPointer(_stringStorage.save(), - typename TStringStorage::storage_policy()); + variant->setString(_stringStorage.save()); return true; } @@ -344,7 +348,6 @@ class MsgPackDeserializer { return false; _stringStorage.append(static_cast(c)); } - _stringStorage.append('\0'); if (!_stringStorage.isValid()) { _error = DeserializationError::NoMemory; return false; @@ -419,11 +422,13 @@ class MsgPackDeserializer { if (!readKey()) return false; - const char *key = _stringStorage.c_str(); - TFilter memberFilter = filter[key]; + String key = _stringStorage.str(); + TFilter memberFilter = filter[key.c_str()]; VariantData *member; if (memberFilter.allow()) { + ARDUINOJSON_ASSERT(object); + // Save key in memory pool. // This MUST be done before adding the slot. key = _stringStorage.save(); @@ -434,7 +439,7 @@ class MsgPackDeserializer { return false; } - slot->setKey(key, typename TStringStorage::storage_policy()); + slot->setKey(key); member = slot->data(); } else { diff --git a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp index b1cd8727c..51e929bec 100644 --- a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -78,9 +78,11 @@ class MsgPackSerializer : public Visitor { } size_t visitString(const char* value) { - ARDUINOJSON_ASSERT(value != NULL); + return visitString(value, strlen(value)); + } - size_t n = strlen(value); + size_t visitString(const char* value, size_t n) { + ARDUINOJSON_ASSERT(value != NULL); if (n < 0x20) { writeByte(uint8_t(0xA0 + n)); diff --git a/lib/ArduinoJson/src/ArduinoJson/MsgPack/endianess.hpp b/lib/ArduinoJson/src/ArduinoJson/MsgPack/endianess.hpp index 74f7e9dae..446c1cff6 100644 --- a/lib/ArduinoJson/src/ArduinoJson/MsgPack/endianess.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/MsgPack/endianess.hpp @@ -1,29 +1,34 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include -#include namespace ARDUINOJSON_NAMESPACE { #if ARDUINOJSON_LITTLE_ENDIAN +inline void swapBytes(uint8_t &a, uint8_t &b) { + uint8_t t(a); + a = b; + b = t; +} + inline void fixEndianess(uint8_t *p, integral_constant) { - swap(p[0], p[7]); - swap(p[1], p[6]); - swap(p[2], p[5]); - swap(p[3], p[4]); + swapBytes(p[0], p[7]); + swapBytes(p[1], p[6]); + swapBytes(p[2], p[5]); + swapBytes(p[3], p[4]); } inline void fixEndianess(uint8_t *p, integral_constant) { - swap(p[0], p[3]); - swap(p[1], p[2]); + swapBytes(p[0], p[3]); + swapBytes(p[1], p[2]); } inline void fixEndianess(uint8_t *p, integral_constant) { - swap(p[0], p[1]); + swapBytes(p[0], p[1]); } inline void fixEndianess(uint8_t *, integral_constant) {} diff --git a/lib/ArduinoJson/src/ArduinoJson/MsgPack/ieee754.hpp b/lib/ArduinoJson/src/ArduinoJson/MsgPack/ieee754.hpp index 016d5334d..16f380ae9 100644 --- a/lib/ArduinoJson/src/ArduinoJson/MsgPack/ieee754.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/MsgPack/ieee754.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Namespace.hpp b/lib/ArduinoJson/src/ArduinoJson/Namespace.hpp index 26def8ab0..ac4004eb6 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Namespace.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Namespace.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Numbers/Float.hpp b/lib/ArduinoJson/src/ArduinoJson/Numbers/Float.hpp index bbaca0454..4c6c0f758 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Numbers/Float.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Numbers/Float.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Numbers/FloatParts.hpp b/lib/ArduinoJson/src/ArduinoJson/Numbers/FloatParts.hpp index 4e53add39..2f28ff75e 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Numbers/FloatParts.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Numbers/FloatParts.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Numbers/FloatTraits.hpp b/lib/ArduinoJson/src/ArduinoJson/Numbers/FloatTraits.hpp index 60b1dfd1a..0af77f3b0 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Numbers/FloatTraits.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Numbers/FloatTraits.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -158,24 +158,42 @@ struct FloatTraits { } static T positiveBinaryPowerOfTen(int index) { - ARDUINOJSON_DEFINE_STATIC_ARRAY( - T, factors, - ARDUINOJSON_EXPAND6({1e1f, 1e2f, 1e4f, 1e8f, 1e16f, 1e32f})); - return ARDUINOJSON_READ_STATIC_ARRAY(T, factors, index); + ARDUINOJSON_DEFINE_STATIC_ARRAY(uint32_t, factors, + ARDUINOJSON_EXPAND6({ + 0x41200000, // 1e1f + 0x42c80000, // 1e2f + 0x461c4000, // 1e4f + 0x4cbebc20, // 1e8f + 0x5a0e1bca, // 1e16f + 0x749dc5ae // 1e32f + })); + return forge(ARDUINOJSON_READ_STATIC_ARRAY(uint32_t, factors, index)); } static T negativeBinaryPowerOfTen(int index) { - ARDUINOJSON_DEFINE_STATIC_ARRAY( - T, factors, - ARDUINOJSON_EXPAND6({1e-1f, 1e-2f, 1e-4f, 1e-8f, 1e-16f, 1e-32f})); - return ARDUINOJSON_READ_STATIC_ARRAY(T, factors, index); + ARDUINOJSON_DEFINE_STATIC_ARRAY(uint32_t, factors, + ARDUINOJSON_EXPAND6({ + 0x3dcccccd, // 1e-1f + 0x3c23d70a, // 1e-2f + 0x38d1b717, // 1e-4f + 0x322bcc77, // 1e-8f + 0x24e69595, // 1e-16f + 0x0a4fb11f // 1e-32f + })); + return forge(ARDUINOJSON_READ_STATIC_ARRAY(uint32_t, factors, index)); } static T negativeBinaryPowerOfTenPlusOne(int index) { - ARDUINOJSON_DEFINE_STATIC_ARRAY( - T, factors, - ARDUINOJSON_EXPAND6({1e0f, 1e-1f, 1e-3f, 1e-7f, 1e-15f, 1e-31f})); - return ARDUINOJSON_READ_STATIC_ARRAY(T, factors, index); + ARDUINOJSON_DEFINE_STATIC_ARRAY(uint32_t, factors, + ARDUINOJSON_EXPAND6({ + 0x3f800000, // 1e0f + 0x3dcccccd, // 1e-1f + 0x3a83126f, // 1e-3f + 0x33d6bf95, // 1e-7f + 0x26901d7d, // 1e-15f + 0x0c01ceb3 // 1e-31f + })); + return forge(ARDUINOJSON_READ_STATIC_ARRAY(uint32_t, factors, index)); } static T forge(uint32_t bits) { diff --git a/lib/ArduinoJson/src/ArduinoJson/Numbers/Integer.hpp b/lib/ArduinoJson/src/ArduinoJson/Numbers/Integer.hpp index e0ed519a1..dbf653649 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Numbers/Integer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Numbers/Integer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Numbers/arithmeticCompare.hpp b/lib/ArduinoJson/src/ArduinoJson/Numbers/arithmeticCompare.hpp index bfd41d548..6e777c07c 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Numbers/arithmeticCompare.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Numbers/arithmeticCompare.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Numbers/convertNumber.hpp b/lib/ArduinoJson/src/ArduinoJson/Numbers/convertNumber.hpp index 3087459f4..87547f5b4 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Numbers/convertNumber.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Numbers/convertNumber.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Numbers/parseNumber.hpp b/lib/ArduinoJson/src/ArduinoJson/Numbers/parseNumber.hpp index cf050c78d..0273d0750 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Numbers/parseNumber.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Numbers/parseNumber.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp index f1463a3dd..e8fff4def 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectFunctions.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectFunctions.hpp index 1b46e8426..0f0b7ebff 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectFunctions.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectFunctions.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -40,12 +40,13 @@ void objectRemove(CollectionData *obj, TAdaptedString key) { obj->removeMember(key); } -template +template inline VariantData *objectGetOrAddMember(CollectionData *obj, - TAdaptedString key, MemoryPool *pool) { + TAdaptedString key, MemoryPool *pool, + TStoragePolicy storage_policy) { if (!obj) return 0; - return obj->getOrAddMember(key, pool); + return obj->getOrAddMember(key, pool, storage_policy); } } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectImpl.hpp index d66b61cad..66793a772 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectImpl.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -40,14 +40,14 @@ template template inline typename enable_if::value, bool>::type ObjectShortcuts::containsKey(const TString& key) const { - return !impl()->getMember(key).isUndefined(); + return !impl()->getMember(key).isUnbound(); } template template inline typename enable_if::value, bool>::type ObjectShortcuts::containsKey(TChar* key) const { - return !impl()->getMember(key).isUndefined(); + return !impl()->getMember(key).isUnbound(); } template diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectIterator.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectIterator.hpp index d72945990..d715e4059 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectIterator.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectIterator.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectRef.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectRef.hpp index 047d9b1b5..6cf9c14d1 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectRef.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectRef.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -77,7 +77,7 @@ class ObjectConstRef : public ObjectRefBase, // containsKey(const String&) const template FORCE_INLINE bool containsKey(const TString& key) const { - return !getMember(key).isUndefined(); + return !getMember(key).isUnbound(); } // containsKey(char*) const @@ -85,7 +85,7 @@ class ObjectConstRef : public ObjectRefBase, // containsKey(const __FlashStringHelper*) const template FORCE_INLINE bool containsKey(TChar* key) const { - return !getMember(key).isUndefined(); + return !getMember(key).isUnbound(); } // getMember(const std::string&) const @@ -196,7 +196,8 @@ class ObjectRef : public ObjectRefBase, template FORCE_INLINE VariantRef getOrAddMember(const TString& key) const { return VariantRef(_pool, - objectGetOrAddMember(_data, adaptString(key), _pool)); + objectGetOrAddMember(_data, adaptString(key), _pool, + getStringStoragePolicy(key))); } // getOrAddMember(char*) const @@ -205,7 +206,8 @@ class ObjectRef : public ObjectRefBase, template FORCE_INLINE VariantRef getOrAddMember(TChar* key) const { return VariantRef(_pool, - objectGetOrAddMember(_data, adaptString(key), _pool)); + objectGetOrAddMember(_data, adaptString(key), _pool, + getStringStoragePolicy(key))); } FORCE_INLINE bool operator==(ObjectRef rhs) const { diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectShortcuts.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectShortcuts.hpp index 0f3409f5f..0d704640e 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/ObjectShortcuts.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/ObjectShortcuts.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp index 44fce7518..e9e71eb63 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/alias_cast.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/alias_cast.hpp index 8f8e2770c..7030b7d90 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/alias_cast.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/alias_cast.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/assert.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/assert.hpp index f5fa94673..9b17ab455 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/assert.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/assert.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp index 8ef33afef..a4a330bbd 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp index bd7a8cc65..7a957b95f 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/integer.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/integer.hpp index 066c7b800..08708d57d 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/integer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/integer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/limits.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/limits.hpp index 68a2bf8a6..9c26b67a6 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/limits.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/limits.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp index eff272add..2b77c5c5f 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/mpl/max.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/mpl/max.hpp index 9ac47a53d..e3b09119c 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/mpl/max.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/mpl/max.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace.hpp index f253818e0..189251705 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace.hpp @@ -1,9 +1,11 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once +#include + #include #include #include @@ -12,7 +14,7 @@ namespace ARDUINOJSON_NAMESPACE { // Wraps a const char* so that the our functions are picked only if the // originals are missing struct pgm_p { - pgm_p(const char* p) : address(p) {} + pgm_p(const void* p) : address(reinterpret_cast(p)) {} const char* address; }; } // namespace ARDUINOJSON_NAMESPACE @@ -65,6 +67,22 @@ inline int strcmp_P(const char* a, ARDUINOJSON_NAMESPACE::pgm_p b) { } #endif +#ifndef memcmp_P +inline int memcmp_P(const void* a, ARDUINOJSON_NAMESPACE::pgm_p b, size_t n) { + const uint8_t* p1 = reinterpret_cast(a); + const char* p2 = b.address; + ARDUINOJSON_ASSERT(p1 != NULL); + ARDUINOJSON_ASSERT(p2 != NULL); + while (n-- > 0) { + uint8_t v1 = *p1++; + uint8_t v2 = pgm_read_byte(p2++); + if (v1 != v2) + return v1 - v2; + } + return 0; +} +#endif + #ifndef memcpy_P inline void* memcpy_P(void* dst, ARDUINOJSON_NAMESPACE::pgm_p src, size_t n) { uint8_t* d = reinterpret_cast(dst); @@ -77,3 +95,19 @@ inline void* memcpy_P(void* dst, ARDUINOJSON_NAMESPACE::pgm_p src, size_t n) { return dst; } #endif + +#ifndef pgm_read_dword +inline uint32_t pgm_read_dword(ARDUINOJSON_NAMESPACE::pgm_p p) { + uint32_t result; + memcpy_P(&result, p, 4); + return result; +} +#endif + +#ifndef pgm_read_ptr +inline void* pgm_read_ptr(ARDUINOJSON_NAMESPACE::pgm_p p) { + void* result; + memcpy_P(&result, p, sizeof(result)); + return result; +} +#endif diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace_generic.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace_generic.hpp index f5bbd85e5..d9e964b85 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace_generic.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace_generic.hpp @@ -1,10 +1,11 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include +#include #include namespace ARDUINOJSON_NAMESPACE { @@ -14,15 +15,6 @@ typename enable_if::value, T>::type pgm_read(const void* p) { return reinterpret_cast(pgm_read_ptr(p)); } -template -typename enable_if::value && - sizeof(T) == sizeof(float), // on AVR sizeof(double) == - // sizeof(float) - T>::type -pgm_read(const void* p) { - return pgm_read_float(p); -} - template typename enable_if::value, T>::type pgm_read( const void* p) { diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/preprocessor.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/preprocessor.hpp index 488654b21..c9b97c943 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/preprocessor.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/preprocessor.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/safe_strcmp.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/safe_strcmp.hpp deleted file mode 100644 index e017b5dda..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/safe_strcmp.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include - -#include // int8_t - -namespace ARDUINOJSON_NAMESPACE { - -inline int safe_strcmp(const char* a, const char* b) { - if (a == b) - return 0; - if (!a) - return -1; - if (!b) - return 1; - return strcmp(a, b); -} - -inline int safe_strncmp(const char* a, const char* b, size_t n) { - if (a == b) - return 0; - if (!a) - return -1; - if (!b) - return 1; - return strncmp(a, b, n); -} -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/static_array.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/static_array.hpp index b070628cc..b2ebbf6b2 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/static_array.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/static_array.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -10,25 +10,21 @@ # include -# ifndef ARDUINOJSON_DEFINE_STATIC_ARRAY -# define ARDUINOJSON_DEFINE_STATIC_ARRAY(type, name, value) \ +# ifndef ARDUINOJSON_DEFINE_PROGMEM_ARRAY +# define ARDUINOJSON_DEFINE_PROGMEM_ARRAY(type, name, value) \ static type const name[] PROGMEM = value; # endif -# ifndef ARDUINOJSON_READ_STATIC_ARRAY -# define ARDUINOJSON_READ_STATIC_ARRAY(type, name, index) \ - pgm_read(name + index) -# endif +# define ARDUINOJSON_DEFINE_STATIC_ARRAY ARDUINOJSON_DEFINE_PROGMEM_ARRAY + +# define ARDUINOJSON_READ_STATIC_ARRAY(type, name, index) \ + pgm_read(name + index) #else // i.e. ARDUINOJSON_ENABLE_PROGMEM == 0 -# ifndef ARDUINOJSON_DEFINE_STATIC_ARRAY -# define ARDUINOJSON_DEFINE_STATIC_ARRAY(type, name, value) \ - static type const name[] = value; -# endif +# define ARDUINOJSON_DEFINE_STATIC_ARRAY(type, name, value) \ + static type const name[] = value; -# ifndef ARDUINOJSON_READ_STATIC_ARRAY -# define ARDUINOJSON_READ_STATIC_ARRAY(type, name, index) name[index] -# endif +# define ARDUINOJSON_READ_STATIC_ARRAY(type, name, index) name[index] #endif diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits.hpp index 24440b196..f7afcb785 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/conditional.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/conditional.hpp index e42d1bb99..0f2dc5804 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/conditional.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/conditional.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/declval.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/declval.hpp index 87081123a..4dd5ed929 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/declval.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/declval.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/enable_if.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/enable_if.hpp index cc29b3375..3eec34cf5 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/enable_if.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/enable_if.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/integral_constant.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/integral_constant.hpp index b53d7111c..f2585392e 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/integral_constant.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/integral_constant.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_array.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_array.hpp index ee739a70a..935671d89 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_array.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_array.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_base_of.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_base_of.hpp index 32b41cd95..bb8a6508e 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_base_of.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_base_of.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_class.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_class.hpp index a3808f3a3..7722c5ffe 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_class.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_class.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_const.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_const.hpp index 32e758c98..f66d14208 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_const.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_const.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp index b3a073b83..cf6888efb 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_enum.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_enum.hpp index 26aec1de0..de6663a9d 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_enum.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_enum.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_floating_point.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_floating_point.hpp index fb42f0598..c725eb845 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_floating_point.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_floating_point.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_integral.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_integral.hpp index 65918cf9c..fc0da04ac 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_integral.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_integral.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_pointer.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_pointer.hpp index a24953964..8a99cdb60 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_pointer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_pointer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_same.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_same.hpp index db5da9bdf..956db6b42 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_same.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_same.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_signed.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_signed.hpp index 3e064e315..d6c7016a4 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_signed.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_signed.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_unsigned.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_unsigned.hpp index 57acff232..84b7d0511 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_unsigned.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_unsigned.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/make_unsigned.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/make_unsigned.hpp index 4cf2d08b8..f7fc37121 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/make_unsigned.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/make_unsigned.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/make_void.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/make_void.hpp index cb2ebde52..bd2d7448b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/make_void.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/make_void.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_const.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_const.hpp index 5a19eb18d..77fb438df 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_const.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_const.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_cv.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_cv.hpp index 021e0ec5c..64f6e109b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_cv.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_cv.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_reference.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_reference.hpp index 181285087..b63d1ae91 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_reference.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/remove_reference.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/type_identity.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/type_identity.hpp index c464a47c3..b797b517d 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/type_identity.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/type_identity.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/utility.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/utility.hpp deleted file mode 100644 index c99bc9919..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/utility.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include "type_traits.hpp" - -namespace ARDUINOJSON_NAMESPACE { -template -inline void swap(T& a, T& b) { - T t(a); - a = b; - b = t; -} - -#if ARDUINOJSON_HAS_RVALUE_REFERENCES -template -typename remove_reference::type&& move(T&& t) { - return static_cast::type&&>(t); -} -#else -template -T& move(T& t) { - return t; -} -#endif -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/CountingDecorator.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/CountingDecorator.hpp index 3d89fb1d6..6fc4689df 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/CountingDecorator.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/CountingDecorator.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writer.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writer.hpp index f9a979855..e69247c7f 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writer.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp index 5bb1ebd78..4990747b4 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/DummyWriter.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/DummyWriter.hpp index a26a1f1cf..430865e9d 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/DummyWriter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/DummyWriter.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/PrintWriter.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/PrintWriter.hpp index 13a64912c..cfac79fb0 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/PrintWriter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/PrintWriter.hpp @@ -1,9 +1,11 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once +#include + namespace ARDUINOJSON_NAMESPACE { template diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StaticStringWriter.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StaticStringWriter.hpp index 1a4213b83..4be265abb 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StaticStringWriter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StaticStringWriter.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StdStreamWriter.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StdStreamWriter.hpp index e08ba4d60..e77b445bc 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StdStreamWriter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StdStreamWriter.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp index c1f7cc00f..d5e8d49ab 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/measure.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/measure.hpp index 6d199944c..d1391277b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/measure.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/measure.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Serialization/serialize.hpp b/lib/ArduinoJson/src/ArduinoJson/Serialization/serialize.hpp index 16d2e4ef1..addb428da 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Serialization/serialize.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Serialization/serialize.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringCopier.hpp b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringCopier.hpp index 80670aad3..455a155a1 100644 --- a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringCopier.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringCopier.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -15,11 +15,14 @@ class StringCopier { void startString() { _pool->getFreeZone(&_ptr, &_capacity); _size = 0; + if (_capacity == 0) + _pool->markAsOverflowed(); } - const char* save() { + String save() { ARDUINOJSON_ASSERT(_ptr); - return _pool->saveStringFromFreeZone(_size); + ARDUINOJSON_ASSERT(_size < _capacity); // needs room for the terminator + return String(_pool->saveStringFromFreeZone(_size), _size, false); } void append(const char* s) { @@ -31,27 +34,26 @@ class StringCopier { } void append(char c) { - if (!_ptr) - return; - - if (_size >= _capacity) { - _ptr = 0; + if (_size + 1 < _capacity) + _ptr[_size++] = c; + else _pool->markAsOverflowed(); - return; - } - - _ptr[_size++] = c; } - bool isValid() { - return _ptr != 0; + bool isValid() const { + return !_pool->overflowed(); } - const char* c_str() { - return _ptr; + size_t size() const { + return _size; } - typedef storage_policies::store_by_copy storage_policy; + String str() const { + ARDUINOJSON_ASSERT(_ptr); + ARDUINOJSON_ASSERT(_size < _capacity); + _ptr[_size] = 0; + return String(_ptr, _size, false); + } private: MemoryPool* _pool; diff --git a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringMover.hpp b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringMover.hpp index f727a7d8f..4ed7d92e1 100644 --- a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringMover.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringMover.hpp @@ -1,11 +1,11 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include -#include +#include namespace ARDUINOJSON_NAMESPACE { @@ -17,8 +17,10 @@ class StringMover { _startPtr = _writePtr; } - const char* save() const { - return _startPtr; + FORCE_INLINE String save() { + String s = str(); + _writePtr++; + return s; } void append(char c) { @@ -29,11 +31,14 @@ class StringMover { return true; } - const char* c_str() const { - return _startPtr; + String str() const { + _writePtr[0] = 0; // terminator + return String(_startPtr, size(), true); } - typedef storage_policies::store_by_address storage_policy; + size_t size() const { + return size_t(_writePtr - _startPtr); + } private: char* _writePtr; diff --git a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringStorage.hpp b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringStorage.hpp index 36e632630..2c85cbf31 100644 --- a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringStorage.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringStorage.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp new file mode 100644 index 000000000..27977a6ae --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ArduinoString.hpp @@ -0,0 +1,24 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +inline SizedRamString adaptString(const ::String& s) { + return SizedRamString(s.c_str(), s.length()); +} + +template <> +struct IsString< ::String> : true_type {}; + +template <> +struct IsString< ::StringSumHelper> : true_type {}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ArduinoStringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ArduinoStringAdapter.hpp deleted file mode 100644 index 3d5204069..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ArduinoStringAdapter.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include - -#include -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -template <> -class StringAdapter< ::String> { - public: - StringAdapter(const ::String& str) : _str(&str) {} - - void copyTo(char* p, size_t n) const { - memcpy(p, _str->c_str(), n); - } - - bool isNull() const { - // Arduino's String::c_str() can return NULL - return !_str->c_str(); - } - - int compare(const char* other) const { - // Arduino's String::c_str() can return NULL - const char* me = _str->c_str(); - return safe_strcmp(me, other); - } - - size_t size() const { - return _str->length(); - } - - typedef storage_policies::store_by_copy storage_policy; - - private: - const ::String* _str; -}; - -template <> -class StringAdapter< ::StringSumHelper> : public StringAdapter< ::String> { - public: - StringAdapter(const ::String& s) : StringAdapter< ::String>(s) {} -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ConstRamStringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ConstRamStringAdapter.hpp deleted file mode 100644 index b4a696e25..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/ConstRamStringAdapter.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include // size_t -#include // strcmp - -#include -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -template <> -class StringAdapter { - public: - StringAdapter(const char* str = 0) : _str(str) {} - - int compare(const char* other) const { - return safe_strcmp(_str, other); - } - - bool isNull() const { - return !_str; - } - - size_t size() const { - if (!_str) - return 0; - return strlen(_str); - } - - const char* data() const { - return _str; - } - - typedef storage_policies::store_by_address storage_policy; - - protected: - const char* _str; -}; - -template -class StringAdapter : public StringAdapter { - public: - StringAdapter(const char* s) : StringAdapter(s) {} -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/FlashString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/FlashString.hpp new file mode 100644 index 000000000..048d7c18d --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/FlashString.hpp @@ -0,0 +1,80 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +class FlashString { + public: + static const size_t typeSortKey = 1; + + FlashString(const __FlashStringHelper* str, size_t sz) + : _str(reinterpret_cast(str)), _size(sz) {} + + bool isNull() const { + return !_str; + } + + char operator[](size_t i) const { + ARDUINOJSON_ASSERT(_str != 0); + ARDUINOJSON_ASSERT(i <= _size); + return static_cast(pgm_read_byte(_str + i)); + } + + size_t size() const { + return _size; + } + + friend bool stringEquals(FlashString a, SizedRamString b) { + ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); + ARDUINOJSON_ASSERT(!a.isNull()); + ARDUINOJSON_ASSERT(!b.isNull()); + if (a.size() != b.size()) + return false; + return ::memcmp_P(b.data(), a._str, a._size) == 0; + } + + friend int stringCompare(FlashString a, SizedRamString b) { + ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); + ARDUINOJSON_ASSERT(!a.isNull()); + ARDUINOJSON_ASSERT(!b.isNull()); + size_t minsize = a.size() < b.size() ? a.size() : b.size(); + int res = ::memcmp_P(b.data(), a._str, minsize); + if (res) + return -res; + if (a.size() < b.size()) + return -1; + if (a.size() > b.size()) + return 1; + return 0; + } + + friend void stringGetChars(FlashString s, char* p, size_t n) { + ARDUINOJSON_ASSERT(s.size() <= n); + ::memcpy_P(p, s._str, n); + } + + private: + const char* _str; + size_t _size; +}; + +inline FlashString adaptString(const __FlashStringHelper* s) { + return FlashString(s, s ? strlen_P(reinterpret_cast(s)) : 0); +} + +inline FlashString adaptString(const __FlashStringHelper* s, size_t n) { + return FlashString(s, n); +} + +template <> +struct IsString : true_type {}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/FlashStringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/FlashStringAdapter.hpp deleted file mode 100644 index 3a958181d..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/FlashStringAdapter.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -template <> -class StringAdapter { - public: - StringAdapter(const __FlashStringHelper* str) : _str(str) {} - - int compare(const char* other) const { - if (!other && !_str) - return 0; - if (!_str) - return -1; - if (!other) - return 1; - return -strcmp_P(other, reinterpret_cast(_str)); - } - - bool isNull() const { - return !_str; - } - - void copyTo(char* p, size_t n) const { - memcpy_P(p, reinterpret_cast(_str), n); - } - - size_t size() const { - if (!_str) - return 0; - return strlen_P(reinterpret_cast(_str)); - } - - typedef storage_policies::store_by_copy storage_policy; - - private: - const __FlashStringHelper* _str; -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/JsonString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/JsonString.hpp new file mode 100644 index 000000000..fac729f68 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/JsonString.hpp @@ -0,0 +1,20 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +inline SizedRamString adaptString(const String& s) { + return SizedRamString(s.c_str(), s.size()); +} + +template <> +struct IsString : true_type {}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/JsonStringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/JsonStringAdapter.hpp deleted file mode 100644 index c34abce5e..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/JsonStringAdapter.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -template <> -class StringAdapter : public StringAdapter { - public: - StringAdapter(const String& str) - : StringAdapter(str.c_str()), _isStatic(str.isStatic()) {} - - bool isStatic() const { - return _isStatic; - } - - typedef storage_policies::decide_at_runtime storage_policy; - - private: - bool _isStatic; -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamString.hpp new file mode 100644 index 000000000..1d3991615 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamString.hpp @@ -0,0 +1,119 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include // size_t +#include // strcmp + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +class ZeroTerminatedRamString { + public: + static const size_t typeSortKey = 3; + + ZeroTerminatedRamString(const char* str) : _str(str) {} + + bool isNull() const { + return !_str; + } + + size_t size() const { + return _str ? ::strlen(_str) : 0; + } + + char operator[](size_t i) const { + ARDUINOJSON_ASSERT(_str != 0); + ARDUINOJSON_ASSERT(i <= size()); + return _str[i]; + } + + const char* data() const { + return _str; + } + + friend int stringCompare(ZeroTerminatedRamString a, + ZeroTerminatedRamString b) { + ARDUINOJSON_ASSERT(!a.isNull()); + ARDUINOJSON_ASSERT(!b.isNull()); + return ::strcmp(a._str, b._str); + } + + friend bool stringEquals(ZeroTerminatedRamString a, + ZeroTerminatedRamString b) { + return stringCompare(a, b) == 0; + } + + protected: + const char* _str; +}; + +template <> +struct IsString : true_type {}; + +inline ZeroTerminatedRamString adaptString(const char* s) { + return ZeroTerminatedRamString(s); +} + +template <> +struct IsString : true_type {}; + +inline ZeroTerminatedRamString adaptString(const unsigned char* s) { + return adaptString(reinterpret_cast(s)); +} + +template <> +struct IsString : true_type {}; + +inline ZeroTerminatedRamString adaptString(const signed char* s) { + return adaptString(reinterpret_cast(s)); +} + +class SizedRamString { + public: + static const size_t typeSortKey = 2; + + SizedRamString(const char* str, size_t sz) : _str(str), _size(sz) {} + + bool isNull() const { + return !_str; + } + + size_t size() const { + return _size; + } + + char operator[](size_t i) const { + ARDUINOJSON_ASSERT(_str != 0); + ARDUINOJSON_ASSERT(i <= size()); + return _str[i]; + } + + const char* data() const { + return _str; + } + + protected: + const char* _str; + size_t _size; +}; + +inline SizedRamString adaptString(const char* s, size_t n) { + return SizedRamString(s, n); +} + +template +struct IsString : true_type {}; + +template +struct IsString : true_type {}; + +template +inline SizedRamString adaptString(char s[N]) { + return SizedRamString(s, strlen(s)); +} +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamStringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamStringAdapter.hpp deleted file mode 100644 index f2b01d171..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamStringAdapter.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -template -class StringAdapter::value>::type> - : public StringAdapter { - public: - StringAdapter(const TChar* str) - : StringAdapter(reinterpret_cast(str)) {} - - void copyTo(char* p, size_t n) const { - memcpy(p, _str, n); - } - - typedef ARDUINOJSON_NAMESPACE::storage_policies::store_by_copy storage_policy; -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/SizedFlashStringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/SizedFlashStringAdapter.hpp deleted file mode 100644 index b2d012fce..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/SizedFlashStringAdapter.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -template <> -class StringAdapter { - public: - StringAdapter(const __FlashStringHelper* str, size_t sz) - : _str(str), _size(sz) {} - - int compare(const char* other) const { - if (!other && !_str) - return 0; - if (!_str) - return -1; - if (!other) - return 1; - return -strncmp_P(other, reinterpret_cast(_str), _size); - } - - bool isNull() const { - return !_str; - } - - void copyTo(char* p, size_t n) const { - memcpy_P(p, reinterpret_cast(_str), n); - } - - size_t size() const { - return _size; - } - - typedef storage_policies::store_by_copy storage_policy; - - private: - const __FlashStringHelper* _str; - size_t _size; -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/SizedRamStringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/SizedRamStringAdapter.hpp deleted file mode 100644 index a18d5ab92..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/SizedRamStringAdapter.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include -#include -#include - -#include // strcmp - -namespace ARDUINOJSON_NAMESPACE { - -template -class StringAdapter { - public: - StringAdapter(const char* str, size_t n) : _str(str), _size(n) {} - - int compare(const char* other) const { - return safe_strncmp(_str, other, _size); - } - - bool isNull() const { - return !_str; - } - - void copyTo(char* p, size_t n) const { - memcpy(p, _str, n); - } - - size_t size() const { - return _size; - } - - typedef storage_policies::store_by_copy storage_policy; - - private: - const char* _str; - size_t _size; -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StdString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StdString.hpp new file mode 100644 index 000000000..9802606f1 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StdString.hpp @@ -0,0 +1,23 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include + +#include + +namespace ARDUINOJSON_NAMESPACE { + +template +inline SizedRamString adaptString( + const std::basic_string& s) { + return SizedRamString(s.c_str(), s.size()); +} + +template +struct IsString > : true_type { +}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StdStringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StdStringAdapter.hpp deleted file mode 100644 index 4d2d32c52..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StdStringAdapter.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include -#include -#include - -#include - -namespace ARDUINOJSON_NAMESPACE { - -template -class StringAdapter > { - public: - typedef std::basic_string string_type; - - StringAdapter(const string_type& str) : _str(&str) {} - - void copyTo(char* p, size_t n) const { - memcpy(p, _str->c_str(), n); - } - - bool isNull() const { - return false; - } - - int compare(const char* other) const { - if (!other) - return 1; - return _str->compare(other); - } - - size_t size() const { - return _str->size(); - } - - typedef storage_policies::store_by_copy storage_policy; - - private: - const string_type* _str; -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StringView.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StringView.hpp new file mode 100644 index 000000000..2f431ac20 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StringView.hpp @@ -0,0 +1,20 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include + +#include + +namespace ARDUINOJSON_NAMESPACE { + +inline SizedRamString adaptString(const std::string_view& s) { + return SizedRamString(s.data(), s.size()); +} + +template <> +struct IsString : true_type {}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StringViewAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StringViewAdapter.hpp deleted file mode 100644 index 787f7c21f..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/StringViewAdapter.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include -#include -#include - -#include - -namespace ARDUINOJSON_NAMESPACE { - -template <> -class StringAdapter { - public: - StringAdapter(std::string_view str) : _str(str) {} - - void copyTo(char* p, size_t n) const { - memcpy(p, _str.data(), n); - } - - bool isNull() const { - return false; - } - - int compare(const char* other) const { - if (!other) - return 1; - return _str.compare(other); - } - - size_t size() const { - return _str.size(); - } - - typedef storage_policies::store_by_copy storage_policy; - - private: - std::string_view _str; -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/IsString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/IsString.hpp new file mode 100644 index 000000000..077b1660a --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/IsString.hpp @@ -0,0 +1,17 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include + +namespace ARDUINOJSON_NAMESPACE { + +template +struct IsString : false_type {}; + +template +struct IsString : IsString {}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/IsWriteableString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/IsWriteableString.hpp deleted file mode 100644 index 556c4765a..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/IsWriteableString.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include -#include - -#if ARDUINOJSON_ENABLE_ARDUINO_STRING -# include -#endif - -#if ARDUINOJSON_ENABLE_STD_STRING -# include -#endif - -namespace ARDUINOJSON_NAMESPACE { - -template -struct IsWriteableString : false_type {}; - -#if ARDUINOJSON_ENABLE_ARDUINO_STRING - -template <> -struct IsWriteableString< ::String> : true_type {}; - -#endif - -#if ARDUINOJSON_ENABLE_STD_STRING - -template -struct IsWriteableString > - : true_type {}; - -#endif -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/StoragePolicy.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/StoragePolicy.hpp index df0d62b4a..2a01f0d5a 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/StoragePolicy.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/StoragePolicy.hpp @@ -1,15 +1,56 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once +#include +#include + namespace ARDUINOJSON_NAMESPACE { -namespace storage_policies { -struct store_by_address {}; -struct store_by_copy {}; -struct decide_at_runtime {}; -} // namespace storage_policies +struct LinkStringStoragePolicy { + template + bool store(TAdaptedString str, MemoryPool *, TCallback callback) { + String storedString(str.data(), str.size(), true); + callback(storedString); + return !str.isNull(); + } +}; + +struct CopyStringStoragePolicy { + template + bool store(TAdaptedString str, MemoryPool *pool, TCallback callback); +}; + +class LinkOrCopyStringStoragePolicy : LinkStringStoragePolicy, + CopyStringStoragePolicy { + public: + LinkOrCopyStringStoragePolicy(bool link) : _link(link) {} + + template + bool store(TAdaptedString str, MemoryPool *pool, TCallback callback) { + if (_link) + return LinkStringStoragePolicy::store(str, pool, callback); + else + return CopyStringStoragePolicy::store(str, pool, callback); + } + + private: + bool _link; +}; + +template +inline CopyStringStoragePolicy getStringStoragePolicy(const T &) { + return CopyStringStoragePolicy(); +} + +inline LinkStringStoragePolicy getStringStoragePolicy(const char *) { + return LinkStringStoragePolicy(); +} + +inline LinkOrCopyStringStoragePolicy getStringStoragePolicy(const String &s) { + return LinkOrCopyStringStoragePolicy(s.isStatic()); +} } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/StoredString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/StoredString.hpp new file mode 100644 index 000000000..53e874685 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/StoredString.hpp @@ -0,0 +1,35 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +namespace ARDUINOJSON_NAMESPACE { + +template +class StoredString { + public: + StoredString() : _data(0), _size(0) {} + StoredString(const char* p, size_t n) : _data(p), _size(n) {} + + operator const char*() const { + return _data; + } + + const char* c_str() const { + return _data; + } + + size_t size() const { + return _size; + } + + private: + const char* _data; + size_t _size; +}; + +typedef StoredString LinkedString; +typedef StoredString CopiedString; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/String.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/String.hpp index fff4077d9..1c71c67ae 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/String.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/String.hpp @@ -1,16 +1,28 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once +#include + +#if ARDUINOJSON_ENABLE_STD_STREAM +# include +#endif + namespace ARDUINOJSON_NAMESPACE { -class String { +class String : public SafeBoolIdom { public: - String() : _data(0), _isStatic(true) {} + String() : _data(0), _size(0), _isStatic(true) {} + String(const char* data, bool isStaticData = true) - : _data(data), _isStatic(isStaticData) {} + : _data(data), + _size(data ? ::strlen(data) : 0), + _isStatic(isStaticData) {} + + String(const char* data, size_t sz, bool isStaticData = true) + : _data(data), _size(sz), _isStatic(isStaticData) {} const char* c_str() const { return _data; @@ -24,6 +36,15 @@ class String { return _isStatic; } + size_t size() const { + return _size; + } + + // safe bool idiom + operator bool_type() const { + return _data ? safe_true() : safe_false(); + } + friend bool operator==(String lhs, String rhs) { if (lhs._data == rhs._data) return true; @@ -44,8 +65,16 @@ class String { return strcmp(lhs._data, rhs._data) != 0; } +#if ARDUINOJSON_ENABLE_STD_STREAM + friend std::ostream& operator<<(std::ostream& lhs, const String& rhs) { + lhs.write(rhs.c_str(), static_cast(rhs.size())); + return lhs; + } +#endif + private: const char* _data; + size_t _size; bool _isStatic; }; diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapter.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapter.hpp deleted file mode 100644 index 1d55b2123..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapter.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 -// MIT License - -#pragma once - -#include - -namespace ARDUINOJSON_NAMESPACE { - -template -class StringAdapter; - -template -inline StringAdapter adaptString(const T& str) { - return StringAdapter(str); -} - -template -inline StringAdapter adaptString(const T& str, size_t sz) { - return StringAdapter(str, sz); -} - -template -struct IsString : false_type {}; - -template -struct IsString< - T, typename make_void::storage_policy>::type> - : true_type {}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapters.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapters.hpp index ba763a67f..0be5cd901 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapters.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapters.hpp @@ -1,27 +1,88 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once -#include -#include -#include -#include +#include +#include +#include #if ARDUINOJSON_ENABLE_STD_STRING -# include +# include #endif #if ARDUINOJSON_ENABLE_STRING_VIEW -# include +# include #endif #if ARDUINOJSON_ENABLE_ARDUINO_STRING -# include +# include #endif #if ARDUINOJSON_ENABLE_PROGMEM -# include -# include +# include #endif + +namespace ARDUINOJSON_NAMESPACE { + +template +typename enable_if::type +stringCompare(TAdaptedString1 s1, TAdaptedString2 s2) { + ARDUINOJSON_ASSERT(!s1.isNull()); + ARDUINOJSON_ASSERT(!s2.isNull()); + size_t size1 = s1.size(); + size_t size2 = s2.size(); + size_t n = size1 < size2 ? size1 : size2; + for (size_t i = 0; i < n; i++) { + if (s1[i] != s2[i]) + return s1[i] - s2[i]; + } + if (size1 < size2) + return -1; + if (size1 > size2) + return 1; + return 0; +} + +template +typename enable_if< + (TAdaptedString1::typeSortKey > TAdaptedString2::typeSortKey), int>::type +stringCompare(TAdaptedString1 s1, TAdaptedString2 s2) { + return -stringCompare(s2, s1); +} + +template +typename enable_if::type +stringEquals(TAdaptedString1 s1, TAdaptedString2 s2) { + ARDUINOJSON_ASSERT(!s1.isNull()); + ARDUINOJSON_ASSERT(!s2.isNull()); + size_t size1 = s1.size(); + size_t size2 = s2.size(); + if (size1 != size2) + return false; + for (size_t i = 0; i < size1; i++) { + if (s1[i] != s2[i]) + return false; + } + return true; +} + +template +typename enable_if< + (TAdaptedString1::typeSortKey > TAdaptedString2::typeSortKey), bool>::type +stringEquals(TAdaptedString1 s1, TAdaptedString2 s2) { + return stringEquals(s2, s1); +} + +template +static void stringGetChars(TAdaptedString s, char* p, size_t n) { + ARDUINOJSON_ASSERT(s.size() <= n); + for (size_t i = 0; i < n; i++) { + p[i] = s[i]; + } +} + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/Converter.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/Converter.hpp index 88afa526d..f9ce9ab7a 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/Converter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/Converter.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/ConverterImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/ConverterImpl.hpp index e3288c8bf..a825760c9 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -1,10 +1,10 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once -#include +#include #include #include @@ -115,10 +115,29 @@ struct Converter::value>::type> { template <> struct Converter { static void toJson(const char* src, VariantRef dst) { - variantSetString(getData(dst), adaptString(src), getPool(dst)); + variantSetString(getData(dst), adaptString(src), getPool(dst), + getStringStoragePolicy(src)); } static const char* fromJson(VariantConstRef src) { + const VariantData* data = getData(src); + return data ? data->asString().c_str() : 0; + } + + static bool checkJson(VariantConstRef src) { + const VariantData* data = getData(src); + return data && data->isString(); + } +}; + +template <> +struct Converter { + static void toJson(String src, VariantRef dst) { + variantSetString(getData(dst), adaptString(src), getPool(dst), + getStringStoragePolicy(src)); + } + + static String fromJson(VariantConstRef src) { const VariantData* data = getData(src); return data ? data->asString() : 0; } @@ -134,25 +153,8 @@ inline typename enable_if::value, bool>::type convertToJson( const T& src, VariantRef dst) { VariantData* data = getData(dst); MemoryPool* pool = getPool(dst); - return variantSetString(data, adaptString(src), pool); -} - -template -inline typename enable_if::value>::type convertFromJson( - VariantConstRef src, T& dst) { - const VariantData* data = getData(src); - const char* cstr = data != 0 ? data->asString() : 0; - if (cstr) - dst = cstr; - else - serializeJson(src, dst); -} - -template -inline typename enable_if::value, bool>::type -canConvertFromJson(VariantConstRef src, const T&) { - const VariantData* data = getData(src); - return data && data->isString(); + return variantSetString(data, adaptString(src), pool, + getStringStoragePolicy(src)); } template <> @@ -174,7 +176,7 @@ struct Converter, VariantData* data = getData(dst); MemoryPool* pool = getPool(dst); if (data) - data->setOwnedRaw(src, pool); + data->storeOwnedRaw(src, pool); } }; @@ -204,10 +206,9 @@ class MemoryPoolPrint : public Print { pool->getFreeZone(&_string, &_capacity); } - const char* c_str() { - _string[_size++] = 0; - ARDUINOJSON_ASSERT(_size <= _capacity); - return _pool->saveStringFromFreeZone(_size); + String str() { + ARDUINOJSON_ASSERT(_size < _capacity); + return String(_pool->saveStringFromFreeZone(_size), _size, false); } size_t write(uint8_t c) { @@ -251,7 +252,39 @@ inline void convertToJson(const ::Printable& src, VariantRef dst) { data->setNull(); return; } - data->setStringPointer(print.c_str(), storage_policies::store_by_copy()); + data->setString(print.str()); +} + +#endif + +#if ARDUINOJSON_ENABLE_ARDUINO_STRING + +inline void convertFromJson(VariantConstRef src, ::String& dst) { + String str = src.as(); + if (str) + dst = str.c_str(); + else + serializeJson(src, dst); +} + +inline bool canConvertFromJson(VariantConstRef src, const ::String&) { + return src.is(); +} + +#endif + +#if ARDUINOJSON_ENABLE_STD_STRING + +inline void convertFromJson(VariantConstRef src, std::string& dst) { + String str = src.as(); + if (str) + dst.assign(str.c_str(), str.size()); + else + serializeJson(src, dst); +} + +inline bool canConvertFromJson(VariantConstRef src, const std::string&) { + return src.is(); } #endif @@ -259,13 +292,13 @@ inline void convertToJson(const ::Printable& src, VariantRef dst) { #if ARDUINOJSON_ENABLE_STRING_VIEW inline void convertFromJson(VariantConstRef src, std::string_view& dst) { - const char* str = src.as(); + String str = src.as(); if (str) // the standard doesn't allow passing null to the constructor - dst = std::string_view(str); + dst = std::string_view(str.c_str(), str.size()); } inline bool canConvertFromJson(VariantConstRef src, const std::string_view&) { - return src.is(); + return src.is(); } #endif diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/SlotFunctions.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/SlotFunctions.hpp index 74ac5a78e..9119a4602 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/SlotFunctions.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/SlotFunctions.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -9,40 +9,26 @@ namespace ARDUINOJSON_NAMESPACE { -template -inline bool slotSetKey(VariantSlot* var, TAdaptedString key, MemoryPool* pool) { +struct SlotKeySetter { + SlotKeySetter(VariantSlot* instance) : _instance(instance) {} + + template + void operator()(TStoredString s) { + if (!s) + return; + ARDUINOJSON_ASSERT(_instance != 0); + _instance->setKey(s); + } + + VariantSlot* _instance; +}; + +template +inline bool slotSetKey(VariantSlot* var, TAdaptedString key, MemoryPool* pool, + TStoragePolicy storage) { if (!var) return false; - return slotSetKey(var, key, pool, typename TAdaptedString::storage_policy()); -} - -template -inline bool slotSetKey(VariantSlot* var, TAdaptedString key, MemoryPool* pool, - storage_policies::decide_at_runtime) { - if (key.isStatic()) { - return slotSetKey(var, key, pool, storage_policies::store_by_address()); - } else { - return slotSetKey(var, key, pool, storage_policies::store_by_copy()); - } -} - -template -inline bool slotSetKey(VariantSlot* var, TAdaptedString key, MemoryPool*, - storage_policies::store_by_address) { - ARDUINOJSON_ASSERT(var); - var->setKey(key.data(), storage_policies::store_by_address()); - return true; -} - -template -inline bool slotSetKey(VariantSlot* var, TAdaptedString key, MemoryPool* pool, - storage_policies::store_by_copy) { - const char* dup = pool->saveString(key); - if (!dup) - return false; - ARDUINOJSON_ASSERT(var); - var->setKey(dup, storage_policies::store_by_copy()); - return true; + return storage.store(key, pool, SlotKeySetter(var)); } inline size_t slotSize(const VariantSlot* var) { diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp index 4e0471a60..43ae70c93 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include namespace ARDUINOJSON_NAMESPACE { @@ -27,8 +27,8 @@ struct Comparer::value>::type> explicit Comparer(T value) : rhs(value) {} - CompareResult visitString(const char *lhs) { - int i = adaptString(rhs).compare(lhs); + CompareResult visitString(const char *lhs, size_t n) { + int i = stringCompare(adaptString(rhs), adaptString(lhs, n)); if (i < 0) return COMPARE_RESULT_GREATER; else if (i > 0) @@ -150,7 +150,7 @@ struct Comparer::value>::type> return accept(comparer); } - CompareResult visitString(const char *lhs) { + CompareResult visitString(const char *lhs, size_t) { Comparer comparer(lhs); return accept(comparer); } diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantContent.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantContent.hpp index 295261133..dbe833e5b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantContent.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantContent.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -49,10 +49,9 @@ union VariantContent { UInt asUnsignedInteger; Integer asSignedInteger; CollectionData asCollection; - const char *asString; struct { const char *data; size_t size; - } asRaw; + } asString; }; } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp index 388b7e251..6f8076323 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -50,11 +51,13 @@ class VariantData { case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: - return visitor.visitString(_content.asString); + return visitor.visitString(_content.asString.data, + _content.asString.size); case VALUE_IS_OWNED_RAW: case VALUE_IS_LINKED_RAW: - return visitor.visitRawJson(_content.asRaw.data, _content.asRaw.size); + return visitor.visitRawJson(_content.asString.data, + _content.asString.size); case VALUE_IS_SIGNED_INTEGER: return visitor.visitSignedInteger(_content.asSignedInteger); @@ -76,7 +79,7 @@ class VariantData { template T asFloat() const; - const char *asString() const; + String asString() const; bool asBoolean() const; @@ -96,24 +99,7 @@ class VariantData { return const_cast(this)->asObject(); } - bool copyFrom(const VariantData &src, MemoryPool *pool) { - switch (src.type()) { - case VALUE_IS_ARRAY: - return toArray().copyFrom(src._content.asCollection, pool); - case VALUE_IS_OBJECT: - return toObject().copyFrom(src._content.asCollection, pool); - case VALUE_IS_OWNED_STRING: - return setString(adaptString(const_cast(src._content.asString)), - pool); - case VALUE_IS_OWNED_RAW: - return setOwnedRaw( - serialized(src._content.asRaw.data, src._content.asRaw.size), pool); - default: - setType(src.type()); - _content = src._content; - return true; - } - } + bool copyFrom(const VariantData &src, MemoryPool *pool); bool isArray() const { return (_flags & VALUE_IS_ARRAY) != 0; @@ -185,20 +171,20 @@ class VariantData { void setLinkedRaw(SerializedValue value) { if (value.data()) { setType(VALUE_IS_LINKED_RAW); - _content.asRaw.data = value.data(); - _content.asRaw.size = value.size(); + _content.asString.data = value.data(); + _content.asString.size = value.size(); } else { setType(VALUE_IS_NULL); } } template - bool setOwnedRaw(SerializedValue value, MemoryPool *pool) { + bool storeOwnedRaw(SerializedValue value, MemoryPool *pool) { const char *dup = pool->saveString(adaptString(value.data(), value.size())); if (dup) { setType(VALUE_IS_OWNED_RAW); - _content.asRaw.data = dup; - _content.asRaw.size = value.size(); + _content.asString.data = dup; + _content.asString.size = value.size(); return true; } else { setType(VALUE_IS_NULL); @@ -222,21 +208,14 @@ class VariantData { setType(VALUE_IS_NULL); } - void setStringPointer(const char *s, storage_policies::store_by_copy) { - ARDUINOJSON_ASSERT(s != 0); - setType(VALUE_IS_OWNED_STRING); - _content.asString = s; - } - - void setStringPointer(const char *s, storage_policies::store_by_address) { - ARDUINOJSON_ASSERT(s != 0); - setType(VALUE_IS_LINKED_STRING); - _content.asString = s; - } - - template - bool setString(TAdaptedString value, MemoryPool *pool) { - return storeString(value, pool, typename TAdaptedString::storage_policy()); + void setString(String s) { + ARDUINOJSON_ASSERT(s); + if (s.isStatic()) + setType(VALUE_IS_LINKED_STRING); + else + setType(VALUE_IS_OWNED_STRING); + _content.asString.data = s.c_str(); + _content.asString.size = s.size(); } CollectionData &toArray() { @@ -254,9 +233,10 @@ class VariantData { size_t memoryUsage() const { switch (type()) { case VALUE_IS_OWNED_STRING: - return strlen(_content.asString) + 1; case VALUE_IS_OWNED_RAW: - return _content.asRaw.size; + // We always add a zero at the end: the deduplication function uses it + // to detect the beginning of the next string. + return _content.asString.size + 1; case VALUE_IS_OBJECT: case VALUE_IS_ARRAY: return _content.asCollection.memoryUsage(); @@ -298,18 +278,19 @@ class VariantData { return isObject() ? _content.asCollection.getMember(key) : 0; } - template - VariantData *getOrAddMember(TAdaptedString key, MemoryPool *pool) { + template + VariantData *getOrAddMember(TAdaptedString key, MemoryPool *pool, + TStoragePolicy storage_policy) { if (isNull()) toObject(); if (!isObject()) return 0; - return _content.asCollection.getOrAddMember(key, pool); + return _content.asCollection.getOrAddMember(key, pool, storage_policy); } void movePointers(ptrdiff_t stringDistance, ptrdiff_t variantDistance) { if (_flags & OWNED_VALUE_BIT) - _content.asString += stringDistance; + _content.asString.data += stringDistance; if (_flags & COLLECTION_MASK) _content.asCollection.movePointers(stringDistance, variantDistance); } @@ -318,46 +299,36 @@ class VariantData { return _flags & VALUE_MASK; } + template + inline bool storeString(TAdaptedString value, MemoryPool *pool, + TStoragePolicy storage) { + if (value.isNull()) { + setNull(); + return true; + } + + return storage.store(value, pool, VariantStringSetter(this)); + } + private: void setType(uint8_t t) { _flags &= OWNED_KEY_BIT; _flags |= t; } - template - inline bool storeString(TAdaptedString value, MemoryPool *pool, - storage_policies::decide_at_runtime) { - if (value.isStatic()) - return storeString(value, pool, storage_policies::store_by_address()); - else - return storeString(value, pool, storage_policies::store_by_copy()); - } + struct VariantStringSetter { + VariantStringSetter(VariantData *instance) : _instance(instance) {} - template - inline bool storeString(TAdaptedString value, MemoryPool *, - storage_policies::store_by_address) { - if (value.isNull()) - setNull(); - else - setStringPointer(value.data(), storage_policies::store_by_address()); - return true; - } + template + void operator()(TStoredString s) { + if (s) + _instance->setString(s); + else + _instance->setNull(); + } - template - inline bool storeString(TAdaptedString value, MemoryPool *pool, - storage_policies::store_by_copy) { - if (value.isNull()) { - setNull(); - return true; - } - const char *copy = pool->saveString(value); - if (!copy) { - setNull(); - return false; - } - setStringPointer(copy, storage_policies::store_by_copy()); - return true; - } + VariantData *_instance; + }; }; } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantFunctions.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantFunctions.hpp index 3fc9cbbce..8890597e5 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantFunctions.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantFunctions.hpp @@ -1,10 +1,11 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include +#include #include namespace ARDUINOJSON_NAMESPACE { @@ -49,12 +50,10 @@ inline void variantSetNull(VariantData *var) { var->setNull(); } -template +template inline bool variantSetString(VariantData *var, TAdaptedString value, - MemoryPool *pool) { - if (!var) - return false; - return var->setString(value, pool); + MemoryPool *pool, TStoragePolicy storage_policy) { + return var != 0 ? var->storeString(value, pool, storage_policy) : 0; } inline size_t variantSize(const VariantData *var) { @@ -87,14 +86,20 @@ inline NO_INLINE VariantData *variantGetOrAddElement(VariantData *var, template NO_INLINE VariantData *variantGetOrAddMember(VariantData *var, TChar *key, MemoryPool *pool) { - return var != 0 ? var->getOrAddMember(adaptString(key), pool) : 0; + if (!var) + return 0; + return var->getOrAddMember(adaptString(key), pool, + getStringStoragePolicy(key)); } template NO_INLINE VariantData *variantGetOrAddMember(VariantData *var, const TString &key, MemoryPool *pool) { - return var != 0 ? var->getOrAddMember(adaptString(key), pool) : 0; + if (!var) + return 0; + return var->getOrAddMember(adaptString(key), pool, + getStringStoragePolicy(key)); } inline bool variantIsNull(const VariantData *var) { diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp index ea49a92f6..f45b2b7d0 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -26,7 +26,7 @@ inline T VariantData::asIntegral() const { return convertNumber(_content.asSignedInteger); case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: - return parseNumber(_content.asString); + return parseNumber(_content.asString.data); case VALUE_IS_FLOAT: return convertNumber(_content.asFloat); default: @@ -62,7 +62,7 @@ inline T VariantData::asFloat() const { return static_cast(_content.asSignedInteger); case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: - return parseNumber(_content.asString); + return parseNumber(_content.asString.data); case VALUE_IS_FLOAT: return static_cast(_content.asFloat); default: @@ -70,13 +70,36 @@ inline T VariantData::asFloat() const { } } -inline const char *VariantData::asString() const { +inline String VariantData::asString() const { switch (type()) { case VALUE_IS_LINKED_STRING: + return String(_content.asString.data, _content.asString.size, true); case VALUE_IS_OWNED_STRING: - return _content.asString; + return String(_content.asString.data, _content.asString.size, false); default: - return 0; + return String(); + } +} + +inline bool VariantData::copyFrom(const VariantData &src, MemoryPool *pool) { + switch (src.type()) { + case VALUE_IS_ARRAY: + return toArray().copyFrom(src._content.asCollection, pool); + case VALUE_IS_OBJECT: + return toObject().copyFrom(src._content.asCollection, pool); + case VALUE_IS_OWNED_STRING: { + String value = src.asString(); + return storeString(adaptString(value), pool, + getStringStoragePolicy(value)); + } + case VALUE_IS_OWNED_RAW: + return storeOwnedRaw( + serialized(src._content.asString.data, src._content.asString.size), + pool); + default: + setType(src.type()); + _content = src._content; + return true; } } @@ -145,4 +168,14 @@ inline VariantConstRef operator|(VariantConstRef preferedValue, inline bool VariantRef::set(char value) const { return set(value); } + +template +bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool, + TCallback callback) { + const char *copy = pool->saveString(str); + String storedString(copy, str.size(), false); + callback(storedString); + return copy != 0; +} + } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantOperators.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantOperators.hpp index 54174a4ca..a56c53aa7 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantOperators.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantOperators.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -17,7 +17,7 @@ CompareResult compare(const T1 &lhs, const T2 &rhs); // VariantCompare.cpp template struct VariantOperators { - // Returns the default value if the VariantRef is undefined or incompatible + // Returns the default value if the VariantRef is unbound or incompatible // // int operator|(JsonVariant, int) // float operator|(JsonVariant, float) diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp index b05ed90ca..0865d6935 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -32,7 +32,7 @@ class VariantRefBase : public VariantTag { return variantIsNull(_data); } - FORCE_INLINE bool isUndefined() const { + FORCE_INLINE bool isUnbound() const { return !_data; } diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantShortcuts.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantShortcuts.hpp index e62847f9d..3b324832d 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantShortcuts.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantShortcuts.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantSlot.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantSlot.hpp index a271c1eea..8f4169cc7 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantSlot.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantSlot.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -7,7 +7,6 @@ #include #include #include -#include #include namespace ARDUINOJSON_NAMESPACE { @@ -77,16 +76,13 @@ class VariantSlot { _next = VariantSlotDiff(slot - this); } - void setKey(const char* k, storage_policies::store_by_copy) { - ARDUINOJSON_ASSERT(k != NULL); - _flags |= OWNED_KEY_BIT; - _key = k; - } - - void setKey(const char* k, storage_policies::store_by_address) { - ARDUINOJSON_ASSERT(k != NULL); - _flags &= VALUE_MASK; - _key = k; + void setKey(String k) { + ARDUINOJSON_ASSERT(k); + if (k.isStatic()) + _flags &= VALUE_MASK; + else + _flags |= OWNED_KEY_BIT; + _key = k.c_str(); } const char* key() const { @@ -107,7 +103,7 @@ class VariantSlot { if (_flags & OWNED_KEY_BIT) _key += stringDistance; if (_flags & OWNED_VALUE_BIT) - _content.asString += stringDistance; + _content.asString.data += stringDistance; if (_flags & COLLECTION_MASK) _content.asCollection.movePointers(stringDistance, variantDistance); } diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantTag.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantTag.hpp index 71641647e..94ec38b9f 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantTag.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantTag.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantTo.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantTo.hpp index 352ecba04..932977f78 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantTo.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantTo.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/Visitor.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/Visitor.hpp index 33237dd27..778f81c12 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/Visitor.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/Visitor.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once @@ -46,7 +46,7 @@ struct Visitor { return TResult(); } - TResult visitString(const char *) { + TResult visitString(const char *, size_t) { return TResult(); } }; diff --git a/lib/ArduinoJson/src/ArduinoJson/compatibility.hpp b/lib/ArduinoJson/src/ArduinoJson/compatibility.hpp index cca477e3c..ca178a271 100644 --- a/lib/ArduinoJson/src/ArduinoJson/compatibility.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/compatibility.hpp @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License // // clang-format off diff --git a/lib/ArduinoJson/src/ArduinoJson/version.hpp b/lib/ArduinoJson/src/ArduinoJson/version.hpp index 2ad469206..0b4b5febf 100644 --- a/lib/ArduinoJson/src/ArduinoJson/version.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/version.hpp @@ -1,10 +1,10 @@ // ArduinoJson - https://arduinojson.org -// Copyright Benoit Blanchon 2014-2021 +// Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once -#define ARDUINOJSON_VERSION "6.18.4" +#define ARDUINOJSON_VERSION "6.19.1" #define ARDUINOJSON_VERSION_MAJOR 6 -#define ARDUINOJSON_VERSION_MINOR 18 -#define ARDUINOJSON_VERSION_REVISION 4 +#define ARDUINOJSON_VERSION_MINOR 19 +#define ARDUINOJSON_VERSION_REVISION 1 diff --git a/lib/ArduinoJson/src/CMakeLists.txt b/lib/ArduinoJson/src/CMakeLists.txt index b76e580aa..ebc83a952 100644 --- a/lib/ArduinoJson/src/CMakeLists.txt +++ b/lib/ArduinoJson/src/CMakeLists.txt @@ -1,5 +1,5 @@ # ArduinoJson - https://arduinojson.org -# Copyright Benoit Blanchon 2014-2021 +# Copyright © 2014-2022, Benoit BLANCHON # MIT License # I have no idea what this is about, I simply followed the instructions from: diff --git a/lib/ESPAsyncWebServer/AsyncJson.h b/lib/ESPAsyncWebServer/AsyncJson.h index a1ace6ca8..f7e0682b4 100644 --- a/lib/ESPAsyncWebServer/AsyncJson.h +++ b/lib/ESPAsyncWebServer/AsyncJson.h @@ -50,6 +50,7 @@ class ChunkPrint : public Print { } }; +// added by Proddy class MsgpackAsyncJsonResponse : public AsyncAbstractResponse { protected: DynamicJsonDocument _jsonBuffer; @@ -78,8 +79,8 @@ class MsgpackAsyncJsonResponse : public AsyncAbstractResponse { } size_t setLength() { _contentLength = measureMsgPack(_root); - //_headers.add(new AsyncWebHeader("Json-Length", String(_jsonBuffer.memoryUsage()))); // For determening size of EMSESP_JSON_SIZE_XXLARGE_DYN (Sunbuzz) - // Json-Length: 10635 + //_headers.add(new AsyncWebHeader("Json-Length", String(_jsonBuffer.memoryUsage()))); // For determening size of EMSESP_JSON_SIZE_XXLARGE_DYN (Sunbuzz) + // Json-Length: 10635 if (_contentLength) { _isValid = true; } @@ -93,8 +94,6 @@ class MsgpackAsyncJsonResponse : public AsyncAbstractResponse { size_t _fillBuffer(uint8_t * data, size_t len) { ChunkPrint dest(data, _sentLength, len); serializeMsgPack(_root, dest); - // serializeJson(_root, Serial); // for testing proddy - // Serial.println(); return len; } }; @@ -160,8 +159,6 @@ class PrettyAsyncJsonResponse : public AsyncJsonResponse { size_t _fillBuffer(uint8_t * data, size_t len) { ChunkPrint dest(data, _sentLength, len); serializeJsonPretty(_root, dest); - // serializeJson(_root, Serial); // for testing proddy - // Serial.println(); return len; } }; diff --git a/lib/PButton/PButon.cpp b/lib/PButton/PButon.cpp index 264257f3a..a19fe96df 100644 --- a/lib/PButton/PButon.cpp +++ b/lib/PButton/PButon.cpp @@ -94,7 +94,6 @@ bool PButton::check(void) { // Button pressed down if (state_ != pullMode_ && lastState_ == pullMode_ && (millisRes - upTime_) > Debounce_) { - // Serial.println("*pressed*"); downTime_ = millisRes; ignoreUP_ = false; waitForUP_ = false; @@ -103,7 +102,6 @@ bool PButton::check(void) { vLongPressHappened_ = false; if ((millisRes - upTime_) < DblClickDelay_ && dblClickOnNextUp_ == false && dblClickWaiting_ == true) { dblClickOnNextUp_ = true; - // Serial.println("*double up next*"); } else { dblClickOnNextUp_ = false; } @@ -116,12 +114,10 @@ bool PButton::check(void) { else if (state_ == pullMode_ && lastState_ != pullMode_ && (millisRes - downTime_) > Debounce_) { if (ignoreUP_ == false) { upTime_ = millisRes; - // Serial.println("*released*"); if (dblClickOnNextUp_ == false) { dblClickWaiting_ = true; } else { - resultEvent = 2; - // Serial.println("*double*"); + resultEvent = 2; dblClickOnNextUp_ = false; dblClickWaiting_ = false; singleClickOK_ = false; @@ -132,7 +128,6 @@ bool PButton::check(void) { // Test for normal click event: DblClickDelay expired if (state_ == pullMode_ && (millisRes - upTime_) >= DblClickDelay_ && dblClickWaiting_ == true && dblClickOnNextUp_ == false && singleClickOK_ == true && resultEvent != 2) { - // Serial.println("*single click pressed*"); resultEvent = 1; dblClickWaiting_ = false; } diff --git a/lib/framework/APSettingsService.cpp b/lib/framework/APSettingsService.cpp index f5261c20e..2421f56b9 100644 --- a/lib/framework/APSettingsService.cpp +++ b/lib/framework/APSettingsService.cpp @@ -48,7 +48,7 @@ void APSettingsService::manageAP() { void APSettingsService::startAP() { WiFi.softAPConfig(_state.localIP, _state.gatewayIP, _state.subnetMask); esp_wifi_set_bandwidth(ESP_IF_WIFI_AP, WIFI_BW_HT20); - WiFi.softAP(_state.ssid.c_str(), _state.password.c_str()); + WiFi.softAP(_state.ssid.c_str(), _state.password.c_str(), _state.channel, _state.ssidHidden, _state.maxClients); if (!_dnsServer) { IPAddress apIp = WiFi.softAPIP(); emsesp::EMSESP::logger().info(F("Starting Access Point with captive portal on %s"), apIp.toString().c_str()); diff --git a/lib/framework/APSettingsService.h b/lib/framework/APSettingsService.h index 4e0000ceb..cc0dc294b 100644 --- a/lib/framework/APSettingsService.h +++ b/lib/framework/APSettingsService.h @@ -8,16 +8,6 @@ #include #include -#include // proddy added for get_uptime() - -#define MANAGE_NETWORK_DELAY 10000 - -#define AP_MODE_ALWAYS 0 -#define AP_MODE_DISCONNECTED 1 -#define AP_MODE_NEVER 2 - -#define DNS_PORT 53 - #ifndef FACTORY_AP_PROVISION_MODE #define FACTORY_AP_PROVISION_MODE AP_MODE_DISCONNECTED #endif @@ -27,7 +17,7 @@ #endif #ifndef FACTORY_AP_PASSWORD -#define FACTORY_AP_PASSWORD "esp-react" +#define FACTORY_AP_PASSWORD "ems-esp-neo" #endif #ifndef FACTORY_AP_LOCAL_IP @@ -42,29 +32,56 @@ #define FACTORY_AP_SUBNET_MASK "255.255.255.0" #endif +#ifndef FACTORY_AP_CHANNEL +#define FACTORY_AP_CHANNEL 1 +#endif + +#ifndef FACTORY_AP_SSID_HIDDEN +#define FACTORY_AP_SSID_HIDDEN false +#endif + +#ifndef FACTORY_AP_MAX_CLIENTS +#define FACTORY_AP_MAX_CLIENTS 4 +#endif + #define AP_SETTINGS_FILE "/config/apSettings.json" #define AP_SETTINGS_SERVICE_PATH "/rest/apSettings" +#define AP_MODE_ALWAYS 0 +#define AP_MODE_DISCONNECTED 1 +#define AP_MODE_NEVER 2 + +#define MANAGE_NETWORK_DELAY 10000 +#define DNS_PORT 53 + enum APNetworkStatus { ACTIVE = 0, INACTIVE, LINGERING }; class APSettings { public: - uint8_t provisionMode; - String ssid; - String password; + uint8_t provisionMode; + String ssid; + String password; + uint8_t channel; + bool ssidHidden; + uint8_t maxClients; + IPAddress localIP; IPAddress gatewayIP; IPAddress subnetMask; bool operator==(const APSettings & settings) const { - return provisionMode == settings.provisionMode && ssid == settings.ssid && password == settings.password && localIP == settings.localIP - && gatewayIP == settings.gatewayIP && subnetMask == settings.subnetMask; + return provisionMode == settings.provisionMode && ssid == settings.ssid && password == settings.password && channel == settings.channel + && ssidHidden == settings.ssidHidden && maxClients == settings.maxClients && localIP == settings.localIP && gatewayIP == settings.gatewayIP + && subnetMask == settings.subnetMask; } static void read(APSettings & settings, JsonObject & root) { root["provision_mode"] = settings.provisionMode; root["ssid"] = settings.ssid; root["password"] = settings.password; + root["channel"] = settings.channel; + root["ssid_hidden"] = settings.ssidHidden; + root["max_clients"] = settings.maxClients; root["local_ip"] = settings.localIP.toString(); root["gateway_ip"] = settings.gatewayIP.toString(); root["subnet_mask"] = settings.subnetMask.toString(); @@ -81,8 +98,11 @@ class APSettings { default: newSettings.provisionMode = AP_MODE_ALWAYS; } - newSettings.ssid = root["ssid"] | FACTORY_AP_SSID; - newSettings.password = root["password"] | FACTORY_AP_PASSWORD; + newSettings.ssid = root["ssid"] | FACTORY_AP_SSID; + newSettings.password = root["password"] | FACTORY_AP_PASSWORD; + newSettings.channel = root["channel"] | FACTORY_AP_CHANNEL; + newSettings.ssidHidden = root["ssid_hidden"] | FACTORY_AP_SSID_HIDDEN; + newSettings.maxClients = root["max_clients"] | FACTORY_AP_MAX_CLIENTS; JsonUtils::readIP(root, "local_ip", newSettings.localIP, FACTORY_AP_LOCAL_IP); JsonUtils::readIP(root, "gateway_ip", newSettings.gatewayIP, FACTORY_AP_GATEWAY_IP); @@ -122,4 +142,4 @@ class APSettingsService : public StatefulService { void handleDNS(); }; -#endif // end APSettingsConfig_h +#endif diff --git a/lib/framework/APStatus.h b/lib/framework/APStatus.h index e5d78ac8b..754c66618 100644 --- a/lib/framework/APStatus.h +++ b/lib/framework/APStatus.h @@ -22,4 +22,4 @@ class APStatus { void apStatus(AsyncWebServerRequest * request); }; -#endif // end APStatus_h +#endif diff --git a/lib/framework/AuthenticationService.cpp b/lib/framework/AuthenticationService.cpp index 21cedc5ae..0c1822efe 100644 --- a/lib/framework/AuthenticationService.cpp +++ b/lib/framework/AuthenticationService.cpp @@ -44,4 +44,4 @@ void AuthenticationService::signIn(AsyncWebServerRequest * request, JsonVariant request->send(response); } -#endif // end FT_ENABLED(FT_SECURITY) +#endif diff --git a/lib/framework/AuthenticationService.h b/lib/framework/AuthenticationService.h index 904410676..60ed100b6 100644 --- a/lib/framework/AuthenticationService.h +++ b/lib/framework/AuthenticationService.h @@ -25,5 +25,6 @@ class AuthenticationService { void verifyAuthorization(AsyncWebServerRequest * request); }; -#endif // end FT_ENABLED(FT_SECURITY) -#endif // end SecurityManager_h +#endif + +#endif diff --git a/lib/framework/ESP8266React.cpp b/lib/framework/ESP8266React.cpp index 6901052be..d3e38b9b6 100644 --- a/lib/framework/ESP8266React.cpp +++ b/lib/framework/ESP8266React.cpp @@ -42,11 +42,6 @@ ESP8266React::ESP8266React(AsyncWebServer * server, FS * fs) }); } }); - - // only added for local testing (CORS) - // DefaultHeaders::Instance().addHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Authorization"); - // DefaultHeaders::Instance().addHeader("Access-Control-Allow-Credentials", "true"); - // DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); } void ESP8266React::begin() { diff --git a/lib/framework/ESPUtils.h b/lib/framework/ESPUtils.h index 8674aba94..0c5861628 100644 --- a/lib/framework/ESPUtils.h +++ b/lib/framework/ESPUtils.h @@ -10,4 +10,4 @@ class ESPUtils { } }; -#endif // end ESPUtils +#endif diff --git a/lib/framework/FSPersistence.h b/lib/framework/FSPersistence.h index 9f6a6f38c..f179170c0 100644 --- a/lib/framework/FSPersistence.h +++ b/lib/framework/FSPersistence.h @@ -35,9 +35,11 @@ class FSPersistence { // debug added by Proddy #if defined(EMSESP_DEBUG) +#if defined(EMSESP_USE_SERIAL) Serial.printf("Reading file: %s: ", _filePath); serializeJson(jsonDocument, Serial); Serial.println(); +#endif #endif _statefulService->updateWithoutPropagation(jsonObject, _stateUpdater); @@ -68,9 +70,11 @@ class FSPersistence { // debug added by Proddy #if defined(EMSESP_DEBUG) +#if defined(EMSESP_USE_SERIAL) Serial.printf("Writing to file: %s: ", _filePath); serializeJson(jsonDocument, Serial); Serial.println(); +#endif #endif // serialize the data to the file @@ -111,4 +115,4 @@ class FSPersistence { } }; -#endif // end FSPersistence +#endif diff --git a/lib/framework/FactoryResetService.h b/lib/framework/FactoryResetService.h index 31cf06152..a6a4bee12 100644 --- a/lib/framework/FactoryResetService.h +++ b/lib/framework/FactoryResetService.h @@ -22,4 +22,4 @@ class FactoryResetService { void handleRequest(AsyncWebServerRequest * request); }; -#endif // end FactoryResetService_h +#endif diff --git a/lib/framework/HttpEndpoint.h b/lib/framework/HttpEndpoint.h index 990ecc3db..21ac7e610 100644 --- a/lib/framework/HttpEndpoint.h +++ b/lib/framework/HttpEndpoint.h @@ -106,14 +106,17 @@ class HttpPostEndpoint { if (outcome == StateUpdateResult::ERROR) { request->send(400); return; - } - if (outcome == StateUpdateResult::CHANGED) { + } else if ((outcome == StateUpdateResult::CHANGED) || (outcome == StateUpdateResult::CHANGED_RESTART)) { request->onDisconnect([this]() { _statefulService->callUpdateHandlers(HTTP_ENDPOINT_ORIGIN_ID); }); } AsyncJsonResponse * response = new AsyncJsonResponse(false, _bufferSize); jsonObject = response->getRoot().to(); _statefulService->read(jsonObject, _stateReader); response->setLength(); + + if (outcome == StateUpdateResult::CHANGED_RESTART) { + response->setCode(202); // added by proddy + } request->send(response); } }; @@ -144,4 +147,4 @@ class HttpEndpoint : public HttpGetEndpoint, public HttpPostEndpoint { } }; -#endif // end HttpEndpoint +#endif diff --git a/lib/framework/IPUtils.h b/lib/framework/IPUtils.h index 868ec8ac8..5c211d6c0 100644 --- a/lib/framework/IPUtils.h +++ b/lib/framework/IPUtils.h @@ -15,4 +15,4 @@ class IPUtils { } }; -#endif // end IPUtils_h +#endif diff --git a/lib/framework/JsonUtils.h b/lib/framework/JsonUtils.h index d0219856f..3fa38cb12 100644 --- a/lib/framework/JsonUtils.h +++ b/lib/framework/JsonUtils.h @@ -27,4 +27,4 @@ class JsonUtils { } }; -#endif // end JsonUtils +#endif diff --git a/lib/framework/MqttPubSub.h b/lib/framework/MqttPubSub.h index 1ad2d437d..fe8e56434 100644 --- a/lib/framework/MqttPubSub.h +++ b/lib/framework/MqttPubSub.h @@ -160,4 +160,4 @@ class MqttPubSub : public MqttPub, public MqttSub { } }; -#endif // end MqttPubSub +#endif diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp index 143bbd108..df9866958 100644 --- a/lib/framework/MqttSettingsService.cpp +++ b/lib/framework/MqttSettingsService.cpp @@ -172,9 +172,10 @@ void MqttSettings::read(MqttSettings & settings, JsonObject & root) { root["publish_time_sensor"] = settings.publish_time_sensor; root["mqtt_qos"] = settings.mqtt_qos; root["mqtt_retain"] = settings.mqtt_retain; - root["ha_climate_format"] = settings.ha_climate_format; root["ha_enabled"] = settings.ha_enabled; root["nested_format"] = settings.nested_format; + root["discovery_prefix"] = settings.discovery_prefix; + root["publish_single"] = settings.publish_single; root["send_response"] = settings.send_response; } @@ -202,10 +203,11 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting newSettings.publish_time_other = root["publish_time_other"] | EMSESP_DEFAULT_PUBLISH_TIME; newSettings.publish_time_sensor = root["publish_time_sensor"] | EMSESP_DEFAULT_PUBLISH_TIME; - newSettings.ha_climate_format = root["ha_climate_format"] | EMSESP_DEFAULT_HA_CLIMATE_FORMAT; - newSettings.ha_enabled = root["ha_enabled"] | EMSESP_DEFAULT_HA_ENABLED; - newSettings.nested_format = root["nested_format"] | EMSESP_DEFAULT_NESTED_FORMAT; - newSettings.send_response = root["send_response"] | EMSESP_DEFAULT_SEND_RESPONSE; + newSettings.ha_enabled = root["ha_enabled"] | EMSESP_DEFAULT_HA_ENABLED; + newSettings.nested_format = root["nested_format"] | EMSESP_DEFAULT_NESTED_FORMAT; + newSettings.discovery_prefix = root["discovery_prefix"] | EMSESP_DEFAULT_DISCOVERY_PREFIX; + newSettings.publish_single = root["publish_single"] | EMSESP_DEFAULT_PUBLISH_SINGLE; + newSettings.send_response = root["send_response"] | EMSESP_DEFAULT_SEND_RESPONSE; if (newSettings.enabled != settings.enabled) { changed = true; @@ -220,12 +222,15 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting changed = true; } - if (newSettings.send_response != settings.send_response) { + if (newSettings.discovery_prefix != settings.discovery_prefix) { changed = true; } - if (newSettings.ha_climate_format != settings.ha_climate_format) { - emsesp::EMSESP::mqtt_.ha_climate_format(newSettings.ha_climate_format); + if (newSettings.publish_single != settings.publish_single) { + changed = true; + } + + if (newSettings.send_response != settings.send_response) { changed = true; } diff --git a/lib/framework/MqttSettingsService.h b/lib/framework/MqttSettingsService.h index 427b67a4e..f51efb6a8 100644 --- a/lib/framework/MqttSettingsService.h +++ b/lib/framework/MqttSettingsService.h @@ -86,9 +86,10 @@ class MqttSettings { uint16_t publish_time_sensor; uint8_t mqtt_qos; bool mqtt_retain; - uint8_t ha_climate_format; bool ha_enabled; uint8_t nested_format; + String discovery_prefix; + bool publish_single; bool send_response; static void read(MqttSettings & settings, JsonObject & root); @@ -138,4 +139,4 @@ class MqttSettingsService : public StatefulService { void configureMqtt(); }; -#endif // end MqttSettingsService_h +#endif diff --git a/lib/framework/MqttStatus.h b/lib/framework/MqttStatus.h index 88df0aaee..cb4b2172a 100644 --- a/lib/framework/MqttStatus.h +++ b/lib/framework/MqttStatus.h @@ -20,4 +20,4 @@ class MqttStatus { void mqttStatus(AsyncWebServerRequest * request); }; -#endif // end MqttStatus_h +#endif diff --git a/lib/framework/NTPSettingsService.h b/lib/framework/NTPSettingsService.h index 5174ed45a..e6af2831d 100644 --- a/lib/framework/NTPSettingsService.h +++ b/lib/framework/NTPSettingsService.h @@ -69,4 +69,4 @@ class NTPSettingsService : public StatefulService { void configureTime(AsyncWebServerRequest * request, JsonVariant & json); }; -#endif // end NTPSettingsService_h +#endif diff --git a/lib/framework/NTPStatus.h b/lib/framework/NTPStatus.h index b3a84a3da..98e82589a 100644 --- a/lib/framework/NTPStatus.h +++ b/lib/framework/NTPStatus.h @@ -22,4 +22,4 @@ class NTPStatus { void ntpStatus(AsyncWebServerRequest * request); }; -#endif // end NTPStatus_h +#endif diff --git a/lib/framework/OTASettingsService.cpp b/lib/framework/OTASettingsService.cpp index f2b7d7477..403ba9810 100644 --- a/lib/framework/OTASettingsService.cpp +++ b/lib/framework/OTASettingsService.cpp @@ -35,17 +35,16 @@ void OTASettingsService::configureArduinoOTA() { _arduinoOTA->setPort(_state.port); _arduinoOTA->setPassword(_state.password.c_str()); - _arduinoOTA->onStart([]() { - Serial.println(F("Starting")); - emsesp::EMSESP::system_.upload_status(true); - }); - _arduinoOTA->onEnd([]() { - Serial.println(F("\r\nEnd")); - emsesp::EMSESP::system_.upload_status(false); - }); + _arduinoOTA->onStart([]() { emsesp::EMSESP::system_.upload_status(true); }); + _arduinoOTA->onEnd([]() { emsesp::EMSESP::system_.upload_status(false); }); - _arduinoOTA->onProgress([](unsigned int progress, unsigned int total) { Serial.printf_P(PSTR("Progress: %u%%\r\n"), (progress / (total / 100))); }); + _arduinoOTA->onProgress([](unsigned int progress, unsigned int total) { +#if defined(EMSESP_USE_SERIAL) + Serial.printf("Progress: %u%%\r\n", (progress / (total / 100))); +#endif + }); _arduinoOTA->onError([](ota_error_t error) { +#if defined(EMSESP_USE_SERIAL) Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println(F("Auth Failed")); @@ -57,6 +56,7 @@ void OTASettingsService::configureArduinoOTA() { Serial.println(F("Receive Failed")); else if (error == OTA_END_ERROR) Serial.println(F("End Failed")); +#endif }); _arduinoOTA->setMdnsEnabled(false); // disable as handled in NetworkSettingsService.cpp. https://github.com/emsesp/EMS-ESP32/issues/161 diff --git a/lib/framework/OTASettingsService.h b/lib/framework/OTASettingsService.h index d0759818e..1301f1607 100644 --- a/lib/framework/OTASettingsService.h +++ b/lib/framework/OTASettingsService.h @@ -12,7 +12,7 @@ #endif #ifndef FACTORY_OTA_PASSWORD -#define FACTORY_OTA_PASSWORD "esp-react" +#define FACTORY_OTA_PASSWORD "ems-esp-neo" #endif #ifndef FACTORY_OTA_ENABLED @@ -58,4 +58,4 @@ class OTASettingsService : public StatefulService { void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); }; -#endif // end OTASettingsService_h +#endif diff --git a/lib/framework/RestartService.h b/lib/framework/RestartService.h index e6473c0fe..9eb558e76 100644 --- a/lib/framework/RestartService.h +++ b/lib/framework/RestartService.h @@ -23,4 +23,4 @@ class RestartService { void restart(AsyncWebServerRequest * request); }; -#endif // end RestartService_h +#endif diff --git a/lib/framework/SecurityManager.h b/lib/framework/SecurityManager.h index 82eb516b1..4d364253c 100644 --- a/lib/framework/SecurityManager.h +++ b/lib/framework/SecurityManager.h @@ -104,4 +104,4 @@ class SecurityManager { virtual ArJsonRequestHandlerFunction wrapCallback(ArJsonRequestHandlerFunction onRequest, AuthenticationPredicate predicate) = 0; }; -#endif // end SecurityManager_h +#endif diff --git a/lib/framework/SecuritySettingsService.h b/lib/framework/SecuritySettingsService.h index 406b47eb0..cdbd8d085 100644 --- a/lib/framework/SecuritySettingsService.h +++ b/lib/framework/SecuritySettingsService.h @@ -115,5 +115,5 @@ class SecuritySettingsService : public SecurityManager { ArJsonRequestHandlerFunction wrapCallback(ArJsonRequestHandlerFunction onRequest, AuthenticationPredicate predicate); }; -#endif // end FT_ENABLED(FT_SECURITY) -#endif // end SecuritySettingsService_h +#endif +#endif diff --git a/lib/framework/StatefulService.h b/lib/framework/StatefulService.h index f42688a8d..f7ed5f161 100644 --- a/lib/framework/StatefulService.h +++ b/lib/framework/StatefulService.h @@ -18,9 +18,10 @@ #endif enum class StateUpdateResult { - CHANGED = 0, // The update changed the state and propagation should take place if required - UNCHANGED, // The state was unchanged, propagation should not take place - ERROR // There was a problem updating the state, propagation should not take place + CHANGED = 0, // The update changed the state and propagation should take place if required + CHANGED_RESTART, // a restart of the device is needed - added by proddy + UNCHANGED, // The state was unchanged, propagation should not take place + ERROR // There was a problem updating the state, propagation should not take place }; template @@ -139,4 +140,4 @@ class StatefulService { std::list _updateHandlers; }; -#endif // end StatefulService_h +#endif diff --git a/lib/framework/SystemStatus.h b/lib/framework/SystemStatus.h index 584580f67..75cfdb4d1 100644 --- a/lib/framework/SystemStatus.h +++ b/lib/framework/SystemStatus.h @@ -21,4 +21,4 @@ class SystemStatus { void systemStatus(AsyncWebServerRequest * request); }; -#endif // end SystemStatus_h +#endif diff --git a/lib/framework/UploadFirmwareService.h b/lib/framework/UploadFirmwareService.h index f953f5a2d..ec52fc9ee 100644 --- a/lib/framework/UploadFirmwareService.h +++ b/lib/framework/UploadFirmwareService.h @@ -24,4 +24,4 @@ class UploadFirmwareService { static void handleEarlyDisconnect(); }; -#endif // end UploadFirmwareService_h +#endif diff --git a/lib/framework/WiFiScanner.h b/lib/framework/WiFiScanner.h index ee496c1a2..aab364e7a 100644 --- a/lib/framework/WiFiScanner.h +++ b/lib/framework/WiFiScanner.h @@ -22,4 +22,4 @@ class WiFiScanner { void listNetworks(AsyncWebServerRequest * request); }; -#endif // end WiFiScanner_h +#endif diff --git a/lib/uuid-syslog/src/syslog.cpp b/lib/uuid-syslog/src/syslog.cpp index 82f63f317..135aa3f5e 100644 --- a/lib/uuid-syslog/src/syslog.cpp +++ b/lib/uuid-syslog/src/syslog.cpp @@ -128,13 +128,11 @@ void SyslogService::log_level(uuid::log::Level level) { bool level_changed = !level_set || (level != log_level()); level_set = true; - if (level_changed && level < uuid::log::Level::NOTICE) { + if (level_changed) { logger_.info(F("Log level set to %S"), uuid::log::format_level_uppercase(level)); } + uuid::log::Logger::register_handler(this, level); - if (level_changed && level >= uuid::log::Level::NOTICE) { - logger_.info(F("Log level set to %S"), uuid::log::format_level_uppercase(level)); - } } size_t SyslogService::maximum_log_messages() const { @@ -154,7 +152,7 @@ std::pair SyslogService::destination() const { } void SyslogService::destination(IPAddress host, uint16_t port) { - ip_ = host; + ip_ = host; port_ = port; if ((uint32_t)ip_ == (uint32_t)0) { @@ -429,7 +427,16 @@ bool SyslogService::transmit(const QueuedLogMessage & message) { udp_.printf_P(PSTR("<%u>1 "), ((unsigned int)message.content_->facility * 8) + std::min(7U, (unsigned int)message.content_->level)); if (tm.tm_year != 0) { - udp_.printf_P(PSTR("%04u-%02u-%02uT%02u:%02u:%02u.%06u%+02d:%02d"), tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (uint32_t)message.time_.tv_usec, tzh, tzm); + udp_.printf_P(PSTR("%04u-%02u-%02uT%02u:%02u:%02u.%06u%+02d:%02d"), + tm.tm_year + 1900, + tm.tm_mon + 1, + tm.tm_mday, + tm.tm_hour, + tm.tm_min, + tm.tm_sec, + (uint32_t)message.time_.tv_usec, + tzh, + tzm); } else { udp_.print('-'); } @@ -438,11 +445,8 @@ bool SyslogService::transmit(const QueuedLogMessage & message) { char id_c_str[15]; snprintf_P(id_c_str, sizeof(id_c_str), PSTR(" %lu: "), message.id_); - std::string msgstr = uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3) + - ' ' + - uuid::log::format_level_char(message.content_->level) + - id_c_str + - message.content_->text; + std::string msgstr = uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3) + ' ' + uuid::log::format_level_char(message.content_->level) + id_c_str + + message.content_->text; for (uint16_t i = 0; i < msgstr.length(); i++) { if (msgstr.at(i) & 0x80) { udp_.print("\xEF\xBB\xBF"); diff --git a/lib_standalone/Arduino.cpp b/lib_standalone/Arduino.cpp index d4995a503..ea3cea100 100644 --- a/lib_standalone/Arduino.cpp +++ b/lib_standalone/Arduino.cpp @@ -120,3 +120,13 @@ int digitalRead(uint8_t pin) { return LOW; } } + +uint32_t analogReadMilliVolts(uint8_t pin) { + return 0; +} + +void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation) { +} + +void analogSetAttenuation(adc_attenuation_t attenuation) { +} diff --git a/lib_standalone/Arduino.h b/lib_standalone/Arduino.h index 7029ab040..896d862a3 100644 --- a/lib_standalone/Arduino.h +++ b/lib_standalone/Arduino.h @@ -53,9 +53,14 @@ #define snprintf snprintf_P // to keep backwards compatibility -void pinMode(uint8_t pin, uint8_t mode); -void digitalWrite(uint8_t pin, uint8_t value); -int digitalRead(uint8_t pin); +void pinMode(uint8_t pin, uint8_t mode); +void digitalWrite(uint8_t pin, uint8_t value); +int digitalRead(uint8_t pin); +uint32_t analogReadMilliVolts(uint8_t pin); + +typedef enum { ADC_0db, ADC_2_5db, ADC_6db, ADC_11db } adc_attenuation_t; +void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation); +void analogSetAttenuation(adc_attenuation_t attenuation); #define PROGMEM #define PGM_P const char * @@ -217,6 +222,4 @@ void yield(void); void setup(void); void loop(void); - - #endif diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index a25bc310e..2bed076cf 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -2,10 +2,15 @@ #define ESP8266React_h #include + #include #include + #include #include + +#include + #include #include #include @@ -26,39 +31,69 @@ class DummySettings { bool shower_alert = false; bool hide_led = false; bool notoken_api = false; - uint8_t bool_format = 1; // on off + bool readonly_mode = false; + uint8_t bool_format = 1; // using "on" and "off" uint8_t enum_format = 1; - uint8_t dallas_format = 1; + bool nosleep = false; + bool fahrenheit = false; + bool bandwidth20 = false; + bool telnet_enabled = false; + String board_profile = "CUSTOM"; + bool trace_raw = false; + bool analog_enabled = true; // analog is enabled + int8_t weblog_level = 1; + uint8_t weblog_buffer = 50; + bool weblog_compact = true; + uint8_t rx_gpio = 0; + uint8_t tx_gpio = 0; + uint8_t dallas_gpio = 16; // to ensure its enabled + bool dallas_parasite = false; + uint8_t led_gpio = 0; + bool low_clock = false; + uint8_t pbutton_gpio = false; + uint8_t solar_maxflow = 30; // MQTT - uint16_t publish_time = 10; // seconds - uint8_t mqtt_qos = 0; - bool mqtt_retain = false; - bool enabled = true; - uint8_t nested_format = 1; // 1=nested 2=single - uint8_t ha_climate_format = 1; - bool ha_enabled = true; - String base = "ems-esp"; - bool send_response = true; + uint16_t publish_time = 10; + uint8_t mqtt_qos = 0; + bool mqtt_retain = false; + bool enabled = true; + uint8_t nested_format = 1; // 1=nested 2=single + String discovery_prefix = "homeassistant"; + bool ha_enabled = true; + String base = "ems-esp"; + bool publish_single = false; + bool send_response = true; + String host = "192.168.1.4"; + uint16_t port = 1883; + String clientId = "ems-esp"; + String username = ""; + uint16_t keepAlive = 60; + bool cleanSession = false; - String hostname = "ems-esp"; - String jwtSecret = "ems-esp"; - String ssid = "ems-esp"; - String password = "ems-esp"; - String localIP = ""; - String gatewayIP = ""; - String subnetMask = ""; - bool staticIPConfig = false; - String dnsIP1 = ""; - String dnsIP2 = ""; - String board_profile = "CUSTOM"; uint16_t publish_time_boiler = 10; uint16_t publish_time_thermostat = 10; uint16_t publish_time_solar = 10; uint16_t publish_time_mixer = 10; uint16_t publish_time_other = 10; uint16_t publish_time_sensor = 10; - bool enableIPv6 = false; + + String hostname = "ems-esp"; + String jwtSecret = "ems-esp"; + String ssid = "ems-esp"; + String password = "ems-esp"; + String localIP = ""; + String gatewayIP = ""; + String subnetMask = ""; + bool staticIPConfig = false; + String dnsIP1 = ""; + String dnsIP2 = ""; + bool enableIPv6 = false; + + uint8_t phy_type = 0; + uint8_t eth_power = 0; // 0 means -1 + uint8_t eth_phy_addr = 0; + uint8_t eth_clock_mode = 0; #define FACTORY_MQTT_MAX_TOPIC_LENGTH 128 diff --git a/lib_standalone/FSPersistence.h b/lib_standalone/FSPersistence.h index d46661863..10c4b7814 100644 --- a/lib_standalone/FSPersistence.h +++ b/lib_standalone/FSPersistence.h @@ -64,4 +64,4 @@ class FSPersistence { } }; -#endif // end FSPersistence +#endif diff --git a/lib_standalone/HttpEndpoint.h b/lib_standalone/HttpEndpoint.h index ae3d7c89c..10442d03f 100644 --- a/lib_standalone/HttpEndpoint.h +++ b/lib_standalone/HttpEndpoint.h @@ -129,4 +129,4 @@ class HttpEndpoint : public HttpGetEndpoint, public HttpPostEndpoint { } }; -#endif // end HttpEndpoint +#endif diff --git a/lib_standalone/Network.h b/lib_standalone/Network.h index f4c99bd85..b4b05b9b9 100644 --- a/lib_standalone/Network.h +++ b/lib_standalone/Network.h @@ -167,6 +167,10 @@ class WiFiClass { char * localIP() { return nullptr; } + + wl_status_t status() { + return WL_CONNECTED; + } }; class ETHClass { diff --git a/lib_standalone/SecurityManager.h b/lib_standalone/SecurityManager.h index 327206351..cebff2229 100644 --- a/lib_standalone/SecurityManager.h +++ b/lib_standalone/SecurityManager.h @@ -80,4 +80,4 @@ class SecurityManager { virtual ArJsonRequestHandlerFunction wrapCallback(ArJsonRequestHandlerFunction onRequest, AuthenticationPredicate predicate) = 0; }; -#endif // end SecurityManager_h +#endif diff --git a/lib_standalone/SecuritySettingsService.h b/lib_standalone/SecuritySettingsService.h index fda1b7d76..acc4dec7d 100644 --- a/lib_standalone/SecuritySettingsService.h +++ b/lib_standalone/SecuritySettingsService.h @@ -102,5 +102,5 @@ class SecuritySettingsService : public SecurityManager { ArJsonRequestHandlerFunction wrapCallback(ArJsonRequestHandlerFunction onRequest, AuthenticationPredicate predicate); }; -#endif // end FT_ENABLED(FT_SECURITY) -#endif // end SecuritySettingsService_h +#endif +#endif diff --git a/lib_standalone/StatefulService.h b/lib_standalone/StatefulService.h index f97386633..807ce988e 100644 --- a/lib_standalone/StatefulService.h +++ b/lib_standalone/StatefulService.h @@ -17,8 +17,9 @@ enum class StateUpdateResult { CHANGED = 0, // The update changed the state and propagation should take place if required - UNCHANGED, // The state was unchanged, propagation should not take place - ERROR // There was a problem updating the state, propagation should not take place + CHANGED_RESTART, // The update changed the state and the service should be restarted + UNCHANGED, // The state was unchanged, propagation should not take place + ERROR // There was a problem updating the state, propagation should not take place }; template @@ -149,4 +150,4 @@ class StatefulService { std::list _updateHandlers; }; -#endif // end StatefulService_h +#endif diff --git a/media/EMS-ESP_logo.png b/media/EMS-ESP_logo.png deleted file mode 100644 index 7c3d2fbe0a821fe232fcb3348738e2059a69efb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4159 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 \ No newline at end of file diff --git a/media/boiler_128.png b/media/boiler_128.png deleted file mode 100644 index 3abbdc1fa0e399c908ee58016dbb2e8e2c49b7a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4329 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 diff --git a/media/boiler_16x16.ico b/media/boiler_16x16.ico deleted file mode 100644 index a7f3d243237b86c8d93556869149c8eab934ef9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYIlFhVexkA+}l1S())kTKNP zKP4+8oe0842KuK!Vo*6Ox*$TT3L*?5LflGL#_|n;p2i>ILrl-b2AiDobv680lwy|k z?tDJq+w=K2^#di?^)w_WcU5}-pWhn+#F1b;rz`CL><*vbUJi;aKs9XW1~4--frNMh ze5|KU?aBSPYkm9wll!Lpzi?zG7=zf`*R=kh*q-*m&)s+`NG&rHSP$4Jb~aWJtu(#A z;PL;@`~LrWx9k7&+pGV-d$a+JL2QuN|M%PePi;?n3{uO^1`JFnU}p#GSMG1meDdnf zn*YykuKa)h(vtrVuPy^)5E~@+;^xx-y$vx>fZCLyc7jb{Wd)n1oER7QWd5wy|MO1gB@g!@|>AnPyYRU^#9NI2UzjHAGiO{nOY0h&%ure zMwtG&vwEKV|MTSk|6h+F`1j-g|3Mhezx#jg^g2BHyW#r(0rkCqeGQC3Y={{|>IbSn zab!I(zEb~BYEJ{R|NjQM>o;-wzkj~-e{yH`|Fc`N{~uThGy}-~@%b*%`hR`B|9^Ua z$^RXT68}$c_5VM$xA_0BZ}$o6pEsxX$^XAk!C`jq)=^Mc|DQXp_Wyk#8yv2G?){%P zqaGvtSXsg8N2ax@?8ckt7ytkL@c^v;->=92L172NzrNo6|MuDG|E&$#H-T|2!v@g< zPCrnBSzS#zG9fN>^{s0M*Kggp;O>-(&3~p%ZvEZYUH7r7BIkB=gzqLz4aF#+dS;l$ VAMy+gANUy<9srZj0iYs&<+3q diff --git a/media/boiler_24.png b/media/boiler_24.png deleted file mode 100644 index 8e37e504b5a136b202fb1e65d5277f31f40c1666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 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 Z(ow`R*(bj`K{5^~y-|N%C2JA>zW~=ONZSAa diff --git a/media/boiler_32.png b/media/boiler_32.png deleted file mode 100644 index ba7976f874007f3923b084971f014c86b3c1e189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1186 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 diff --git a/media/boiler_64.png b/media/boiler_64.png deleted file mode 100644 index a2c0aa610692a3a9a09b47068e8a8b2805fb6f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmV;v2toIWP)5{L~61wv^<5IXWE z0;Uoeq$;*UTSrHwI<$aQM>{$K71YjXZ7Tx`qD~cyRG?7-5s-HX1P~IETrMOexm?cV zlH6S`xBcUiK)5jEj(c%RzB9j>-|g=6?03JnzukRyb_M>yZ-K=?C=dy#gb->er5X@G zGhhMQffm3D)B-v{4^(x%p9Rd`BqqGzBLm0>CILTF@)($Mq;l5{Ca6@rw9@0~qs z&#oQAx($MYf>1|95E>c=LeSpUN?U6y9X8v|>T&?3z$xG;uopPlmF^Kd6<`>!99Rg% zUz_pB)64kNs=xFqY`5EKsJlW~SUBNoHG`DO8#-<_nXp-{T&cNCO|>4qPKUm#3VlTd z=TD!ax}v;y1B5V1DYpPG12yh8#1jFMgb?3IDYb)?N^-`IWBkN?ev&_l@p<`ZVq-mU z*?)X*`kv#bPI2_$L5_aCo8m(Uu(r1&gs75I-ih;b={GzPU<^(TA)%qe`EIjX znUk4}snKASQicPa{q>`8v)*BVDm^nZpp6Gmh^zlza7YL#86%NWhT!Dbe?RWl3!qTA zYvv^Y1YGuH21{3?LHvVs+l zJ;FC%e&Le0_QmI!GGivMy!kdssan5r@|ytX&zxq_%xM@64GbNgN$&iIiO>2mNJ-7P zVvc|OE?*b@mpOS8_^{|J?#RyZ3opM2&}ufbWL^PALj!q>A7kdSmrw*Rs{{zP1S=1gW_b zd!@G+>HvrtqVY97-wP0<(V$JwKv#ASQ;ojYXP_OQ?^3?0T1S29Inpvl5ET>SYkK|} z1PdQrjC43CTKD`-%NDJD4k;yt4=(ltGd~INo25^Yl&Ym<=O^r1y%I;K-KC79)6ULS z%Q;*0Z<4iXEP3+x{-EZcg;2O!&HAm|xPQh}4!-v$rTf1mcfqen$QskN5z*HNRHyd$zv{g&n}$HbBhXG(!V=?go5NKO1|CiYkI!l z6b+AvBw=_uVSViL$E9cq3JP*b4^^w3HiIL4P0#IvlF2|-cHSh`eZJQRblk(Wv%t#> zrgGuP0e}>oC(Qc=cRztP0Bd`jn`S=3HGiL_wYB@TwXdQ#g1Z7V3L$DL&YnSE`kkAm z-bF{JM0WlC)fdiEeW3&)gdT9~RE6sYcyl-$4#(a5w|~kYr4n^?G!b2A0Q?1q1XH^m z-MJDDY<-^%D<8+wY6f@)=RJac!;{nE0(c#GqT5~*pGek(JTgX)Aw6dd!?Q;-WLSa+ zuKR{`IJi=!<6`kiE}kjo(&gp^XQ0anrz9`(O5o+1bMC2$vz%XPge zL={SGawX z^g0?Y>uIdHjJ>1xZ4x1bO-gwf*bRIDT=1k3-ncRY@BpwmW$e!wnx2VKS59M9In8yK zZ`rXTCtpAmPB}r2G!t57vl~~J63ZurrK%@m8H~ImSLzYqfvK>a7`R@ zU)^XNq);3aO2vwGV`5Kwi?lZd0OuXTLYyh0bTH!;E0~;a(0tA{spy3Yz zj#{mjBJ9eTeS7!h3nA)&;y%iq7DCkR+q)+pyE4XNX)nUf$j%e|55;BQ(L&S|`~Uy| M07*qoM6N<$f=`haVgLXD diff --git a/media/console.png b/media/console.png index 53876b142d5a8b365809fd1dae7c9e38e0183564..0399da27ea32bac130e8438518d3f4ac2bff9479 100644 GIT binary patch literal 739700 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℞HCRCYQ154AEENcnF1 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 z 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

aC0*018Y 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 L&s3cDzWsjzj@d&n literal 561391 zcmbrmcUV*T);5eY<2YhrEXarggQy?~jPxD{1Vn_;krFa0y-Kf1Y>0q>0vdXxccOF% zBx6C87D9_8Koo=oLWq!rKthstGv}P|`JU@K*Z2ML{=pTp*?a%`TKBrwy-2mQwLBy) zEiNV|cF5}L6$de~ABx1peme5Y&%l+3Z8!3Pk3EqNmZoA&Bd3>vFF*PHY4fL;*z2qV zJ2&?N-}m3S>J}*`cKF@y&z}CU8gDT%QKi+DKb_*dR%Z_+IZqaIMSbUifUnX7my} zh~fP*9k&IVDu;kB+8yp?LHCG>-EDsP}tDMHm zh;{05vC+vpRx-QKn7`S-+f>@X+gQ4QcLfOt)qt_d5tg^ z_EFoqxWB3dg1y_!YnD`({-)cLU0Y*^To)+k4@3N{C?X}EhM=HCO;J<5m?^CWh#&qs)qcI`oA46V=w z>LxF4d|A#z8!bd69(Ia5q5Or}wXC=_=$G`N3Afef%D^va8?j;(6i>#CsgkQR1MpfP4Nt>x462T?oOYxl#XAR$W#&9q( z9`2UR09b~OFkYD64$3&ZvQ<8TJ5@SqJ-D7|B$2UO+P7fyEU&UNjtUU|+KxM@b1pb^ z&YSG?5E4Bi=_?#LW6jpjINSZKmo_MQ_b3xIkyXw=fQ!USgxq82Fn5$F-6|O~wReo? z%Prfyc&>#n%+0G$;n~S-x()A#LS+ujv*9IaEH@Bq1jD)Z&v`t)=DXxr7im%o$q+pKhFeIkNjF zl>~~U4FO3?nn2XZS#s~xW!<`%v>9)hP>p=im!TH;-XRkdUFOExRQ7nX?6M~{^Y1!{ zgkk_j-I#wrCt#e4aa%LF?+UBP37FN!8 z0#8Zrne`LF7=m1qls%?=U%-qoDR^T&1~HLRXmXW%EA7Q()icw^@@MZdpU5_OcE9yn zam95<|H;j=u#D1vyBfOZsTH-zH_MSj4%t^U+8!V?oAx_TS^xvg zkg*4PA=5ClpXcX73Y)2UjsZzrUi^x`AojBU!m{HEaL47-|H~=^*3xLhI`JD)8O(TP zvecSFRy?##GCf>ue;e9&HBnaiYflEQw28JrzYg&M?Gd}&JhYek-Ab@wjS-i0#?*f{ z*hts*U7S(fW=151$e(%<)`8Ze2o;O>p<3z40&!;P0x#d3dmQOUahvDYiY{J<-FhXc zBR(ZKFTHH3AFd2z+@?sW*4t#_;$K3b=+xLrvM_s#hqMEQ_I?6U#+wupz!VI36Z9Gv z;tFko2s&fL#1hgDLmY^p3h8?hB0ajCr{Do%bV9gU&ri{wP;-wFTuJ|dn;(}b@9vsB zfC?k$h3)UCMP!uK{&hzofP{iSNSOBNZ={nEsi=Laa<_AtaXB>By0EWU&XQ@#-wZKJ z<~CdEP;rA+<5}2l&H}8T|7?_JP({<3PvUP=4GV|D@LqnsO5fUQRKJ~?C_EwExxo>Swh4Al(=@t;6 zwQWpo9Ax2h9riZeQ+JHy)oo5>NbEv$x-&Ha|RVlyl3GW8y6*i=ZDRvjDk`=&pMIj+2} zBdK?c`I|paV%4WzN4ljkAd!BR^hJSJ@T2WA#r@*dF(H5C!4(jt30+LbEKFWHQFi~c zq*994luJ=S>-E0pSYl0n4YW}+$`lki!`+w1GmGfEHSy(LJxOv-x^4W@wBQqJyaH|t zl7fPcx`Wt}vGe?8M`ypGmAxLTF`U3SSYe0O>N`iABK!C)77cGMmRnD)o1UA~Vc+h0X3D^1-khim*;_i5NRMUk zZAl19{MC8hXiR}iSeWtLQ-Pv0*O8q#^9&y>fCv>po;zNAf<2EW#8c@qllt5NZH{>=hvj}@8; z9$PqTzcpg69AXHMmAy?EdGfQS5K6M>F~^1R@-2yb#a=2ZS-){>OTlfew^@=~8wT?- zEtpYE�dqwCcX8MOsK|b}##TWQ29(J&$Z()3`5v)Ibfj6|PV4nRV^9F(!$;f40VdRC0EGG3gU}@lw*p0&iUQ-Ef z5_=`Y0J>Hba7E8xqv4i1?^^amR*l}|>sqDgGP>n*XB6g<$&X@}!HzHPx7-X!@2v)N zH@Xma`-n}}O*}94UNoYIQ)2NxD!@U(cm2r6uQ`0OYp(E5gy{Ju_wzRC^ejJ?R;j%y z9H0q12TMcWk3ghfjD~O5=-ETvDG-+vu|0vV2*TUoEk%BQ=>i$_8++a+W7E?gW|+_! zi7~JwA!6rRPpc**MNP+kLX%LIlICa%F_<6CFF4DN+|S8jN3sPoeI2MwxY~-Py1sD{)v8QW0D|1FR0gIHmjGYT7=@UlP8*(>+R(@z=T`A#@s}6)>q@seHH8j}H69 zqO|kHM`$xCV$EILyV~28QM&*gVpE-UXQeqP>8FU;<)IL6R1tsmU)SB%zFsfaOg}7M zGV-o#pV&((jr|X5pFQ=zyv6@F9tXV3e~146erzRTFBKWusf=^_?1s{(?2O|?e`A#) z1q&;|n!d0RY|%yPbZie~nL2p{vg~(A?DB=EnlGzQ5PJPK1}4Bm*{)uiyU6EcH2dcE zi_8nu^(y_Qk2L-|-2s^xLiM-+A!VT4s>`g_rs2PJ(9(Lf;CuUC4jCmLJ^)6F|jCJV1Zzp6yk1x;0PI~z%x$#-hxQF z4gZv<5?1sas<9-u*7K$)wy)3kvOtUlpzTGEjBOxBA)CxIlH-{$>F1HIPuZS;`xoy5Qc4#!#rNA+IUSVn!_Z%thndzm*EMR~yIxQ$)V#k2 zMx<`aT)Ie+76KsUrQs*1JAr3cJdltO>AA31P;KQ!z?`QF@1f;1YT803(_&Yo9Kh0Ec*)mU`T+)U&+*xmANGkbxIdOEt^9paB*EBj)U-51xPMz?&6 zDK4$snJN>wO-LU;ciE40-*PZa%`1?2h(IL*0o73A&IL^^=yzJ@L^VI&nK;!d>`9`h zj}T{4;7C!^D?8AdCy9lNfy{5?H(17jZ+~NTS&cKcC*r+&Bb?{)*8GmO-ssJlm1a2O zZuk4m(eMD{-fG6mZ|40~wTppgGN;CF%sS_D8 zHG3neZNi?`i&pe%`(O~^hats5JW(>y-VN?$;x+=N{WiX1A|^KK91R>7sADlSkk!JR z^*Iax`IE*s8z3=d^gy@0V=dqvf>v0t2GTZfikGm0TUsJ2d%b`s@g1-3#BuU33jA~F z_sgqy?VfJQ>w7*qs%XbW=f%(s)cc11q?27T&`f znwNrxFf0eH1T;kq^GRf$K= z@mLP)6$A$^>zX^1FRWFEP8rPq*4rur!dnSCS?K8Kg9JeqH)oOi4G8>v@oiI+)aIQY z)9lPa%l;*JEIR^8;N)xJfWRfnxi`~rty6}MatpwPBiULJ<40C3MSri9Xj_V2271>y zIFW>6eae$4M=`M&WVTe1bmOzFAAhY>`Yzmp^9VIsCYL$|Z2imUc4>_$ZJ(20*@Q*2 z*iY?8|9S9VSI;4?8CQ&@8K&6);o9u&4#{0&g_i%{XqHJeaBWV^4^CJ`x%_tk#=omp z4%y{R#B!yP6aRm#%>SK5|F6W%Y~2^5h#kUG1HK3)It=vV`AZMUA_WQ2tCRfH@NH)E z_AZ-(1pZ(rK3nz0sdNii4&TgzKR)buufcq2-(f6fg=Xm3`u4fqL6`=;(cdgEi2OR3 zSZGZl^`AztE|X(O?;Z?IDE>^=QKi$jPOYpax?57{+S}B`0{Qa#;Kavh#5yN(bb7Lp zLa%R!7&d@~$KZ;^x_vwIQwZJNSaF-srkg*hvPe{s4O`(7$=I7mbYKH=H%=7~`U>GXD`@v1m%A6sWojvU;sv-Zbs zAn>!Cm(Omn0*`U z7rYzOLWHaxDF*RuhY8P7bLY#EnC+E9bPKc+ey3MoFyFGeu_{OL#|`x2O}r1wMCP50 z`5V3@l#*)+8OQPRr}!3-dkNcZ&{ihU!X5K}jg=@sAGMXf^Z`q1FQQ*BNd zuRvEaKwo|4TU1{Mji11{!z0%nFlxZUMv!LTZNKH}7F6S!=dg2ee??-WU2T}Hd6u>b zl*}84_3H+T?hIZwbnoJUJv=~6ufWK8K??7}mA;o=_T3Mg&alCeOZhO%gDP9CJnDHH z-Du8_t5^L>e~8|7%GMzh?cbggS8J-pM^{MFhPUbfW=X8|_1@}JZl{y3gr1GS9pmLM z#deT=M0tJLAd!%G z;amdK8z6wL3!WOYD9Hh>8~{tOG;;kNsS#DVNX;Q*+OT9ss&= z>wvA~BXtVFTRkKwH~h<=ugqm)q)43}4$^LO_EL1fY6HO)5>I-oJuaTrO|LTIhr&e2Ga6TiVfQMTGrC zD;e!m$C475H2}jv-1^jCxQJHO4syZXJ}^=(3?)45~@FCgF6wMz}g+QYz-1ez)zp{Z|SR-0kX;3SJPt9)X`{^tJ*c zuxD84Ie+eo*N~bW2Z)?1;Zu{Cv@?<_Wx2nf`$?4_-2!n1w%22T3YC+rOn~`cLm0vw z{2aduRv=&Bs@1E~WAdsd$qapeAecSL;&=`?e%zzT)pSl|H`8?mZGERrT6Ds5H5j~t z1Dpy`OSP&FFfj&okTgOIcE~*wJubg za}L8PXPMOgJ$?zK-69|B6?3Ab>6L{2YZE_<<3220eO? zl6bRT_0?|Ql-Ff#CG*?(oY#FNOCwI}wK|nQ)hdnogh{%GMr^jGE%%?3sQvZ8HhtV< zmDtqqxKAOTS>Tb0{f_B zzVvb(r~+L(-H|oy;98jWiUMWdE3Se37a~=0)+6k|S%|v?;bXD5Yv1i|Yf<0lzhZME5ePg{sIMUvx9;V5}jk&xJsJPD64P=i&OsDuw{%P2W zrE(x_*OLx+lIy!+jHs9CB?k?Syp5$cpY`daW1V*C&{-s-DW%--rXxrv$*FGM7q{ISI1_vla2f@aSn6=m;zULv;UJ%8q*!qkldPcT72 zAQNl&bM;^MZ3aSIUf0==#XZ8TRZn0alZx%yF;lLEYkkK7u1_J^-BKY%=A?0O5~goL zZl-^;-a{%%i+`jT(H@}SOIXv_y}TO1+nyg^SHo?lZ!)tYu3|t+nf%247}wYx*c1vTkhx6Aw+(u;{eHl2c-Qm8 z*|b@6(VL`5!cl(2i=K^w_+38(c$dMBRaxa=;g&GH(Y!3vEF?LJS|V5Q;nATO)IO%> zSxNzaUmrI;cS-%CV9z+b6G`r9rRtMXOjK6rijmBg5H4;jFBZz#X9`M54CSTHW=;u) z=ess57bAp=h5#7b3@W9hY%#%>SF&8AY-jYx>c>QH)0qeww_5W#D|V@BUuXwzFku;Q z(VAz?Gfpk(r~pY3BA11y^#kA%ZN>sKO?r=d9)P%}bp()dleUoFv~7%{Re@kXA>2aL zWBo!ff%l|3z>c$65{+n|w&hCEH>vrlN%%@^`SBTwwcB0Vj`xvt>6`xR4oIhMJzHex0$!7b-W|E-B2JwnL zmgt6v+l?blVrQRkGfAuv*Sesfp^z4YKX?0|44QVkjk+bj!o*hZcDBHsCefMcGr(?H zRj(LXwt)&16GPv}mOwiK2v8!lg=RM^)6vSr6D9-ws9aZWFD zw$x=m;TD*RQL?Qdo)^>7oU55IQr0gAIm}^R;X>&T;fQSBx(srQWJYxpba5b*reQ80 z?bBGlsRWZF;q@8~qu&1!`G(-QN>`+8+Xr2$7Q%3fw(OpBg04HbeFTuDLyf3&HwPBa z5vc~xf-GV1(6Ok<*(dceO|0!0s#Cv|v1qMFkHE~?>@TL%{LancXgA6cbHx<`r`Jc+ z*VwTWNc`55cp3#BP~{a9iq-DG+p_&mxkGV=Ykq$$Jq+KT@^*LSD>wOH<@Ih9@9RbD z6k}>=Tr9VYs=v&|IZ@pn$gyM*$|8s@jq8R>1a)toCpS_2B#qs6aMeqN02_fv_zkUB z+qQ;eGLs&S;0!GZI)pB9feD{S zZIrTKX+#YjgJ&!W<+291GYC2Vwv!h=WPrtY0wyf{3#%q*=1(J#7kS;*2NYeMd~54kLUxOrcqGug>gKPUgnHJFRmj-)p}Q2eAmpf$UePN zs!w5uPe#N>h|QeYzRpjqSqQknzb6>f;~AC;jF@TZvCE1HMuf!*N@VI9VvGqUpkVR5)O zP4zH`Ba3OO44km36#+GgO9`=dhq9>-{Zi6Te{mC%92^Z_j;Pf`DNJV?rFN8JT?(qk zvWhmDqMBPHEdV`?7%68@k1|{Mni?D5CCCVV^QiN^9}nyQAu7JKFKO%Ll*+{bQ3+en zD_=^Xj^b6=+-!eP8UH8`7KzY_3T3kE0w?^Yx;qJ~0BaRF95aOfF8<|GwnIcCh zb_m;gx)OAm0BjXDa^W^ta9#w-Y;XH(t!F3pQxX-l+_NlE4wq_GH;^ksT$P?`YN4+f zH#$C^;s}IWJTOUaU544somxbaytj=funmc^3^m*_5}25^=}7(EYK$45B+7v!#&&wf zgs06#HE9+P{fbe1%QMSdP!v2nQ`c62$Fh|TNoCeKJj=HPI3Er^yUd;8Qr~i^O0@_% zh~$Mw@JFRA^ulEG9MPl}?0Wg(Cbee&?Ntz*6bta(S+~dV9XALRZNWuOgy+plN(eXh zdC<83Q;THw*wvo1jc8n9HEh$A^$t4g#-`W+Jj#9mk%bN)p)j8t`gVxcjJ&rKKgE`e z3kA%asFL)reApD?JDb^84hlnb>1K3zA;wEodfBKbV9CSJ%c8=t{3|e)`M`I6!4(E zbTbk9Ih?o8RnRB;VWRgM?}1mt);2z3Zo;zbI7yDOzB2QnQeZp*b#M>c<@H32Sf?I@ z;xbiIBzSfU;pGO;BzZvqdm>ln|CQ=U+j*Etv}DqCj)g$^4Y-{H`-?k9QR$rv4Y7au=6->?mU6&E^^E|0q42Jy+(G3{BT1D2 zL{fh}?w9CVB_7UQwc1!saIRAH6YVs`1S5c!m4c+!H%*iH&{byEF@vTCoJjiSDB`hg zk%2xX`xvOCf|c_KuCwM>33|r^y8;G*HHtd0F3`Ugv|NuSTi=s6IGmAf97jc*EfMWw zcH`IZwEedk5%S7nWjK5`hpIvlL`Bs)saqm4wH&@#z}T!<^Q@8AX)?VtD8VRC`Fs>P znMSRrM1}5%p{-#jhjF02R)A;?-yOXO%qy zQhcY+vsN_sc+lPTJ^kJ&(<2EQokS3Fm_cmHXFE{eC}l6ta8KVfFxwcEDK3fkph@mN zCf0OtO#*jnBo>t}%yKr*nIgh|F9RLNA^zb0lxIRE^>L2$iUtX=n+cVrU-@SJrvX~J z{Zw|8r?T&4N~S6snN5@O;!e^$17VU9Yf^KuC2bk+GG%6Y5*eVVcjPMnMCS(~9Ps-gAPDf_Gp@ZnbcV+M1DXe>b(MlKG@ zcw4c%{d=U{CPbg3S)H9IOs0K*1u}D1&}H}f8!xjYWt7mI@rL^-4&G&s)qe3 zB@%!QK&1;D`>%D3ZfrT?E1iX<9HYcr^CG|UBhQu!&75AX-~)H?IDXHXUlO393PZ?c zkKpE55W+7EJgj4u%*OHnq;NW`8ZvZkg}mA-N>L<`t)~T z;V+c^TM-GB+xv`1xQUXySmkAAZO53;nLBjPhr&5Kj~%W)o2C5TRpKEW#6j7&1yDFt6B14cn?!xB0g?@Q zWqc;Ba}sPRI!4Z68?1FM#55p$eS{uSK0FFaEoI9hw!3`9$V;$TF4~U00_Mj*zvhS1 z6_l5!{2s-;)q3M6<$GxtCBxm+B+B)ab)4B0*a8Fdq~^?%`^P@MJib@4TTQZf$Lzti ziu;-dD^E7QFz>RJ^zI#GgFG!dfP7shw^Uy2lM+BwD0wa2Z~0vP#lVysxa_>F90CeT z;as|nuGL%!tI;&Ga0Svy3?S56%OsUs&v0YE7>yV5q9vs5IRrG)0m@9ob5JoL?OOCyIRAubE*9RbM_UbSVQwk2 z=B&vZs`>z(c8S&G9%gc*bvQV#@lw0`uY!xSqwq(~*=AJBnI7*x zJ;v8ReMf7sn;P2yPfhj6==Jn!36tY8MZ$+;Q1QK&p#}*({FwB41P{xdzDuFxX#G({{h+; zRg1pW90lXoa-vs5y~lmdDHhA6`t?0pMcfK4o2TN){!kCyHUE%8P@>Sre&23yEx177wCZJ~(q(56 z@*0dmL&t8_ZThSH(bfR)uy?OHjosJGeN&LzbrJi-9r|<7QS*2k{%Z23*ML9B#EPGz zW3AhYGLTwt_%^y7p5*r0WLIlbFBN<#2Z61I1-OL(8}WIK$Js;6b5|ivF~}+BAyq`k z1-EA4y5!3Wg`#4s@+Z=-onF_b+@0|W2Chamg+8xr8k||%0J6hk%4QuWzaIZ5xiT=` zC_d7Zc^!}yjmmHy1O2);=l0PX*bc^4RTrae1jmMTrHEB%?30Ma6jx4tGuKUdA8gVi ztndM7LzjUCaamH+=u<@9CD5c7iBZS2`?-5dV;IIiNs`+ygYM-1>s@YDUoZG%)Nk3p zDYyRHJ;rUm6nI|-9*7&JJ=d+qZQF9tC?MCXgWma^y1+=vDfv2+5{z9_+b}1xAQAzLzRAn^g)!yjapIi-p#;HJUi%gr|uWSsG*zfqxMI%faF8F zjrlW&DAW99<=>p+YDXQu=DJKVKGfPpf4ZE|r#YNHi?3j0e*&^QPjhO&OkDl;AEx`4 z1%Qiak-!`uxX!F;AZPf!lp4@dKasx*OnS19vYz%zb&B(Gx!R;~fa;6O));`y#j#EL zTbqMj=TFk4dk^{)R8NC7rh(llPIs{~10Jg}%D3267vH`0zqQ7gMOj;$iM6UjW5;HT z&7Wl#bTt2J{IPsLOY+`+R{Sr;D7%;> zQZSFUZjLk)C<;nw{5X%J8MZ49T^nC=E+)q11bDT~Cb7xUzF$>swx?!%HXl{0E-@5! zsU8QBWWe2&4(+W@I~)(>k3KitvA_8|7hon@;RP2r>_Ey}S^?dp-1w%C1EysHdZg71 zwl1u9CMHLN0vnS>KGdLbdOe_mt|K4pK&7i&TGMQ+B!Lvq_=3&>FPD+oTR+PYh;vB& z^~`(QQ-An;2s*3f?m1A!Rr&*H7P;H(n{M8on4j#+?>Q(f7^(%pB(?jltyJfo(X6Na zf-2XMbjA*GTgOW9PfZ21)3q;M_tcg-lz(zZe-7sD3b#q9TPYB_a{cpYFGaoXb8u9~sJR^5D(9xxLCI$X zleUI-yQM_=K3UhJ6k!EJF+`{LeMe!%sF0@f@D`Kt#LEIbt?NOkv1XWM)&&w>O9xrN zK8wq*GIx-#c{beP<>9N|(d4ymOZSPM<q`C^jupg)%&Ykg z%25ymqdWb0#>T|ph_<2x>Mvx@@kCEjRhqjlkM^RCLAh8$PAEy!$9FTMM!g;kS>uf; zJk2N&1;{uBX4#atCXe7o^67>NB`|^Y7&8@va4e@;IUQfo;PHG^eSx&s>SA<8jBhFb zGUv-EAo9CDDcd^)2rvECfFxO~<%_b4d$x2BN zb21hMWQZ?Ue)PPvQku195$UpW?{u$$W2_N?Y+h0afXn+A);`z-OgL*$ZVo+zlHTpA zPlrLoh@-u7!=A2Q2Khi4MlKY1y~-tvaVc}^;FI$ot{@@vHanW`{cX!Zx#^Fdh;xpW zaUr1f=mkNLLxhcO)AGZlB))>d&uth%Ecv4AQsU0mtZO*GEJQC9ak_C~N`hce8hM(6 zpqN;af#{@tE8IK$BU@V2&*FhwR9K6Cl5YrhGHj~?uA|r+;~%E!9rgUANf*v73LGhf z0Ao|jKVZ9MJLtUG)kpS{6v5x3q<) z=+7T$TS_j>^E(D;4CEuSaAN>^v4n%< z)#e~pKDUjtw5zQIbd@c1SBbSzF%W>e9IS+Ws#TYdHdfys@(E0-7#7-&0f$|?yABSF z&;Y6&=**Uso;_$)D1+iq^UhmCw7T7bl}CB!RCRPANTNg$iIN%jgV@~-V9_mD&77wh z7L#X5vJhJZ>ql`%Gd^%04sk0EvV-8cr}QU3mcKZVDmv|ad1Wz3!l&O)puf_bv{M3> z^LeQPn#~9$T^%S6vHCDXdbhKia`efFQ$7lmu;jV|a1B`(jVfLvIL>vcoYfkrOx!oQ zrskKfwpgbZ$(1}$s39`tl7=$Vy0ArBf|_3^K2}XRLs`_J7KW7|J?(sKaCWN@2t|fM z%|a4D?nx^>H4s>>@kG{0v4<;~7H@5~ch2Np%JehOS@H!^liF>$m{r=8Y1GjE1$Xt3 zlui`di=>-zd8INbn%Lw+G=Xod`)&tWGrE=aqOSu}-hC16ddUlio<1l8^+B1q3gfe1 z6DRVYN9vFhO`_$hEp%P+lmdhlFqi{wE8iWS)g1Y>RuOYU&LbF@yxH{X^P{)zfL}-T zmGr)vp9kEUlBBq8+_KObaK8?~Ia|x@VctTytX&W6GAljU1{1{yuhYCV?P0N`VI^l-Zr= znX(7T7>nk~;6`Sq4YcLVDH$LeqzHJri_yq?Cj5R~61uGG1Z;X5`-E9B6fUVcK+arx zovxk;NglV6n7g@>vKmmJqgAj}wRGP~yR_jB^hAX&tgRD)%%!NyiGVJJhiN zYTWKTwlm)Ffc!tLTmV|RYI$y}=2fIZpt8epC~a_L(HZ?fP)TM zasFkR2EbMDIf0ZxZgJz0t1#x^mfBudrDd-x5Qo@QQ%Ev%tSyLs_1SXn%8nw#?YVPX#ivl_oA~kef@wl@8yj?PT>!e2q7=&5lFxWS*5mu6;@F zYgzZr3zORt3_tm9v?d&1E%EP`RrSoKr%RuNDVFG~@p=ZyE{L_UkjD|dyHs5w{$?xc zSEx%TP2)A0drM>3Oi)pZ-_jV!(U{8F)GXNx{b#~VKUx4XQa}0$x0UW#CnRgOGFsAl z5b6=gG&^X2#5t|uy94I|`=6VFXgXjwf2|Rl)QXf_vOV?R9SJnjZbV9x?(X}gx_t0W zpM^%1o32$Y4{!#wrtV22jR0|+gJkOQLcl3}>Yn_?&t1BB;yu0K0PBsR=-u4Dm486t z-KC#qsd?BXe1~r2emSwbPj>HAI%aeQ9IUGo{OZ^%i8;T=#q)~RC*s`$xGgPC1Mrov zFL#R$OuCv}wO}9HmKQZ9&5k3MdG=n34r$M5f@kA(!>1&Ib^2k5%UEqora3qDV62$f z+y7UjYh&rSSQNKp<(p`o?#7B)8*3)Lz_kY>eJYonfasw-ts0^=*^odFX$gnjel-j8 z-4(3?zS9pU#nHcG*9#$rxT1{zSL8bzlcN;4Q8_XvcI6GJHX6&L=W>4}+3y*;R{?g2nbQ@VAcp?jp(x1R3 zs$)R`{sZNY&Z+u-Z9FyHjcd(&O*9p=EQRStkJ{v{Da65!=0l5jBH6LjTDYQi7 zRUY8^dN%3XhIEV8%@Ta?2dDgk-h@I)9Oc$wlSIF-`IM?126!cQ4V=TUX4nM9d=>y% zTFija+gio9)d-GejNA4XWv#Qh>y4gkZX%v)fzM+UFN^@&mR zxu4=MdcF^h?tAhrfL9*(s5294UMj9^6Wp{|;mN8Huw}wt9ORD1A1J1_o}>pLu%&_{ zFuAY;ZkRuGaZ7(cg9SfI$h9~Xz3ib-Y87R*!%)mgA5*e1p!E1+wrL&op|>6d8;xCq ztB0(~+`dI1rg{tDcT1b!Zky-^bZ1<2Y6h34_~i~ZTD?aXhCkm;SWOq$Ed+rFyn+4& zZG<<{2Y-@CZ9-{5t2;ybHQ%?XEC2A1#3|T)s)8k?s zRerqi^_u@J?mwb`i}Mem`myOJldeD$QH$>l)3VwoXiM2C*^W=XZ8LQWs(p1<9cn@o zvVH)(^DUqx!1+l<b+X9|0`61?s?DO*rhG%m>d0m}iNS2)$L&`TD>6bU->J%2}Oh2+QC;^Zfk9I2b>t9d+>}eVuXsLMy1xw;>(lDT|Ae>3!04dQ-_9x*}P5%Tb{$Kzu?^ zvThgAb}&qlEZ~@b0%o2&yP+9LF9)@8X#wm3Nt85$<&%W*42?y-TnHj6<*VoP{t7)G zcVhiwM8?#%#(U1#yFbzh6Yb7-PB{M7&($0R==E-aJ%R)jWh7Dctv@6bpu$QQlyz=H zxc(~1jq#jOI>`AXp7k4nK@?3kpoxY^T#Nuo{*Skq`2dz`YDha8H(z zV%OHsK=lKiz`7ITqdc#5>lXl+Eo)@$R=bMzz5KFT=3C57-Z={3PoHw&TNL6f@T=?P zH>qi5R+Ie{yM9LsV8sLR zy2#O*o_4Qxnx1i2EUA>uZiS>WtFyz)$O@Pw;%bEcQh|Y{NKWS)&ici9deLeGVCk!e z6p8|xTdebk8G{ZI@|Yf&Z5KAHBl%(TpmsQKx8_EP_LLA3>3N<&^SyNwd4jS~lVm=lBI6EfkBrTxjBaDxlXkx6b9gND4^XrYL z#}*EISvt23o&lhK!UatjngBZhx0t56bIqzZ!;pSWwYi(9&-jCSo#^eq2s-5RX_c$v zXe6NR^F!i+R!ihrzfc>qgcAoraStI_-V%M)HD9oBie>#_DajDavCfZ{Jvwk1Txc$9 zFlU$O=kpTZ_3cMPu&;ZHm&@%Jg6{8Bt$55C)%u^=?W|h{Y27nD@RVuhLwL-?N&7Q| zPDF#|ZC}RC!v^)FCVR@@iN#N`8DMec;&?T%xA+PKpdsh&L zGwJO+XjG%R_iA|~CxxwzPl7$Lx!{g_cpU&F2?ap4;D5B4zo4=si=;}t{@TrRN6rl` z$4u{UWIC=~-+Zd&_N`O^j`Xzc(i|N(h_c9V+fD&03e!4n#;=WaiM!1HXpj`~d>U}( z?W%P^6w`RY93TXTI{?sHQf4M`2*w?t5AU@EUsAL!E(*J}23bCp-!aux$`E;^UHyZtXL=h>@O|Q-%TGLLD8OXm=uA&o`=9el(CEoC}MU zr~oGLUxP7d8u@rxiu4DbQZJCG9G@9S+RLHc7nB; zQ#iZ=3eo25<6hb&+W~ZO7XmIXiTEbj76UEgM(>WZ@*)7GS{vqVxe75llHt;q0MB}v zN*g^FEtfGmIWgsQ<@Ii{{D|v|BO}-5)d)bq{4z2(>0!&*E}{qcPXMF8&>PqqpDH-! z$W1(9So~`@XqaA`k~L#y3EWEuj$-C64^|5ZUEFU$Gpm%wzA?%(O)gR#WFhD3dmT0% z`$|f##Ga%R6lWoYUI`Apzj7ybc2(Gl^Ev*83f0bqy0V{Vc&(UnZW+I#%M2(NB|g=+ z7OdiMfA_3!%tJQ*?nCZx`gYpfHE`f8Ql;q$2PiqeRW+j5Z=!udW=u8?!|yh2f}9kBggx_S}cP;bT>~R z5;qO_f(=Vua{I56sfii2&EbVAOF*fMDE{vD;H=GdY;0w8(B?{r%MLtUe`~ck+3ze- z5QcETMIs7-TEn1L#x5H=8tpCnwL#94QefZIr6glx7DdZ@H}r2Z>;_ibb?AbnQGrUy zl}LMDbDx>pHRJ4LMbux?Q}Dm2lTnf3=NW!}KFydbFYhVv^EiVfJfYUq z0f{{T*<91DK~A&1)>;avj<55~EK*t~o?n^xA7nxjcMKUE-d;X#7^Vau-XwqzKq5jl z2Z&8A<$==oj-6xDB!_<@CJY==w{U3hR8Kdm$aQ02uWw%D*Rq<|X4_&6&0?|Y00wC` z)R>Oe_dM2t+rH{i+7YpKLUZdeR_ATRyv(PZt{~I6$|JRZIlX;${%#mNHcfOpt^S&Ip>Qb3uKa4YvM$e zBi<+=w)g#a3E^7x4v=PGSYLXP?0-CBZt_%ccz5W!&N!R+Vn`upGI9OaBf#68m+os8 zNHnFuwF0Z{+qI?_3qbJ_rln!nK`#QqAWJ{o%P9+hv zA??pq@SQX8$>WyNKF4BDx<}#W_sE%iJV*+98iM10AbX_Cb5C*>d4yx+grjiINOXNr zy$3lOTEmN5&ZiDHu+njIPEN0ukG5`-iMUNOBw?0T?lE<#bK!XdzZMWgGrM>H#lgA@ zaS9N{!%EwrK)6~l#)17Uzpp^ka#8JB%7~di;{7acd$+2H`0H%BK2N1>b8h(FKF(_- zLA$Q@3>ZmRU}TnDp#aqau$qsAoaJ|l9J0@BYb&_l6O+Qg1!j5qPAe1|PRNOgeTH?z z#_VcqzK=haAG3cp@FP%Q!wx>zm2&Kt($9c_0G#7kW!S%5qTAVj_%gAvWfwrvDK+6Z zHZY%Q`-f~G;2|z=N7vtX+$N_PdIE(2j>esgQPbUIpAv2eTpN@oH>^?{@E|ZSXlPKx z$}V>D{G_u_)?n;|uEnv)86L-MQ!7g}|LicN%q7A`1n9WS5(`+W`qjopHM6-!w!6td zu|;G+C%A86H}p>LuR4@b)m7W2{pJHwQmp_H@jn%61_2saXQRW?lSHrc#Gb57HDu74 z2-xII*1z6@v8=l9sPG*4XA9F`09zl7lL8`9CnCE8s@;7O^{V&tlQ0`05b94^=iJ5U zR8DK517AbSkKIq%O?SOY^j6lJt&FH7DHZz(i{dx=6%GG~tuK#6PIVGl%Qhh<#=aKAWQNfu>tGO>2}Ra1WSJRe48QlI zb3Whm{k^__RTIxV&--~V_kG>hb=@}$82ulFo}bF*U9o#1I{L2?7nnGa_ly_g6tI=Q z1!CBYfrA|ej$gzC4FKF_8DA>+7{91YzCNYkWz3c%cM#;{PaY6}x2Q*ysZZ4Wy{M z(MYH?2ml}t)vqSd=rkC~&tQ96@5d_FoXU{bVBhTdD_EGD3Ia*!m|wmbtCV(l4Fs!q zq%us-MO_29)wZah+xM42G0Dq&XMYA{r4i;UnMDMAYGVE+X=z2_l+;wTK-*KB7 z*~^tLKZXbLVAMPj*RvqY_ZVnsY*(_(zLglVI?rGBnUK9Mc&BQqvQu2E7YO?4aD4th zS#aR|lybG3W~D!20msf*ra~G8Y)(j5q+1N*JtzGrS-H}Jf7H!k)Lu|Z_j6YJ|4GcWvcs>lFDeTeqDo-FJ1`%^odf+w2sP zecERxp?&PZAhFgsgqII@GsYBXH1$V@01>~(gk;^v`m42jLGTMUPFt?0M#JbIO-EHX zJ!G%LM%D zJ5CaXWkheVupIOqtFYb;&nA>Fy|OEM9k`>gx{|W0`sFmVN1D+RLFn3$%?UsBdAW8~ z7S9x_t|(%BYaGub%iur@(pqZBy?N9epO705LXn`-=|1F&%?ntJ0;kvNMe!TE9l5cW zWJYojnB*f_;tQUHB~Uo&#K3;1vm+q&(OT9rKkG|M*_;Y^0}kYZ&x!z;DvIfxOt6^j z-PPyhW+@o_v`&tc|794lB8#AC(1P z=Ig@sP3OrINR28ub2hLN1K&VLOy`)Hn3~Gl3=8rTt8_ayS~JrYKB7=cc`eSq=!S+! zw;E9`O1mD4GWVFeHt_TdZVovbXXZ4DWWE=lT+P~<2@EZ=DBA;?_8ZEqsQRx5q?~bJ zJDo??_<_aOnrFDYl~6{_rJFilYgF_C?@Y+9MY%I zB892iGabjdh!Pn@Vp*$gWr*6QOZd=){LlWO-}c+;yIb}Va%pM{iZ*+s*NP<(^)1{! zY-3L9n#8QhN<;%FR(O0r3vj%5pMhQu+o7I8rbqz5VyWT_R0uaqssC)3n%{9?@at@H z>iPK&8_V|NgHvff5>p*Yu;jdlu=#JPok zxB?L)C>@^qCrJMN!`Dk#%q7bG>On&T!Q~ejGyli=F?^BOYBSh~Cp}$Iswn%z1(0UL z+z>IbzbCvx+x-oqnrXcm%1{$4J!mJK6)HRPnj9OZ1(N7(6CchPpA&~04Zpm$HG938{{!YEojua5-eT7R9k7?hgc`IO%68|okJ z<=UwGV(aW5%sqHj_twbA=dZ8c*Sn3YOMTX5FnJD)*#v|wP-F<|5wyF}iG;K1w6FiE zZEEtU$Xt>F^_#!Y~@e{AGTde<< zej3WZoSTsM!CCpNI(6lNvF@e(Ybt&oS{dVDM22Ced%6G-;)Hu5m=r;7(r3=?K@>(m zIuFPXJrSs~{1f1Z>?BSXK>67JXNM*(e=aV9)bNNPNcAQc(K+m+Ng%e%h>-*lfXdiL5ob{4F>8{@2lJxu^6Vu~0)M~b@U zzFyO*t7knR7Tkxj}qx3S>&cd^<`9lh+G)i z;|J^Fb*@2>GmG=I2VG;pYq3-&BX`pRr)#_agKXh zY&I0Z#mvqGrt|*c=Z(ZKSrx85MCQ2f*9yvaTzR8VXTc3Eq+WrMm5&Xxg}ZMG0qWWK zNT8r-*iyHm3iXL%)Wr4EEWs>hTUJ2foJ!dKp}u(CKc8*|e+&6j9Wk(E8=&u`Mqg$5 zgNi016XxFyQBxjWojlmZd(Ey8od7BUJm98i+OAD)pWR95ki*?v+Ew@`YbScdT=%t- zqe@@I(6l_oKy>~DMQ~8}Pklid?nMXImF>s~P8Y=Iq->dHm|-Lgrj`dxFy4%Q+@w@O z!1Cjxr&14M-uP{&Mi+h^)0WwIIT8sn+t!nyi02Z3wXU2CuwJy+cYg$E0iUvHR{|@@ zAc58(yYxw$(mR6|5qKHI%ji{(2^2(y1GNhSo1DC|&5kbU=V_res~zFaeOd=2GM5i% z;lvhwe&}phhCJSYXLYylE$UaFA)9aOHE&KXp6=zQbe*Rr z4x~BJ_j2}WFsAI!Ot z#*d+^%9}bSKR{~^GcRu~7li!GFG%Fcw-7m01r>MjY76`UIQ%Y5OlzEaY5>7kRzREk zlzgg*T%+1GhfpTv>A!^@RbhRFV}qhR{O?UOofEa{c+xTDfPdu5f4gfcvyFq!Y! z2`o+vaJpN5R#zHn&*B9N@^$qofMzw{xVn+gelN(H^BHz?>U72P>4@`R--s&^^|7o4+Cr}RIOX1~v71g~D zDAd)bEgu3ZE=js1jk{Q9u)neVy&@mwoGS~;o&`$=*fy+gLz`OF&<#BvORMHvdSSTF zyh_-2Xwh$nPoMUcOF|$(!Gc)nr~D4J1#ib$ubK`cek1TQLGvL`of2^?Bx8$J<#pt2 ziKKYS>4!}>-rG;+V)zA)AZ)4AWv%U6Wa9|>HohDZ{$4=q!3e)DQVoPC-9|DXTQXoT z_QZdm?Nz?5>M^=7wt7Z)_Z9HaS;=|@Blgw(hRL7^BHN!7Yo}{nC2+8IoLxS=(A2Y0 zY-K5SFtINpO=0u7^d`Iu__cYuEhCA;Hjj+ht~!@~+IAt>w)b95nR^LHl&~@nIk|`g z*+P~~$J#@GP19U~srIo~-z+&knk2a`P{>0;3{?`*Y7JiIm>k&nNtCUs_yR$6EUz1@ zU_LCTLDqRVUlqi?P^zCGdzw9-*fv}w=h&5`6i24u9cL*Ud&FTchL{0gv7Fz0+(riG zN6dtyNb!;D)a|U43E=TW`PJh3hNk9|Hf}#7vQY2r$9PaMdIF|$T9P7rzsRI2D2U3>t}qfKy|nN7X8#6%u&J7-(PXwxcZXQc7)QwpmkEU)nd#?p%vI*cTF=uX4M}N(JBcl~z9W*5U?VUaz z<&s4)o>5&~J7Flee~GV5z%54Nal6>#w#AYWRpU2TTvx&>Y(0+wR=&Rf{AymFU%|O< zy;#zmGo!i7ai1{QkP86S zooHY0>G40>tqwV9WS?3ByvB?@i8}JXJ}nl*v#pY!Q)v;!`x$J9Rx3PVso0FHP>(5o&{4YS{gugI)Zw5iUGgaH^>N1S~-zmqqK^~mq>hK#BZ2Y zoH?oPU1AUbIE&!OsVBU zl)Z21Bm3O43E+H64bO?Ay1EI9Dmq{|0a6Xw9E%8f40D2XOYIQop+05LRpM2@Ne}Ai|@Mv~MWY;mq(Iy;>6ByAw^K z$gz}iONtOZ>~dsD0^LqgLTmCj2GLj{T2kjt9YVLe*`rD!!4m+rbFx#UX2z91H)p!^ z5%HU5n5-t(cnIj~A}Li#o~y+$i)8>O7huv|o{?OL?2AVyLseq)!jQ}1m`|7Cbf9!e zF}Cp_Db<#}>VwEuAYO2#pc9_&7bOvg`U!2ED%@aJT)MknH>n8lPLMH55zJ&#YzO34 zpn)h<@CPI;2NtcPPFhseM`&4p^9fn4>R|WXosVCDA|vc^{pTRjG18zVceCEW2=CeK z5gzSncgEsq$RRh7g>qD-`YpwBJA>fw_2xd(Dx!+#8-uWQhT(iXR%HTCPKWaW$i#SQ zSpgtV{i^b*^L`xC{IK1vnfZw$6BR;$IyLIdiP;>nFu{()x`upBOo$ru&+%DhQ-MO@ z+2KY+GqEM>vjvaIiSqXP1vXy%!#2QShTJjjn3@Mpy`GTUydM$vu?CL;{C20Zf&om| zl2HTEH}lLsSe8I0KOnjf;vej?5k{mre6ohPSCt?hF-;Fed*v*FZDe{D9E0v9$RfFi zE3>;+j*!CY6@zxw@*jb{1_^j;fi7)F=;j-v(XDeEq~P^3RuUM6fB@JqgC zdp1o)Zk$|*JWBV-jZ_mQpFB0pk)~tTbylTVmg^1m<8iTdX=6Ik#{>RMNO>zG309 zhWG1}jG{**u6bm`xz9U%wx}f5*#3_(VEgY;e^emhI3f;eSHc&U|Cs$XuTLzh%kVO+ z)kY-Yic&*Cn=wp&wpaI-gg5tuIpA`VgRrl8bhBWinvGA!A5B)Kp&fDm3Eg0=n z=J0020o-%JdM=#X= zSsX{cpPlZHSt-p|LWHFWF5L}iCDN1 z+S9BX1z4{=DF9@8CLoy=9eim_to-BxW_Ga=9_k? z@348QSB1hqym&)DdzI^ToGbW2LmXiJ&x%0uwedDv^9cmo?k$%5V=6odG9Xwhs6$i) z&)DPCTdp4Wr$7$HZ>U90XZt83voc?ypn5PH1m)8ZXt?GEdicY1@<@ zq%n|0%ss*Xt_~N3>EXFC0MvN)9KdZz_tdhOeyv$;dedb7Uc|kQtT-%v15V!E55>ZL z(la?Ww}cc+sw^z(eHT_;u+1JZabX6H8;>X)=7!8sJwUD8Hf%kapKF5%!It7|Y)+KE zap3+1UH&@hlkU@r!h^lQgnR4gKhy?zQRY1bF)&4Yz@pq%d=eRe)eS*u}TX!e7NXXZe;ivvzbUH*YxA3-af2Dt=vulzbmO% zf=j5i%bx&l(jKc{H#}&%)U{w}ik>i!K)TVq63l?+>pDg~{qBvaGmV_nS(oep>ETOf3*_rg*&oN2U&m%O`cLfAlSJmV6#D38MhT01p8Q=*P5hcutjtl=|k%+RtIop8H9Z}1e@v5dlxTFIJbuvf1&N?3p z{z#*KSO!I8@P-Z3LwA;3?vHT~1~E?3mZO!~-J*-n_dr{il^J-sm!RYKg39i${k;MR zwE6`cFX(7R$d)J7Z8G`+Y5c9qa7ND6U|>(|6B+W3j6P2vA%v1cyghDLhat*+T(1&y zI$$y!K(&#Y`Jb|4-EHJ1*eMdQB3XS(ncfbK?7E?sdYVXlp@`E4y&9gL_R97{RlCPs z6OjA-yuXy_$8dJ)%p@|DteL8r#?uAJoDSlB{-X6g%b>>OWlYj`D3DHgl z2T3y7+6C;e3jF0ZtIb2ho2!&}T>VhJr=HFxNt$iPxc=2uD2&(Hu!MOZ?8KuzKE7WI zC~g~`OF^bB;Wb^AVIL=I>u?~_d9q{lYLhb9;*m2i9A^jDr+L{?6J-_4zjtYE#&OCf zso`^!(T@lttE2653%ea>tut){S?12pCerF}AOQLp3i7x+jI)xt4pxWz<28vcFjp%5 zPxN%%E&z{w&GOMgoXBtChq&ET9btjf4;5)dve$^`pF zT(aF>`TW>ic5K@P<=}LZl4aQ_bZ)+nyygNp%YxE74m2!#*NPd{W>6RVJ?l=a{=m-E zC%-fwcQ4<*?G6EipS1FCmFWd~kmF~b&8b*o_r^u=+gQ5&XRoi;9Z~O+U_0_%DV(l$ zo8SkS>QN=3RnPuD>ygkC|Gff$I^f^+3}HH3{SLB>by1@H=hsb$NApPBUO0XKj66U- z--NR|81!L0==cCA5N0J|=hKKe_v66?dbGoFRy_Zt^{HgtAGV%tPY&+_4T`BQ9Q|K2 zubn3a!OE5(HJIBEzzy7zF&72wA3Z?5jFm$Np+o`ruj86CtLru`D2K&T5LlNUffvLq z?B>^RJ`_+P7E{pzJ1F8%g?4~bZOHgt>g3A>p;qGL^p*`h2aoMY0+(r4Fij_QTnHYT zP!iJRHB#h@T>5^j*SR@}=1KQ;)}3)?acSj?grPACJAxr>5uD%lQCL)T*uzsGMPZe0 zS{a7}ds!>lQ#4M(1E~(zftn^=XA!e>* zqGPF&uu)LS_LjMY?cq^av9TI#)LL!*UX%!+fF~;_7G+Y{O zVf5a_Ht$TFyRMufBnn3~34!48bl=~!DBsEkJjB*^?qpcr=pug02TT`70CcAvn^);k zA0of}Xr%dLQH=56$kp7SVzT%?Q3i%3FJqdBUkbR0InEe3W`G@`91$$qFmpCsTv zc`)eQ`A%|Bq(O7}Z=yCqK?%_pcH{{N(Cpf9HkdCnJJ9Y64Hl{%4_QIH>gdAlby*M>}Wz&>{O_TM0EZ1tp@czDr z(q@l$3hjaH8fV{wnNb1bVD7i1Hhf+m;?7quKElhy*8=Ym^?xLXfOfOk$p-T;YCy&cx&2^ zk#DyKn2>%C*6C40Dx*{X@UYD-8zCMx1gnwd&C^M{g@vU_`a)!E?74(rL9AdG3+j8` z?@9~n9&FKE92||$(Lz2I+=j}+)=LMk1}SZwQC?fQv`8WCy-#FNV`GthpruwWI!FS_ z+hlQ_J7gSZqh@w3KvrqjIIsBxYPTrJ1h4DrLO)P^+`R-VXAVDdc8xmYR_pkc=69by z-kT#COc@TDX%l6-0~WH?c|Z(LF37=q#e{=I*QGKrzl!#_$%-r_%Jk!(;^~b{Zsn+H z(xB*|OzytGhhKjXYgAOpyN~i3YbeW=8fNU zGsNwu*TFmq8Ni$*xE3JGQy?G!Ar}H+1{_89qr@D^MHZ4CNdgF=BVZEPr6&V5@{5z^ zjfB?UyG>JGT!jwlw7(SD5(a-WsL@1d_}pW+4(fC6CENq^HagotmB9fFo!x0@=z1K% z(7~l|0IuG)Y!He7y%#&DQ2Qv;B+@HsU@qW{42?g(E5KUsyeP!ac9U+iNt*n_Co~tL zv$p{L{uOi!wj?|CwRoPN?4~vyLl<13SNiKmv=nroM&S9E_zxw0!pXGpn`12wvCA{d zi_Wvu!#Lh6UnlZ#{90&s$Xa6Ix;9yBG7B|HL{_Or!(Dv_1O?6Ur2O}at7x7dgq#2_ zbB`ndX^ z@d;&io9)KRE8ngZZxV(^DdWBFOeal?$(KAY-EM9DqUE`|+zmExSRutmLy~^&i=^~X zmj<=vHAM|_!{{?t4)Y=smc?}&@xa2fx*Mu0G%*pOaYN6;v*1mkzjassu&pOM?WE^O;;mvu*y7pEOIq`es*^PWLG?8emndauY z*T_P?C>&@~CtsBaSTP`spU#1T0GByy6G;!K6_rv^Ti5=!WMPRsgATZH(rl;TN=@Tx zWa*v$j=_y}Ns%Z2qYDwZjJOb_mLrd5!7Do#xA-~#Kc44rdn#wU&`JDpFnU0rK2u$f z@_%+s5&i?7R(q|c#!!u(4nV~=NGmyVy;QFsr=Zt2k4&FiIN&yU8(0K|*6$5!3>Tdb zoymO$ENyFwU` zio>P$*`E`BDE4^ns&_PSKm|F>wCHW8?PPK2uey77AfvKSBO*&c{J0H%82qbmE53yf z-B38!<_dy==?qZ4pS^pOmeLy)6g|hb5vESaQ`o<_X9sHtE|$<8lSKuz0HtjAjQi)|IMCjg}48Pc^GiF#5!^7F60Cs-mbN zkUc(t@&m*MR#E_62&%{umXDvKum<*(@8OIyZa8ILEB@0o&ha+WILlg(ld0Qzj5{^? z_UXTM3Uv>ax9j#>R*f`X8Fyw-0n=G6L7^@y$;I`0`s5U&pC9TaXf)>f5%+;LUjxAH z{^LoRH(eY*W%k*4X_%7CI3$k6F5T~egQ@8BKMe!AV4~R_y~JT4xnZC_g=aPY4%An; z2}phAQLj3cEQHR8*Ol8oJeV{P#&7$2UPEZBaHS3nuP4BRT(~1z%O4|}UO0X-tF>0V zb_gr!Iy1z)acH##vlv5l6|pF;qyPahU8F!!E--w$iv=DW)N2@(w!Ve+c=IU}S8JaU z#ovAi%iX(@AE`#F|C-B*Do|<`I-ges$*C!z()*w5uSR;;2S0v&KmOjxU{2OURM6G>1pJDXA_gLoFrvwm?N@U(#e zH+(bYERZYxIt;Qwax3VYK)4!}Zai)`V>*V0gAsH*GzbQt27~C>_{@SeC zV?SN`Z6M}r@O)eL_FD5^^tj*%{l<%oNzx`@es6ci8N(>`<8&w?Ya)fIgCWk1?2laS zbg~7d9>2lE%*5TaTJ1eBoBQCwjzb5^HrcYyEjRf)*R1|m$3J1mo8F06bz^Kjo$_R> z={4rdN5bV$1L$B85n-o?@*$(`Mt$g+9os$%z*;FhvjpUeDf#-FEj!S>{A;M_a!$aW z>`hIPGcT$FX3AObqg2M4YiHCKD|w)V*%ppf*XLxC!hLQ%u$;xZ$yeo%?;e8l9pbNH zl*FmiqtC<1fH-5RIPe3o-$0c3h~cbGzkH`kO&Q=K9xF(~J8Y3puS-z)kqn2+ur_bd znux}F&%ay)A6-)n+7NzGUs6&(-2GdSgp1q1*)$_Jn(}&Y!0!I&)FR#ui7AKczhy_O zC09=h)jxl~4saw6eqXKrY zcJp1N$E(*7)SYnw%Q^c&SPKMaXQ^d@Mpi3fY}NJr4Uf@9`$8}3e)7Tz(-z^p@ed?P zt=guc7kC&`FDAK&FwAvrXBByFYBpqKEybk-r-PFj|gx!3Z$l03;bHt~SsQMnL)IvXP#GOG{@EKDWr_KvK47B7r! z&C!6Dh9F-&NxhSbCTnf{mnK_PawvbRn%&qFasX0f?m|%GcJC41Cx7T�L_Px76&g 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

%&+GF|0elmyORkel6LVuSnj9I7-`ncY1$ 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]edKbVXLXjnN#WOYaXjtkq0_w*rX#K1$xPZA_JcIgUOYu$n++c%tD^-{% znXlIzh&w~n%4B_UsYek3)UDqrqsr`4w^VCb;Mv+{&NtLQBvHH3VcK15UV4uyL4UG@ zdjA-$Q74!bS`Xme>2^G;Kb@KBlcgU8;TM5N9j8K^>&ZPPe))|Cq>3W)t=9-m){PzvnVll0#5pNL(gAeki0es;(QPfqcxAT2h0uvQ#qQNVx@E4QB?;*rggEP>Btx#` zqF1LhP|)Of8~>rtf1}2v;rVynNw8|zGi8o~brW}X*8+m+ipbnimXK?8oBvlNPJWOo z@xx+1C~Q|FjBz zsD`Ymoo*|jfvltK7>nnEqZ}Z9Gz#4phBA1z{vF0dD?hCKh{*)mRNdAceK!lOucRND z`Aao}nPXmj>%q(VR!O1iSu${kS|Q7W)KgE|LalJF{jY6QyyK>Z3)LIg=lmn!bK#Ff*O^F7zhn{Z&SkC9XKX&b{`?-# z*>|D&urH2OUdRAgp%xG zU;M||>tc*xQ-l!kWAb5lH%@yn0w?^d$4r{S)V$#42vsV?ntdsr`%ehJo%IaDlIvr; zdf1#Um$<6HH)KrM8bru1sOQ-V<0RXGxJ!tbF;4st=3bf7n-p$a3PSU#D#D}bq+MWS zN7z{ERIu{^R}~UbQx4iaEZw&Cp@fNFUV?jCPx2SOr|G|J+Gwo0pAlGnss3kts8ic= z9Wy<&lUMSPHW|sTnnJ9qZDd|1_33K_@;i)1 zsesxt91&(tl~Vcf?L}pdJ)+i}TU@)o;gk?0u-sW`@;dCw=AP8DQ1kUP1yO8>Jm&Qw z<~3Djj{C@+gl&1(T5|o?tx}csnSeW1hN_bhZDt*GotRo~Hu7zCb_YSv+F0`EJ3wovNeD})Ggs!M-i4MVP*geJ&d^-(Hk)}&VX zy3Mu7p2P_$Lo+h>;)+X#xi*Uq{WbZKYV*M;jgEs$;MUkmUF=M=xMN!8ZN}0E^JZ>b|*aKoaHwgJ5k4bpk3cM346bS{M|4@hla_aBi}<;=^W0;Rn`RlY9fs76(^2)GU+1i4!7X zNVgG)s=Cu)%3Vs7N+4r5c+wRo<)x=h^tlJ%aHFJppIq;rO`9KDoAr~K)axHtS=S}7hUL+`u%+%%}EQ+DRS6Je0vuOPrg>ULyd$0_uKv5kuv zl|1-H32;F zZi5YE=9r`0!o53Ch1jRm^SxKCLH3i;A7~cUOFpMj|71g3C{A+B;ot;x$}vUU!c3ui zR3CsG-FdP59IfmDoYt*gxtj%w(e15W)r$Bhw4>j?>DrRqJ53|#S@I3#5uKCv2)~gO z6SMP4zlft@3rESLpY{7L_C}N_(47&Fhl+981i1+(h$e*FYY&OKhVLi~(M9Sm%>Z_D z_yBsbygdJz@4O<-%ICOeU1Lc#{Qh2hTohP3FD7o)-F}2kya4pw(`+Wthrok_YbQk; zju*s7j{7+S&zGDaR2KGb{|$)*z`G?r%MG6p%-iD6`mX;0qA20L9`X;hn%0RieRM$hPc2IOKI$pl;E8RODOh`e3oIGq>OIAcRa}VM@7Dd>?+@sz z_OL=;(bh*&q?>Rc4n7&cKjqAOBRw}^YVWr3#cp+~YV5ACMwaPnd;D^C+~mCEr$r9@ zkSwYB*RI-+jT9Zbi3+Odnkzrppdl@=wA1KG?XHhBSKg4jz)}Ap6fAwx0k}QSOLFV# zY#c@+85`X$GnW=ywLR&Exervzw*=5PCJRqW*-t3!7}Izt&ULNX*uUDkY8TOozUY)0 zHafpD8;BTe61}}VHX_XiJ=tf@ioH|pNcatjsmxWUAB$3FedOey&FzleZJtPfuQD>_ zf6fQkjJmQudryzmV%t*)ti5PGUXQdq38d2r<6Vc@XVtM($*84~UwxIr0qm zT4_G2GcDXC41eiTmC8!b8m5 zaM+OO?w{dGF;3ipi=hv%K1XpWO;YnCk*AqEK>4DXKe#+XMfU@3gRapP`J!s+r(3~; z!|9HY;KYb_AqdBJJJC#XzZNohP$;@+D zl+(M>d zrE^}=D(xs5_y=gN<)il}Kb<{ z-6G;Yb&h`BViF>kK2Yo9qUso2&2L*un3SDTK{oIj6$U#@+>4oR91~u{1@eFLVj#kf zMa^&QPTjZ6SCrrM;(Z)EHqTM?@=}a|tp=S8dTuL9L zW=3A9XXs>bl^aiu#U(Xrbv=(J#7 zr?0E)vXu^vYg(@ErzToDK_aM1Ex>i{smp>3d-z+`z5i&_>Uw3zG?}@RBzSFlM$|(E z8)hqtW~&(I$e2>4YV6jZMyW- zKO)6z8KJAdKGz{oX5WIZUEj6bHUntMC-m$FCHy;*q_4lM4RHVR7O~^db>>{zw|ykm zAhyAy5VxhnCI;umhYc?xXZ6~oS$0J4%@az7y7=>tb?O4_;~ZieN8+sIk|ua#(yav5 zA0?+>Sdb~<6g6aIk>nBfsBS4%nH+*BNa-v7N4`>D_=$btS@)@B1Th^laSs#Rtmu*I zJXKS$6u3NLkOX3$sxvSxuZ$MU%BopY-iZZU`16g6Ytj>t?L|x6mmJy&$G!o4CJI}W zl?Hhrbub}^fPLLo_A?4`f)P~@`Pf~*C{G%vu};YL3LH&3qDrGZ2o zW9Hew`RfAll*BZD`*wTOXsUQ%`>-8j{}ySo;+ei=*}N?0m<`a;M6JL@kxrDnrwc9& zR?qS_PbL_Hl+>JMe5!n(v(oClcKb9+O^|IrY6dM86P_Dvj2>EIruP4E$^NR#4w8Qj zy0RUKuYh!@TOzyt@V&NXrs5e4G#6(KZ5qE3?L&O{W82T$X0rdgdvUSKe5^M6k#zwa zp)z3JpNi5#osjB69(Fwv*=Lyd*$Ql$=|14)=1iG8SNFeH12DxvE7@Cjt~nfgvDUNG z$1pGN-nhY{VTj$cFl*EtKfFYNv*qZgK(|@>HmYVQ^DfA?p1UxesZZyY26d31Nxjyj z%IM|j8b!ui!%3o1=`#m|Pz}G5I%%!)<%Y<^dgt;j?h=!M*m-Hzy( zgI0YXq$r>8@E6)vt=|7m`#}^**3O+>Qy{nhK}^MWoCACI$e>sW5`x=LT3bY3s4_K+ zVDP6ZWNrC?H~2(5ld91|hZXsWlU^8Jd?N|=W$%A0U7=Y=_gXw6{I^JLm*tWZJ2DBn z?v@-9PU=8c{9R6cz_a;j^OHfx#YRpSwbTbW1)r++?Win4d~g`fSB0dZT24RX8B zNys|hB!_)NvFc7WBdh8E-Q~I?IQOl%8+voJc0PUTlaESZUGt=`w0HlU7K+@jTs5wZ zTC+a7>9w+4IAnhj$^mSB8}B~ReL{q_^(8Y_G*Gz?hfU_uB`4@a?kgiG4V_JQb%C6v z{RyY98(cK()ri(fQ%~weeHi+pIt}V5vwcZo%`~SSbjfwc2S*%2?wLHh2taTJF&5;c z1pTL{i=8X(9iqWB?6a=5grHVCw*Kkmr`tEOo|D2N1s;n>Ty_on%njupS-KXe&^UGt zb!DE@oqC&H2rkkJI)C?wPxpf^LX!LYp*gxpE`nSVgR(=+8xWYgkk7-tIm^z%XuwKI zg~3o+b-FToQi{%;X)_}OhanbRft>$Bn+DKo?PT|fOiP2@wbhsPtmo&cz_a972dLlK zDg^6WmR2czeHku$zvpaOQ+ik~oo2`#5y@4(LPcH3em0056>rl_86A?>Ru8tFvj-{- zC96BifJT;TLn2~iG}k~`GGhm3K(r#$9t@10&sO;kRfaxvF9>?ot@Jyqk0~;U4np6k zT#k1bRM!8{2PLxJ=RuiXS)=i+Vv;Udy|)%1swtRPY*!z~U34D6*&~8mD@rq=$mf$B zC2}(>-MnO@(g&$av%_P#{Zq19<#7(#kLei)`W0#0qogf!LQvqyVTbE1LowzD$UFYL z7WoB|Tgvr4qh?$uyT}!bfK)4V6Z)Dm+Xe}Yw@68fj}dGbOHT3d+w$Higb-|zIWVqK32<}R2)1>~;381w3)mrE!@0T>7Lfl$`+|jM zd)ZBb*_+(=TfbH7Z7zx7yx9nr{y$eD_`wB;$b~qXL!+l z?!)arUPs)*hAcI<~f?>Q2)AdZ`oPRKqB!M7#s=j8YODY8fb zOO>et({_q720;-5BNzG!zQD-wJY@G1_EWW{rPwLwulB6OOw-PW^$g&zh8B90WYZffP2VEQcKyJ^ zaHelt;X-G~T9`bD*aGu1ob8q{4s9msV@)$DTcB1$s1e zL={|KyAh`?tiMGDkX@ZNPa~(>uXWsXXdc&{oxy5vA8QO^?Ce+=eD~7{X{9d?d3KOl z>xAq;UXzrr#*IqHZ_JW#+2Kh+dv_HPvIx&2y%ubXZs1#=$A4P|K!15}?^(>!aA&Rt zl~VQ$=V6ny5lAj-lA&O%T8|yz_CwC)7eNX_J`>Der}Cr?tHB;BHt;nmCv4BG)rxeN zcd>Z**W^PYOG2s9l0ia`E$Kbud?{EpT5#}C_is*6jPApDSUnI)+ogK9l=LH)cw$f< zCug8~U3uVO%ji2ln2c^=cW8(>it9JxuBZ}XVa?fc5s^Ov^z$ain=wn>4~h)3Q@ic( zwM@^%Lk`7xCD~JCWn}Efap?(^3=y#C)Ylshdh6{0Zj|)}^bhp%QV?J+McXl{v`la) z&j?fyG`x~mLXfCgc#Ca{Z(_T1MKaR;rt18_f#I44llb1J2{SK0KplY;YUd}^%j9TR zIMPavukf(i+M_gia74-ckmyt&cAK5Av=}B}HVyobC>_z%ezg@+4)svgyC=8eO=9o< zrI5Rj_asHkOPX=+eBh(ku+31MwSsu(1`JqkUCRj3tlwD)Hy8_cleb>9pM;xjZ5#qH zjuySqG9{d`(%<~cXEhzD!7{&TyOu|yr28D2qH`UAxaNu~WvyYE@{K?Wh5e^lbCGO? zUS=z_or=LqG4*`a)>i3*)KIp4pt_0gUPtTpo?_vm!~3n@33-;99lDHZmP#-_->`I&H`Z{i`rrEP6;f(x@c#nW18B81ym zu~U5*n{E+Glj7;n7)0G&;WAWmBzQJ5|H$enjMqs$uZjtWeWC99xU(Pxh+oIfo?Gn; zFImT542YaI{|1XmGZ>bZgx$A9AX7s(Mk`ke^Rd5iFyL+`oI4UqRT@9l^!vf&DJx#Y zI(BSjt;RuE4aEJF1L_{ek0!*x-nr1`*kpyO|Qq{yp2h0%{;PEq)9aH=aAOu^Q$}lm4s4U23&5zBhS3 zr$m1}t=znvXVqj?!6&Y=C$?f~CH@HW?H_$XG7}V+k_T%T{`QLBTJ7nkBw076-Ygic zs=#Jr=zfo-)z)+4TU?&|(3VAL{noowhWQ1UXAuG3#clOQt$5cK_ZqgGr@Ncd#D+#)(k^AT;Y^6Jx-fwn5LSgbpM0i6N;;4qC0=1AscVvtlzi2};P4v6Hy z@TY0&s@pg6%)iRBoxi8;t!%PBG`0pDmrei&4jMZQe(Q-}Mmw&kC1)rnz&w^e4Ha1+ z2X7_ySarRjvF);+2B4+9Oc9N0JEg@*iNB*hP*;R@bMXKw6w}vjvwaIvWx~JyZ`P`# zQ83v&`d}v8Wo#dA<9Kx=a1t(glJ>+k89b_gtmdr6a`ozj4!<6_ z2V868{}(zgD{L8*X4QkN=l7ly&PFQZw-1m;L+g82R}vxCXoF7~-1wrHRWx%;)&L|i z-Wq{Ca7|NdwtZ3NX_=o#~oVI0#7M+uv5?nUu>`O3Y7jMAdie@3mJ72{Ewy&fYui9F5Hg_ z;t=hP&*4DYwTQ98h{omA+M6-?<$M*-h}>#8Y&9+X_U5;rM)8Y@T)6%ap5%nzY%|K@ z^}=|=%&MSo%MoAPOZr=h>tp@UD%nWMQQFKf#U3{#uO)7)(JssWYX@5wmpiqiO|5VTeA>Os>nE6x!L?AKS3CH%UunfZ+a$o0(7r8$jfi2b|zoe z-tv_K1m$?q>p@3&^s?K%WEi89J3xfZCgSQmURXMTgJ_>wsB3d9^J4*5b5!D7jo5(4 z!v(SKdY=;@elEAQ-DqJeIb!sCN+ncV0vz# zI^Qe;BEf*i$?z+zJeW~$?O^>q24L%404Ml{w+QFEg|B`GG$f&;%9|KQJB1jpV*}52 zuPffYWpqq3ZRzlUnS~0#Af_pk(w9{|p<`{k*$J|ydapTaSr#xiNz)$+b@`nGC4^%z z?=}HA=Ao5Kgou{+I@$xB*Qc03VZwAIY~6jOxqe>#QuzDbA^acrRz3UGsYh`%c!Tw_ zT$Y%Pr_3>XwFyCVbBfiNDbYLAK^ZM$h>on5i)BM{b&ZnWN+0B7S1;cz-8N_)U;Fs8 z;uTR%ys zv2-;z&ms6H)Vd#PF6T$j6f8eMqQC`LajU(-P%|dCW~&IwtVly2EBDKwp2s1I$}FZe zk~0j#)X!1KULug+Pw%B>?B44; zaYt3cQRG#{%kYdN2Zr@S=L-yi{QewLeC*&FYqFIgQS)$R*<_{&G+3Cqg`QYFx*_!X zIUgcQ@>TGx%!wFK5$0tc=ByEH>d+`W1@Fqn50~pexIy`+^q%~wT@Jb^#@jx&%fz0r z+lslOQhT9TIe`W&k;%;FiqOAdzkZ{H*RVcj!Ipt(mo1qZ7WyJ9p3Tas`n6!aKRT8; zg(1rTEeqBqzJk9(BQvdP;9nB*I`fb(Ze=T9zpXADbR9npIcnQ&>#V@gy1}}wsayDc zv{kZZ65X_wc(pz_E1o+&^t$NO^TNKW4I$oL8JR`UZmjLoG*!sL4v9R>jezKay%Vcjqwu^0gZ*1vdiiQYW-7lVD|P7b>&wBvz7Aw`J>q5eM*hTG6{Rp2RpKo%s#A?t@*c7 zQ{E^;^tAOCL2j6FU-ucW1JJO3_J&cQ!r0nZyM-nBv5h4*J4(@Dv@`bC23C%ic+pc^}bzHt@_qOk!jsOMzuKkAq|BQxooU4ZYya!&Vbc<8#` z2y%`%R34^j5lo3+I2yCuP^mS+Nj(g7ID!D}YZTOi^Qu%A~#C;aSt zVt^#SdM>P1QhOlt;dbN+wEZ!MfrWorZi2HWI7J~T`H?C5n%#Vh;tAXN}xW&!Te$&$XsTio~uCgHa*RED1 z{%g3zy`Fr=#Gi?oDG%*`=XhRq#$rZ!$!UZTR6YJLO`roD5uM$cJDlN#F3s&D6oq*Wp_aPno|j);iR0M9MNq!i|OYqWcA$QqZJfQ^N^MczzQn3p1D$C9eGiEz5Im2i0*B%b~u zy`U#CfCoF2p6T^jHK(G?LThnkM{t4RMv(1TZNz38!p+*D?;95N991IClcp;X(`ZKl z_%FM)n87q>rE|x~W*$vndp3-(L6S@3oq_jFFM^R~7D9k=YH(%6fgwi7Y5o8R)HdvN zGu#d6k!=vjxbt>KfDTI@9qm~e)~G?XD8X84B3$JyJmu@smDBJ~x7TAkTx+U6}jK(K1-p ztZmOMbs}*gTq|28#Ip2(im%S&5cgnl&jav%SUSKr$FTF|w;yvtd`iTjDT%7EZK4PY z7ZAoOlF;|k(&RX8bixbe_)^?r!d9Dl_P)dsHC_GfL%y2^AF=B<*3GBPp{svxjJxCB zH z*|pk~TxkV>Nv2d6N!1}+!|ehg1K6QluscoJg7KncRM-`pK)_!ReG9{S+^L3@UR%E@ zBS;6xlD<5h{nYcJ{vF6Ok2`vUSeuUZE^8K~>1;8CHT$leR!>h49ir&D{4+w|7^`%F z2aK)9rt!?BL1-Q+$4%PnQfUMac3$9CS801FNoD|MVu)VAeH7W}dP>-&*(AE# zFB8emmu^bdV%oI_PK{}i>OT{N5Y1$LUVn|$2<|1FdosK>q?;;))5{$;YpZ8Zo%$H! zGr^xQOR5G5HoS*^3eNA*^Qt?6nu|AXmYM39{r!^Nh5TF!8TJ2$MchXvG8HC#dAL>pBlp^Z#fe@|$`g}YW- zYBggbar-Y3Qz=y#tB1se;=4`hw7QUWp$Q?awa z#B+L-8@I#!5GEEkl;WF7_x%ZR8Z$3&9O_*g&UbMCVE6VAL=xg3wUI2&i;)RiY4F44 z7kh}}56iK?S@_9CoLe*a8(3ttb*AV+?^4X3vn7USRZDt|lL6GLm|}UQM=}JEG)FjU z1`zyrj=YA`?&&;4$Hq-(6=VWtss7rF`X@4%eni_^bM!=M*b4s-o?~E01>fnFY?^(d z7P}TaeHdb#Y^|n!TrYtS{yp2an?hYoFmoILztZ zidQV7m+z)z52@T4yNTtHl<=LLv95|VX9s;lc@n6Onzcn_7!&70RBCoLv{r;YX9C$E z5<(;t<;k)z@SGu82n-XmwHdl(z|{BeVl7vHT&ZHFw`(eOwPVFO!-GAk_`@5dEjORL=*ClfFj}9YeP2F zc9rsGAjGfsV>5SvB#`$KbN_v7(YqUypftRYx32&B5Q0FM>N^D*SJ z33!D)1bK zq2KOFaK@+ zXJ0^a1hkJ-Dz3+?hAyj zQE@;3prdocaLCMtNn33?$H9d`)u08tYoR{>1iG)h!nq#Z+^b(+AoH{C^G7F&?Dn$l z0#15UNjH?b0UY^p>rGYltum$DtD1-NN!7nX+{nr^n|FrwEh07^9K4$mEN>?J^C!ui z*^Al6yj}FVU$@fj@!R)fmMh6S1;gB8iE(M@b1NMHdz$jo-i)~Zj)xyjjG>KICQ)t@ zr*k{e1L+KUjjOSn>)B(}7L!B1S17=T1xg`XyT8ak6np~k$rGKy-wwjWvs8?+)Jdx# zW<60Nyt4ots&KIWh(m)>QbJJS7M?*(gUFo!l1__S)xJg4UevkCwhMvlMoJPbJRmlZ z>)dtO$e@3hTG?EjRz5NGxqIKBqz@pPBU`-Ha$)+d?j_4F8xtgjz8O?^ztbKMrHh1; z@5{xDaT@N*W$c)PXsex!LllBgJVm?NTr>1L(a__Hj(^KRwc+c)rDb&wz%b{g(mHqb zLqSsx1L6k=QEN(YRu+G|Urni9+M%uM9qpPT_bP3d^##9#(8pSv#c27=7_S8Q-d*gO z>fCT&Cwt2vxobEI5`qzR#_m}kNwP^IYG*~b|K9VUX*3e2Vp=+pMj^Ovw7xGr@9-{0 zVpM9Lb}A<<8T9Z0!2S31%hw5ISj)f~Yfbya;enJr3bjM*_QQ`>V*MUk%V3+-=z9(G z8{v;p;_h60tfWOF*A?-&uV2g65`Hyl9r?RW(MDJN#^aZ|{ebB`*`Sv2pC_^A5N~9+ z%v_oQz9W^R9coenA5OVf5 zn10I;9kreF3wFTrZIt#xA><33rMLCt>6biuO^E8hYZy=&L-A3Pe8j9&I3@iqk>*ZH z@y)Wj1moAB-DqvQG`$ar3Qu~k)V;sYvLM99E&g-$?SZVv%4q{1|Iqb4%o%mP0*v|+ zy_f&KItY28XAk9`KewwdEzqv7T2I5{%AUz^IsI^5Vc3!0%kvGHVN08HAv&5y)QQZc z*(aq!T8#X<<&uO1uJc9=nIIAp%d$aH?&}*D|LH})Xz1|X6Koxe%Fq}62yl-)0)myO zpJg_Lj;LGs)tC8Qohy1{fjv3=M|MoFrslo@8R1~nG>8b+>uB!r1?x2|Big_2uL(tY^dYam)1_Y6pGEk2_j=YO@axChn){gg zktY2mnx$h24UNamP5sJCgD#K|#C_VK;qa*pb-=H(*$^#ASxe+Q{a}x&#ry4o^(PES zg@K>=+r1g1`QLGj3-dB65Q_nFcyI*;rL$2a@YOBORTn_XN4?LA2u)*@ zTlh(&Y|mN-!wrclkh+P9uctH#emXCgzlZE+di+}JBQjK9E-R^|ZbJek?S|eCGLh+r zYxJ~qE$L+*g&{WI?Q9zjE_ouVs@!X2w@FVbaGUX_Z>~C4J#D4BaK{$ftPxcQiMA_~ zX+I?#)w_3_jow;||D^23RQlcr}wdedLyqkr=lLrBALoW5#j^eu?>e)guwi?bh z)usdVUu~1-f_j&S{mP`T=L$YIm&|y)(55+WKSrKzl(X4kv%j4@?wyrR;R&;*&QrjswRqk&) zXGec?Qz1bIaG%_rp>_^pZV)sa?@Qh_)Ww3dHr)7r`s+p6GKl**XFl)fE;+iZ9O_RG z*sEPr`4yI)tHJjfx2U@d)|*IBz)iJm5xr&y{d$$UvfVZ6O=&*lgQ!~$NLfla=1aJt z?wo7k#F*{fsmoUjwqgBmzFZo)cUAp&eg(uRw#LyMG`xEDY@DW?3CPkH0Mjc+edsSs zSg^YXjXO0q6Q_J`UnZK-xSVT|JxyAc%-Ke}>v$HL;9TZ=KuYXw0w%T6N9sYG|4t!5 zUxuw~D*6cYCU@_b!re$CT=g=`>nv&UtU&}2j5!P@(EU==-pdOU*A!7D5s?M+6&!cj3 z-Eh2?IgLsY6f`LG_fGey`N?zIKE>);B0$e<-WCw)eY@AIR7_quI&4=FQ6WjaTk{t+ zBSM#gT3YjDa$kTeIF|u4W1YZDSZ}1C5*@Hq-lB|=a;l+BOivl z03zS6CXHunUVq4^J|kw!6Et5ez;d;tX&}Ti z{>!`l>!V80v1BT^)9>ogJIen_3qFi9IlV03$sUG8<(+Pj$kP6?JW)$|Ge$zUN(scH zOUee9;EcBvx0hGg32bh`!Zrnse|p1VO~HG)DYPbgm7;u6NhYJN$%wUM*w|jJSv0vSKPZe?A-O z&}^~(INwP>-8S}S*I8=QQlw%*+{yk(#%Cmfq^3+*G=nHJWHX-jn~w}kt6haf(R&L1 z%8J}6O1>RM2DW>|_r-7>Y^FW^H2hqW3L{()QVNn*rl{AHdhX*BXlF2v)fCu6mTD&~ zysa;sansJb%$YrnyrlqsgC^r7iG~}51E6gG9JPTIHV{*{!bXQXfxY~jJed}`|y$z&dv@4K! z3P2r2zTJ|EvY~JadeEGmxaj?VVus{PgWX#ZY5HsB4@@V|M9&KD(XJqkomYPD5cLIJ z{oeEL#^hf3T%@>@0O=dQAHz+^4QksK7MDJBzhHL1(qU9LV1LM{s{%YIR8rb!IdZ*D zEG+;64=&i44LpZKI%BqiSAd1|3}$959gxn>wByU79EPSkPp6ucB5cp#+4K($7c~&} zrdf<83#4Yx=zut>e0)F*Ozo28k^?7~lB(pSz#LwPqHX^Fl5@m*dN7_o)qi%vo~V0Y zL)a;=0x*NWj2EHOZ$f17WY@-!kx;#tz430DHvQy5_^pqMn*>8=B+5UIKb8{PDjbzD zVw>ngw^V{0m$axC7XV)P)(6YQQv&A>FqWV9@8iSe+^^D7-Xtv=Ano4-jNQH)G%Oa; z3Vro0W)s~~z^5%BD z=+D3dJyCf&Gxr>GiI31z=iU!YgWnS%5A#Q5kR@&-mPiu+sD96h4dm;$8h1w&j&flDeVO(R$}IMYS+ee$V^T4 zK=#l#dt~#_HO`*y*AZ(p^-gNOIAQU3zPj{^!<3>?vKG^?E-{*2S_7R0ywBAj4J?i$)L^~-BDIxO+Bd>!K~T%2kGZWGqh97Li>na63Rpgx1Ou4eMH6;BE2y)$0=EXF^5rj9HYt$m?XW$74 z{iTj0Idb{3MwDllzvsrKw9?@0iKq|ci(ofpxRLNbINL82=`1*Y`|GDCg=&_+HVeKm z-6UTOW82}vuD{a291%*l<*5J2b<)by^q4y8%1{KcE2p+^CAX$ys{Q%d9}GU(Uk!e> ziF%_pz$|*`c1i+z8&NASVih!9i(#lYtbvKuU$S58GgS5KLqcAP_Lt^uy5cwA%6!UK z(g_&hC>EfGI&8XW|}*zrOprwhIp_;ms3lr^=6 z*gIr(iKO_iWJ|ZfgtfB_KrfGos=N;^!t;*Jevz$5tp4FoJkgRB+~g@696DUUbb;^A zJ%sRZdxtx)6Wtmq|H1549?f$1GWT?9;yCCg@0lom3Fvs&9pCG-*ISWG|NPEPV*p$P zq`xq%YH-|Ur^>WK+RM6@fDfcU%zBWq;&%&ob6a^TE<*!a1VCSNOpt2M2 zrU-5dF=n4@fic)rx?(BOuM1_&M zaoZO{``G^_Hln!b=)me6xr*{Q?FC)lZ;)ilk;PQ%KHbN{#w6457iwHfw`k7MRS1l> z|1%nTMTQ&Kh+X1^PhQ9e@I%hjLCThnZv%!wRh9Hhw?VG~%@&m>oq_Fj{c3`cYH-5g znoEf$F9@H~ZLz+tj*$D;8Lr{<9}v$I)b(vFMGa%~Wa(Ufo%+p2Q>N><_0p`AjOUk> zi`*2!II4gb+DI!?M$C|I{T~@hJ5ps4x=&UjB1fePds*S95?q>oswuEvmhSq+I`Wmz zq@^LTBHKDhw2k$**Vwd5QT@ukI8;icy|@^F==2Gg`;Vo%0E-n~WFh*SiYo6$-)f|Y z?>+|MPTh?jIh+q4h4O?c?I2N$^h{lV2}}L#f*k&)6sA;A3Rk{IA2`m~ro>sDV6lN zrj9@N?sngh{p#A$)Ge)1)nuMdr2_BFBlNb0k~sARJ#HC-4u~+6BGI&WhhLZ{K25?F zI!y8IyFdFC3B(uG<*hbJj3HW@egZUr71(8S4cX) zxfKN*RTIeks_^o-&rPrNT9Lw);%{$e_aKb6I{NVGn+K9KRXQ1>LUC2%99l+zy)OYo zS8K*aTW6-dC-94_o@M_le`M#8$NnGF+j2elUuIf1UX+XvdI);?_*EN|J%Wna|6~n< zPUUQxSCabA+R4~PzR;|2s37E5h?mZ;@yldMKy(+pIrw3y-0OnQPv0DVezC0nmd?DU z>#z5y!8i3I;yT&GRu=522EHt%HjxenRcy7p8*@MP$E-7R^%taz*?-Fmc@-OTAUqNL zx(A%gkxy^2oFy3Q8!77>u{(U0&+<4=ft?7C%em@SWP6pFtWElJ~# zFTld#+tDMUYL5coBMvNPvPE?CI=mj!F{saAq8IN5+)N*vq=N!Sm61N#;`Ny9?XqyR z_lE8hqz!^y_oTYC;>Lz#J$G+xxL&KFo7~rsq<)t_a`RGbePxip7~iztPAUtFazI7M zv(k30Ho!Z2B=8Kc-pZV0F*PGD6wVcG6$3}kl~(L4k}Qr&I8AAI1ZKw<>2_oe^WH45 zQ@ocZWd&C<@(nIQNJ}5!J556u6;j{-_W?+cLYl2>$RJvs5fmuiSh(hacO z$T7I)K!anLz@lZSU-$V|4xkK?hs zLO3~XVCS;wzg$vj-+>h6=H}zo2%Qtu1T+0r?>WD7t5%oZlfn0JQFUqNoKAwymDkTL zs$V^%!k{6Z15dX$RWq10rUEhC!4BkpHv?qQ0#5AcB%YoY6JdI?2Xsd@^khH;C7CD*i^QQBY1uR+h6r!C#RhGgsIvhI_!SBV{?GxSP>6`WY5CK%t;x_Rbt7-2o-55lPpoJcFIn*$j&%ae$w^YbX$0|PwJ$#v=$cSjt~wh)%j{v z-)ec=^`--Diwzt44rw;!UNNy;H0B4!)F_bn$6Pr3HjV0TRcpE#l^TV2GIGy3C-pY0 ztTMi7P^xryWhad0sD+BtjTvs#Y}@H8xqQrT>%WW`_pGB2g|-YgFg&F9q1Tw#FvjPJ z6v6^h($B2Gv%6QCCnOv-ICl`7*f=vGUmj?Y__4&8>+fjU4C{v|_ELH;n+BBG{LGD-xn!&8`{sZ%}?C`fBoZd}Jd z@$-5^ksAvP$%O}*30|swgYQgeK@U%V#^>?p`OAp(yT6~SFp1Ok)X*7!TQjrdd#xUE z|2k7T*LtqPl#{FAY<}H&zG>k#7X96!Ahl4mv^pZoG~bxm+eK5f1rpqLs9G_j;-&97 zm9|fmbwk;O23zj2i1biQ*Ylv?!qYzLiq4I=@=cOLWYntDBkpHzK7bTKS}Cfi3hpNe z)k7n~9AWmbQWmmZWl>oIa!W-&H7sjTPf)#q8ns0Bx*O{Kro0U=#qHtqbGM^`X_ma`Yq)0TC~jr=fynWy!nQvvR7i5$k^1kj1+*GX=!jiJ1*NHqU?D@4dXanl zFOiG}b5_vST5?+{ocj=$9qRPQG{W^s@qH5zK>{6NNS}c)b9=6=G3?k3z!YcR={#HsGG)B)tb;zZW0wOaOs~& z9iDBO(rD`;22UMT{>|>ltS;C=GvGip%kSHUtmXg9pOF4QHv1+^o>H%;o~O!-FpNq4 z4obCPq!`c_b7wRZe?Z_%6-Qk$_SvY3_z#W8ka}~;N zIB{gRiixeeP{kuH-VOyJ^o&6@Lz5{QW8&p(YGz_X_0yabp+GsQ(B!)|png-9Ent#e znxU;B!_F#!px_NTgnTnZ-r2pg*}u{W2_U%>s`bM(xQdr-Y#$JVc{J7T%2JA2+fPY-}d=yBcsK%KQn=a4X)>C+(ca z{m6aw9jzDh8d4`S_Clgh0R3crmNjPUqrYR~2__(DXI!4`_HR`2DPO29T#8U*9UsCQ-{gDGRF zz;t6`Ph|^^Ps?jLz0}Yd;@YBHZ;7OGO1F$J1*zvL*zz+FQEBWOyXmr|Jml4al%~3| zPZ88O0z>C|owf>;U*YjO{5ZsjXj_SgMAH zor}HJb85y18uQeNL9YNt_XhYUvWxk9Z_g*-Oi#ACHUD;b`hN5y>;28It!VUbwULAm z9)Y`mA)lA@PoRR+>Yjuw)`=DFFQMXlTPDss^kUwWP_5fI-@^EV6vwv~kkI??F?6Ma z-PV-j$RSiQveLQlVtZiIz^>1R9tF;i4AJn6VU-}g=uco)sts^h1+SkM1#5gkFDNT<{cKB>UpWSQ(Lve#X7-c%0SYa4J)`VtilKb+oQ{cwX89A427 zX-DP>VjI%HH9pm+ATggWw}&g0Xk-9GC#%Vjma7q-tM_i%=qEScBS;#La$BSPl!3T< z`LQ8mShQNaVs67)W$ajGnmash@{Wn)+=65nReZO?WHb2nFHuL%6sFJ$7N)=9tGK_x z$|z8TGQ1=itd{t>OItdmaa=4tv!nwE5AWRibJznRgARKZ`x3_{$*`oHmTQ4h?X;aU zqx5JM0ynF;cBmsqQa>eWyr)_@C2@D@H>GzW|EdTA&Ly~+Eq5N~>)jqU2GQm>B+G+Q znAAbXzi;#lmjiZK`qSIZ)^U+L^hLsklpU4;-J@q7r(a&nl!Aa_!^R`F1IGOvV{SFJ z=}-PfG~KnW1c?~B$4=wT05~!j+u;tf=3~?Q$u7DN^J2%e(dV*6eUVg|*ieT#be0}! zDfvD$E=5Ow?UFLEnri)Z2zrkHvSqat%c@LIq@j<#4H_{3DI*qbuzT(lOeg1*(9c&P zgU=|_7&%tEmX^n3#xfJpm?F3G%?3#C*ZQr&})E}6ozUBchS;iga;yzV)YMZ0~Y`vG@*R0&nNA^{-qT7UpCZgev;;luGt7dU4yfxgP_;ex2k!n zx2}v@CGg)7`Tzbe4FnEUM%-_tjBrp2PI=4T|%s48l$sCP=MUaCiUtRQDoFUyf7U2Y?mMSnr!p{!e)%3U7Q| z5qr$>(Ov5Y;}HTF>xZIfJO7vb=|C6H*pXIZw$2yynd*{8&Sk5e^QuGQA0QhkPV`-K zdqcZBAbfb5R*c`|I*~3F(%8op|4KSD@Os)hwJ*RS`e+@>FE4ol)2ZMg*6TeH@X3S& z$IkYo{54^b^K1E<3$VPom8G^qHtM9jKWJzo>12+{EXm&ceCsWo_{PE%XGm|ykCa9( z)5II;TI%=Qe?`tGvqETzFZ{d%I2A{WV6prp>jDVnvg80AKssMzX4_Ij6opir#)t5C zE#~noWIC+MZ%dZ*oa^ zC?45qq8s6V@cRE>G6r>qg5ar?TP9qk5!tP_zI~EHX$RZG%U=`0m92p`BN*WZLRwPd zrc0~cw1{cpjFh2vj*Y%Jj%}8!p0=HI9;w!q4h_TFW3&(!9zBfT%0xp1vV#XLgJt(q zeQQM7+qP;fC@r&E4Ww zuWxr}QFcS5M%gP@z7HM%eQ}J5U#Mza9aC(cwxLC8ypR5xu%f2RHi<0Uz7sur(GY$w zaD02ydzHNNge1bsA8Zjdz;~S%-0oeR=>R>9Y>^yb{S)r|*^jFVw_){s_p|Xly3J7R z7Ft;>6p7NuiTT1-8p zT`2(%F5j}~H|Ei$19Ab>?Xx&u!bN*@jz`+rJWDUP&!);8jB{_B>Jk|-Z zZ+&Hcsc>nweCBCceiYoc?;JGR`^=C^`97O6@sp(tQ z6kWIZ$h^5|6w;c+Ticmp7|~FM5T4@Vp`EQ_8H|&HC*G#2TV6UeUj2Zi-S4+U8?XU$ z8CLtz4((c6gCJ(UzJ?T)BZ{V#$+;hFh9|bpBa&#y?aE-E~B~xBRs$Xr9ym2f2 z`HGQ(Kut;(W^@Mh(fP~t58_Til>cYD&L4m4K8a~neHMH*wI=N@^p}RRbBL0Rx%YvU zT`Sd`bk?Fi`oYAe+>yU_2|oQD^OL*Dh}9?RuL+!?`u-c3xlC4_cxILzvTp1V6VoVl zCsT)*Jf}4TnHzH5yqg69c(<#`m(QFqIv{q$eh*>Aw`>e_ZWqB~F2vxqXQCC^piMT; zm5U`uPrVm?H!d6!&%Ag18#u|)WAP&=eBNMxg^)kPmbdZ0lx_7y0Pf~+8z_UW&=Au8OEM-exlgR>1;r? z;wSZg=s}s?wY7u#noSq2RzLUH*}JcsgKe$Bq1Fzo#X;^iwsRq9 zvvK@_dvMS6Ps?SuiAh0n$^l69M*W`RhUE40 zU8)Pd&42Q*#lGL#Luyr)p#p!JUv91;O}s=HgFkM5K5cBaY%AKmJaW|0UDta(8~j^G zqG(8UPA=Uh$QPzV4!lM>XbWa4*$3uC)_sFKzDf`t_#@WK6h-GusLTAc0Mzp>v0>%@ZGK=<55VE>dUsmY+G~4`lrGD*jYP?~qWp@o_ zZi+WIo1JNe)5kyjs@?P6PtTk4(7D#RDE2X@^$FHpccT~;Z{#-WSb0uwW|TvUU6<@M zk@c2UN<|AK(Sq-+XsP#>&7u?b&@`kB57m=F3kqQ??^$`Pc^Yub=JD`|+#^*rAU=D8 z7#(QEgh}y?FkT6J`^m(~2?E@E{qZw~di44KEYQG?It1qvFD*W69l4X{AP;9g?ohI2xE*WRS*K?$&IMHBn`Uu*$Mf}#eP9MWhVNnAy zpQid9CO1M@7LFD~cl2ex9m`n4xyw?q*H8+V3ai^La~5&2AIUJi5uo^8*8Ij<^v0Qj z$_a)$wcG4QjNtvwNxGGHzZuj&H-h5B!Ee`&8ZvMi*ZWOccLfIH&W>9YE{bg=udEmf z`)evnu@|`m7Erfk)_S?06p%x2rsa>qUr1Q{ z0RGXJCPD=5uWOijZlXR1$p2jCj&27vjO7vxi!CuRH=oV^?=D(1UFmu8rT(urL)6`NT4 z;EHhQVHVf!m2^@> zm!J1*JqUffaO+F|A@Cb#KeI23*M8kgWgM|{JA}Tam!WOeff5y8u?lyUi3dHdS!zg5 zm>SUE0pn#lK2DD%4u`w_LEM}V`nzyb(9$nzTD{g>Xm$zKisn`=t9iL6?O7@e6DmAf zJFYn0G)N-#nO)yL#^fp98H7qL#SD*(*&LaxJ`o9k@q`LGufl1+erT4%J)bchD+H{F z?Y{A})tZajiB^H%Bc}aQ%6xF6vrAH^;CUHWEh^`NR9*<{$61UtQNZ0>98$ZztB1UX zw~aS5185{IucaLxZh1tQF8Mc2@C|Z#?UMX8Ensz3bC_3%*-5F_*O4tb8lfcV^xc+F z#%#(JUdVcC%vJ2jvHO&LoWFqr{Sl43y7Ye_;C=gTAx+~ICo{A+u5s38pfO0^?&D58p`m34O3OqwckK^ zzE~+{h9Tug^qOGf^zj#xy2?KR|FpSqj~g7&9Sq*>vUhw6xJuO@q69d`av?Q7uzA6N^O>cuS4g)) z$jiTKz;!_NsMUxT49E}E)DiR5U8+K5)uFoiIY|c5Q@A%Im!{ zaxT5hkPlgEoGKKl2VdZZNkpKa(mdf*=SBNDB^2Q++FzCT7lSn8J@MIwTV`LAq$ye$ zkiXZ&+|`L8!90G{j)f0K@O?%u!maPBXqc`qvjwcN0^D@0VX1!0{Eyo34VbQQ`fMG zng6Et70%c^c-9J1d%W5dh=dAfWniBBNZq8kQ%rkJZiWTQ_-3vCGQC7MAfx%i^X(_y zxxZD%e!a$+9Ns!)KDfNoV>^>Nt*?~+9@ra%LCTqSF|t(P5XwJFV(deQy!%(o z5q>jm`FXD=k7KV%KfF*$C>zGq-{@3m3Zd_KjfB1m4GSLG@iY8!Tm*6tX)eRI5-2V5 zEYkraiHME*o9Q0WJ1x^w%20g|VZofTB%Dp#(_zR$X@Oy~YKR+0=#IuL->0o;)=rgx z7Y@Ke2=!%!-u@%nBjFFu$P25_Ih8VGLpd(}7On||kA_9vTbV!`Zwh2wT$o-Wa-BB! zQbe(Q<_`ZqDU4{mo+^T1B$Am8$*5#75fZqGUh7~ z?D4##3=^f_=H<9L8D00GGIg2}xGVDuHO@syk!_!!LzqmURBS=eH79HVM8#PHhq4DQ zn0Q^2xwh;)|FY1m$*~*oH3qvergeHY#W__B`{7er{tbd| zV(kkGz(=hz$KlOeo2;MsXl)1C=$fka(*+wp_)TU+b6?^TCMY%Kyp(q#Wg#ILe|iV2gNAnzhN*E#i%eHD*jmrBrfR_;GR z1v;EXXm8sGLB`hbJQ-9RDm69uq z5JyzJ&OpBk`&klRbk``6BI0RnFBuNzth3FDbeZ(0ob&2GfHvUD^U+_!|JoHy`WhU# ztMCt)cRiV84io2hH6->N)%>vDzb>Ahd44hMMG2z#*bcp;zqgymHPgMW>Us0%Pnba- zB9dh~3vd&@TP2lHuDFM`qJnTj4!Lc0JnuAXiF(t4D?BkEtxU~qk{ZM@i7=Z*gvQ7} z``WArHj^Mybw4E9MtiAgST>A)aL5o?4a1%mpf8 zeV|mpSR6wsj??}Z@}{e@U(h`}o{Xt5F+{2hBk6@r9nXV4u*2R0**)PVwc~MM)Rr=q z#!aXOFxs+tGEODWQN1UJ0L&bY{j}sY#0IhPc+0x96ra6Yf=c^=XE161{`p+$XGu)$ z1AJCslxeKwo%T)7xq_{~NmHRYGe;A?e2E=SKQqJx9B6EkFfc|W&*?JJbUzHnKP+G; z>@jQ=tCPt=?uwXFb2IebGLhwxh2?!KcTzEJ*p&^*A+x1SZJu=YoGSNUSf8yxB#H5M z%f?8y9o;_73Y;L`FWb9M7lP&-r4oYuA>JQ|Z%j8U&DT!Q=aIG0m-48n${(IQxvr!;v0#ivEFDM^rrPfHI70N90t@@Y-Vj z6}_$Xv@zv#lfFJ048ihctx{}N?%Mzh(}n?XKCzQGagemAFl)cpAdBp_pim7Um2YLl zK~u}!$iZ}v{?n{ShC!`FdHqnXkymcIAw;@NMjtn~ztkZQ0rih$BJP+WJrR4!>Hg~K zT6SN{IOZ}ux=bfedGk!ot8s8_ zCj#S}?rRM1`xn%D!kH8};YbztXE*J3g977CdU4I&>#9lql_7gKJNA5J=*~6B%&vZk z8*1QlHgSbEBdV>|-9r^bx$!8EQwm7Atxz}2upOUb30Pimmrfb8NbLtzh_nd zKG1dIk_Nl8)wxjh_E^K`&_<_er66V8w3{(FFG&yS(@% zkNus)FyRS}*FOCgpfcq74Y<^a2^C0Lx=Y;~*o;>E+diq1ekC0o=YYEg$RIS(hupx-zsD|~h;A)TMQ z5Tv(U12!1*QzY+iXf4ZS@+}hW@iu+)+pCg!s7xpiZ*$Y2o#gjhvgUxJA#6gddjhkl zq0zGP?AEJona=RO8JP6nOkj5_oCC~S0-ldt9^HLCXfJVp%00@SZ~;|*7%UZ+-06=A z?n2K6w>|Ybvv$KQP}5UW5aa9*b&3bNM0xpCg!iRT^4z>%pJs8?`_45r%ZB+ES3D;$ zsqCoxddsd!Le7a!WrwohyIT52gVX9i9Y=Jk_&$!Wv9Sm47TlGNi}DUE*z6kR0_nE! zw)&-1HK})lJNB$GmUZjsE*opAFABQ#aIj^oJKm-Dp?wn#{-Ot(f1OV$Rb&TW!toYF3;#rr@>mww0Rmn5) znbgrX(=e3PoHAod&em?Ogt;NvB~%$#@V@q@BB)Q^Ehv2JlcEH(-Et!fAt6r{NKdIX zGZ2CzPvXlwy#s1=YtKT9y8EbV_%&+1bbzYB@?QfatJA$zY3w+VkX@ZLUvS zoVtd5oRAM((Qv!VlTFn|-uq-BQn^9fNVo7kPy*r3>*q}o*S{IJlRc_)0f7#l4)Bw5i9dh1UFvgtCX170!a`<&; zOW23;&-jP%=5MNKpM9go`k{aO?h_qfKj4{B;Pij4MxbHXnSsy?1>da|_ey>O+gWA%DF4S%a~I_k_zcBV27 z_)}@X!|Pf-%6DJ?0rE4bfOdmC^w=5esV_K~fQyw;QA6<3Yn)TrGAQ*VM;K%IKoQc$ zoviH0u97b^Std8tz!>iTcZx$`!FAxaqe#3Ot(-kbb7L;7j&(V+uw;^qH1uEpC-fpJ zxuNU3>kW!}T+Olfj8ERJ)aN;u@sTFKL3Y!s-@3389-2 zYmzN~wQW50*@4~aD0G<{m-6)dBkRd+tSvL*IcuEqn)USmOtCg}a0@|}S!Cz#7~W_6 zg8xc(M&Zwr1W9-1-I^QXg=kijzQ=cp&?d6 zQ=DCBpvQ~$#itLBn6OGEm|tZM(n9sX;W+k8lGHhSU+>QAT)uJM-p ziIMC9N9l}4@Up9M^sWW=ttV^oshMlWSz;5jxBGso?+;byd=tY96cBF$=Hz~Uxdnft z85oGReewx2oJ%&8PMdF%TztE9hg`hTp{r;C1ZHtO5?H&fI48``A z!{@hT!UQ80OG%0g_gs6yHH9*j+3rq6mMyJ@9CvUw~~H~Vj0u!T_j9lZ*I+fq^ zANu$0duV40d@TIWcgWcLk;9RMGwol8Z~3=KyDiceYZQFp+L&Q~H0daCdY+7os9OcQ z>c=pr&+b`8uEnyV8F^GbaWIx8aJDuJYxIbw){=>X#;A?4Ppp_Uss60~XF=WH|IzHC zZU?iN*$nH-NtPKX#VoJ1MIh+x-w=yKPf^|lgn3rfZg)oHiUO$x{9>P4wQ25&|5iQ2 z)se-Y_8s?cagXjAhiizE!5dA`8>10 zSBrEOCPn|{6myg{-Un&ECOC*})D6;r>_gbEve{9$q7GzR+;~tm@=kGWpQZj0S5A{c zc4R1BN?thI^$qvJX^vsPG4+m3hH|yRTIsZ-YvmRi z9a1C;KY?PA1J|5BY3{xQ&Dg8b>RbARirn8kp(xtWkUY=<@`$=3VBWG;vZK zig2zf%~IGKexqlZ)sz)IFlk_h&i*z4A?fy&p8L_l$Ap zCw8F2wz8>F_c0ZSAUcq40z!1f3`168mByrR2Z*m7J;~ZWj+|RxxFFUiJ8KxByJFNH zg-FA$REJ2p@@DCGinlrlxoRshMSBp{0CMYw1=Jyt9JTiRE&{Ou+kEkT`{IweBAp;}u|3kf2}7VUklo^ooJlKc$@k{C1lN$fPEzapHlujL z1m$4F17Qa+=lhqA z+|yhb(zJ8q8(^=tP2zf_h*;enHtx~WeJ6*+tj9Gh8rfYLz8)iG;=Mm6*&2%Vk`B(W z63BUlxHP6H10WhRZWNycf5uA2Q%ZIf?F!zT(NI75KrvmV2xyCo+hka>NjXqb>*T`W zq3RRX7>3ecDt9s3as@sMY-Ii^<>B^q^q{`K#5#J_HISF=8N%t$(AShCtCPDA(M6bZj6R7@{iu0%vXfH zo%F@qv=@$AhS;9X-N~1$Q_Lasn@J{_36eGf&QID^HXcu!Li(oqNk&3@$w${LA;{vv z!sh_)zX}C^>3O@UzgY|&`p1cs@Z3Q#&i@hnruU+Y=r>dSYWlSH=sor}hJy|yl;|R< zJVNv4fdKAdo9YJ*np^cxLf03b(ImjgZ0C(P`&MG4KH85I|1ZMc#4YLc z@B0=_sa&XW3e5$}%9*KLGIs^7ajdDdUCRZF8Y{PyTu>IR%o#aS69+s=+IN%8N7j_|^ zlp}mZ|IlnsuI}y_$}}aI8nyh@WZMV4Y0~>Cp>gg+U&BL4i(Zc~tx=3jHHGe^+`y*p zvE{8Paz{~SMe0dDL$x(7gb-l~7uyZTVWx$7qz0C#LB_Asc;9*0%4JqKpd%k30=;#G zhn>{9Len>z8XsuSAEaC>f;q;I6)_(;uhT%;fN?DOp(SBa~eY?Y( zHZ3#X^IZGXH9r>n#b|unG>x}?>L=NpQ4;(P?NGH1+=WTU1{fK_A4+-VdxMPE zrJuG>y?GA)Gl1;7kKOLR;W1=N5L?clx21Im_j?+xftxoi>t%(Fk62pKnsR4yw1M%? z{AD`Aj=lBZm;vt)QJk=^9eC1`R3xU@9bK5ve(3WmMU|r?9h8DQ=|2k$@$Qzc+M#5T zEg19Z7rXG_G^KA*oNgetUINp5EG4njyp59wfD{1{!|dPWX9oEZc3gID2#8>{tYhDT

_@=(_T-Mu|!F@5k;$^=m}*+}G9p330BrF(}4XlmY%qvkiq6s1nbpj5nLnZ?M#( z8S;cuubk<9968na+k{z&{*n5qun;E~x9rMq#3{u}0f9iV(h}t)MG0sLS&}ZB$(Ml5 zFPFnwY;1s2TZRRMS5=5p6)nazmuUVe!IFyaF-~UHwlejS3YIe=Aj`q2!y?`+=d5ER z;wDu5z96attqY>g{AjloZWAjA75x8vv~RwQjk3$GY$OH-R%%}ZdH|+f zdF6mg+U2y;`DX}M&bmAGufQoiJ73~RPjL@)-m8U^aP(z)dT6iql$)EEZ;6tHn>Q#L zFyfMFHrfr3ou~zb-nx&y=^C)BDj>s*#Do+?<)MMjc56M!|Ul}>`^}SBGfDSpOH%`}At=(m$9n@ckYEEnK zYgBweIN^Sbb{!aLZ$t9}1%!6^Bx-L^qJH>mD7b7q-oW*O)|$%6pEJ(tJuxxet0&oC zO7d67D+{iKv0^)dlcJzkA-8v7HV`e&_Wx$*7l>Q<_-A#n$i?BUVc#}D2LE7- zLR2277$VQu3CJK+`3&oT3F4X8=*)#hWjs44O1wY3Y5R=VkjhLGDNc3**1-!8-I4Br zEPlMAOns9NyUiDv{BME!PF4`e_)_@ie<$h1tteGLM<=5M{eQ8UGj-Ri^e3-(xO{tiy9@-rhy^b7ynZKZ%6Z zQv7~e*&T=Fp7P0(ah~4$vYz@0Z(i*DO>P#t!(U`8j_aD)JJNLF_osg}N*vc!yVd)d zg=!6d%sY)ATd<6ouu`n7ud(hqKV`)Ngygh?taxVCg6)_osG>R^*-wk2{I&D3%1)r<^-hB!Q50zL~T@Ox*=@cQ7*Xu+C?vk*y^w z$L=&GohJcm)hKz7&86p9ho8PArrIL080E;n3@Tje8eV#!GzdSpa(7-b#6lzX4y=eZF6lBUcU;x?#61 z*z&}QOA$X-k!tsYg-VhsVTPym(=pW!5$uy>a#8+zkYvvqkj6WVQqCNHboTHm6{^!C z>HxvWsL7IAPaWQh2|45&+&PT>w9yOi7@ex!i@5Ir>`T^u`$fc zlaV>!>gM@_K#oy=CZxpwSTesf$`^`IMxaZZ=U3D{-3onRya!21HtRf4@B%oA0-aB^ zFluq*l)B=k)4XCw8(0){*LSzI+gRiR5t{dXb|S)m(uQZZ`XtGA z_m%>J&l$?ExgH?83dwVuO-AJfM!*Myq@40GlZku0@GlW#TjzXohQ(=tqb9md1>T{q z{^0CaCO=;{;ayL)N?Ldx@(&nJf2rErCN&$kkdGRs91?(uiyKfj3;UF1>_FzrPrw4cgU4t8ttn`9Ip7Vj~`e| z4*t8m`M@CTxNUBZ8L!k-!?llZgfrQhogkSi)z6OVHScY9hHe$0-kz0Bo;Za0Eq=lL zVTxM65uNbZ+@yY$?i}v$Hfns;+={$pbbDb>Qn~VwT<7XJA?vbnn51f9?n~pwWz&RS z%yCwXJx;kA7w1|LrIE{2-`nW$$=lo!|L-CQl0SO(*if~$W?E2rrL-?L+U{nf0BEvw zepUeNPej(4FpvDv+{_psrJ_Thq3HU*(cDl^PHLcU03SbB*lI1jOBClsEi9ME zVBnK|2B!3<{r~lhF#A-2*q;=s*4CIlGrm{4N!cNWx;AY4u4U};h&Y5lAdIduk6n;6 z;)QMBjVx$QCpFLQJa-T|n)&2uU1Jk_m8m<&t;Rr}v`HJMV#GO74b;1IKZ z$YoT4e~FUS7S>_=O_eOCGvXJ4xTs5e(~ZRML3BuNilct&rk7!_2mM(jEoc|_jK$t7 zI#RkN0l{=kto4h@v0>EKL3JIfS7VxLjRHB5dFzUO3BN4x-~7GIX)6=}BR{n(2IKPH$)(u{Z_^SB*_vJmi2Pd`qk*nMN;2y!Q4-U@XqWa`yp_rpWt;Ua1BN=F4$tVXPc^=6%}(VOKBtVe;J|hyDrdkm)ZwwbW0J7DSAdZ%ou+wv-^xN&dzBmp$qv1oxy> z6Z>^w!lKnZB5w9j0=XlEz*roYu3C{Bt&>NRmqi(Rqp%5aR{Ne+^wjmV1`V)8KakiNi*;Q80$929wOpW!orMQ_6mO^%=B zYPA;OPOWyn2AmMrASZrgGCWwVqe^^X(x$h|eA#?CU5T~UB zSq*vXO8%eC)t@w@a5+`O1@LlU_iWTK8ZR^2fZ4L&sNrL&sNYWY#@lTDF2HfbVi!Xb zGSc|Zp&KhVNUSrmZ}L)npH{U=sA&YX3i{neTW1|vBQvtAgoo8GcMj+nzIM@5c@~m) zACW{9J)%5gtHT!K`T{7?-52v{YyogFv+rkUq)e#lgTD93PpltBi58^HlnC&0zix$S zG;wkaeR#R)7vYGG?M!2Hc%i%u0NI$}K_b-jFpHP~XiCH~qAvJ9OfBV)izy$L$eAB7 zIUi4<1Il2xmm>4$s=?6{bBg@dyL;9SPC4E_YGM8qTN9iNwE<4YAv&)s9f+4WRXnzh z>Pq}jRtU82u(_kppG(D@R7+O%lr!r-jY^u@8cxveNn64cmb#W+fs@|3 z@$wCW;R9NY(9SZz1J~)vK&m3w6Pzh!4O+JHuG&edSDLFW0AcTsoccTlxs5aH>uty{ zN#wO}GPV-ZekC0rx7`)v(&t?v4ZVX=j*2cPkN$R(R5c8DKzX_C@Qr{b;es|~FE!;L zc{#erC`nb1=9^VRdu~DRLtTknLMRC@)g^(&6zV~!L^(D{L3 zsCEj-dsdLUg{+ksWm_ELTi_Be!X>s66j#*C! zZ}ZmgoB4hK4Sl%ayt?omhnaU?95k5%Ss#ZXDgnehBYu6wRNTrc~Yn|s| z3%#cr4T!bB_rRSd9UZViUiXVMuO``?2cP9X+9j`QULPN5i%*kJXh5d{5Yd#bBA$O! z|Bc{oFvlP)na2q7b|m`XwZNiYLl@$yY+yCHSF_=fby!Un=IWceB6I#!`>jYY(YDTU z{QVtUM#Epvc&&j?|wJ40oI(wy4)xTL}Dv zb3dzkRn+*DdO@c}7A)(_4bIi4K<>*@ZRSAM5Uo=qxgoN~zk~*|x&@h>>KQRVm(tuv zik%CnrQVTMhSlBmOhy-mt$y~e(_<3B$S(x^3) znb5VU>v8&*%D8w4$8U93_n$WuHdCo!zVCl(T$@zg&<61cV{4jThZ&l`#m>GeO6GHX0z7bcB)P_ z1oLuJLbDtid_viGm#JNV>MQ;`9)9auW0jBd&Gvq?wtg~!y^rnlR8qGw#sncjbZSk)9ouYHvv9Gj0%I_tAnq1-z)>I$8ka3@vb;@^0b93EL4?f zezc?q6}fwR)AlUHU*9qsQd#;)d+~5XyLZ*Ibb2#)9hu$lGU=ew7}o!Z{Smp0-`}?* zKy(@(>;LAvM_^Lb)gj#nXfSU+YgB<^wzmkGQ~THF&v)rcP^jOzb6X!BNteZ`F=6FO zg+>hjVOvF}T%%D^yUq5;m)Xdf3PM!}_0#@!!DU|bl45orZXxG2ZoO^#dT zZawaqD>oktFa8|N%xzw(54KxwWPgC6W|(70Vg}(K!+6c-X~j>^pWHk*;qpYElmGoA zn;0^?es03+XwH`|WR#Ql(Zx<5g99cHQ-TjI<{M+!;KC-IRA6U2`@qg2E%cBo1N6qv zr05SAmpyI+V5{E_Vc+g>M+;UTcWkAg7VGBsvsEguP7wmj0%7?uGQEU${kTd4ecdFX!C>YG=)uK~ zc3&aQ+liHG`NN6Tg&g_l-PjSV?yJ7M^AC~(8FVWE9(w#{-#+AISefx!__wHaML^#t zTR6gNawi*5)!Y9Yj7zissCT`Y{U|I3L48V9ek~8} zXYfvXdRsM^g`$f9?!XfGuo6Sxm)9g~7?)iJp(l@o&|3-xp8Q>8`loBLl!kSnz+A-i zFOSMPgou=-`3qFjvGy@$Eg$EIRVN{fwZ<{|rMT_x49~{nZ;!f7ZrT?KE~b)U&SG3i zpq{T!9%MCn(_ZCfCOS1n6JUKHVbmbX?I*ClDQiaBA01h+60{oq*nU>&L2AEBpu*6; zXh;)$Y{M0Jbn`k`8%~wmU=Y7V7lM~Zme6057P|>P^j^tA(~fnQr+DwJ)8nzOcqDTh zU4wM|H1XwgXGr(M%PYW%heo;wYI{?_kWtxPLGT(G9}X^z7LoIG2_WeU)Wwp z0LXN=e!ucV#Y!{fwf%BpX;$wyEC7q&FE-O3Nzh#>2u?~H{JE>$z_gC*j?BNjm*wQn zwU&|=WJM0%<2&Y^IQ3JWXxUkq>UCm}B1VO`wj!21g}m7&haC(No(<0#_9F)(oZ-L@ zH1^)Z1-+jy>+=8$9Xb;-bJ}0Jjz%4tn5{`ENaugzywIoH$pWy#C2}*YmvN~38dE|_ zldQ2DyJs`!?>-Sb?SW5kJL(sv=b}P-Ke_r*I*gZt)(snGRdHwR6D z^QWj74~duBq9~)3e(~v`$>!piwQsTR|V#&li-l!u?~s zGA$hb+Dw~PTH&=Op}p!y3kB+*tnTqXeF;{pZhkaSfKx^=&T`}k70TZk$WzE7REd}W z1)YjsuLt6jeKziF^$4#p#q`KE-$COIdxcTJhYVnI#L!eoVfl? z@%it`W*zgTklftFYj;Uzt_qh5Aw|{DtKsML_qON{)TH5S^Gh+)@p`wWhZ>TF_eo*D z4;QDVAn<a(ra27NQL zPu(VJO_4Eb(>jxkw zc|(wWGU#KPlEA!GHKksdx%SlvObP+$e4IrVbq)!(G9`n(&Po2Su!A;cJ+H9+!(=ai zPNAH`)}m4ZdjNk>)dQYYy1yd1D^fWhwS7c&b)~~BJ4K-0-!))&xI)xgs+ShA=h>&H zgw-Lxvi~o7*|_{e$lEU#?(G+V-+xEJ&qRqiY*Vn;AaxVFzJc3fj|wivLedZ{2SD*4 z=*o5CZ+3?X{_n~w?3N?e+3G*XK*BkGSXpWVz4pb>ztzhc-fpC&f6BJu-&+rtE<6cP z$St+eJzM)UBx&*Ho*|~{{iDZ!M=zeyiE>Q30jy{i+&*@@!L}ZyXL#x=!Hey~f3;Et z-L{~5yLmQ6amo{8KQK@XOe&>-QN?}ZohaJw$?hGT_=L|xeida6UT)g0y=QDIV#k>W z*8w9(A`-nzGyK+HF@ah-aPcAiW{V^1O2ZHg9}=yNyqXO)?B^on9svkrbW?|tP}B&Q zH*Tk~Z@X!4SryXtW!C7h*nLt)H=(kO-tgB&#;CpNU z)H0II^l+U#omn>`B4bE@YqBar9gNnl{O*pNK_M!x!!|T84vy$wb8;Z(QV+PeIgkZ! zdp67_#;SY0Ocr7JVu~6*4@yf~7quF^r?QJr-_E)rvq^Q(!d5608 zWt8_(-ZL|JVjIKkftm|&c;dJF`pj4aA}$K4?O%R1Jl3_9uz3sKYew8<@mlr7(){Yh z2g`57p=-w|j)2>=8VnQ_W6OT!u$e+dzez$lOb=hpE%jIP^I`&+Wp&c3UBVlES@>z` z?QQ9*km%Buiry&Bir$@zJi5n2Rw?uW=83H%Wf-I}TzlM)U!yW5TWv%PD#wyToIXP? zof~8^2d0j!S*vu=uR%6DS8sWV6>AIMNeksK3OBx@aVnE~(0J>XY$Kty{_<%xbmxwZ zNJhr32ct=$aXO2KF62l&Qss)*3sgo!^XdlKw5!AXgG=6mjx)n5CiY`X)-O2Ayz zxPY+fO@%`-KacmAvG09v!>u_#9qM`&Ys>^(I2i>A)@Vx=&()l_obM~VJoicGXxdC{ZMG`0Vlktmr4t^U3ys0$)) z_0z!N0Ubir)M^}Tf#VV(^NgbyX*?Lf@4-9Qmc}#EI?HzqBuH}WNP!WPW#508jj_y= z`lhvM4OMky`r$vIJa~ZH^r6$CL-End|wDVn-8#5mLo-mp$l{|#g|w_>-btS+kO zQ$U~S#14|#D^JxoV6js$oI~|^s9@(vSg0y#xfTZNl+qZZbW>o_Cf|GM)}t@)GCY#Y z4sWf2U4!A9U$yt=7Xofk?MG>7QPyhQ;HWz}8MRGS0;EBMUZg~#wTY{n>wcfM^mc8} zwAn8%Uu|t_)tz4fQniA8n0d{_4}pyfkB+Qq)9n20u^dKw4Z$SXbKxcT$Bu(}2>o4% z3*uz|$MO^+b!?(TPy%&}`tce*veMW1bo~{DcMB#x=wkfE`exuWRI!rO^=~sy4^y}D z3m<@xi;bZC{Oa>@uVdA@*~2(jDZ`bH0v zCe*7AJJM6hQ@fh2arL*eo{efsCZ%qsdlA8VSeFhH$s#-47if7gB_c)(QHt?Y(&9F- zJUkEmxPLU4`0;6rS(eu~&CMvO(CJ_|#)Q3EqQ$*Bgm@+|=u_v@XjF=9(A@#TQa$af z5%w9drohc)=;tonvw>haaaG+%BsjeMkTsBdU)Ll2AHAX&Zh!Fdz7y&^wdQd|19f<8 zG=ctslp}amiD+akHGZ(0{~Rbeyn7EJlc8g ztFvRuIQmS##~ZEaJk{UYD{^zIGH?B3@^=*OOX{->Eo8p$f%)dY-&pyc*>?5-Rqr3 zYa~KNo|+hIB(b>7&xatIl}z%{&OcfD>b{)c*Y>Cj(Kk{6$@*+qW87~O-HVO22~ljg zOGhy&vW8R6xDbaMn*g(kN?h-Vk$Q^~8Z+E|`} zW?rEK?QM5beJpiRBc;Cy8syc@D7vZ1iiz#oyIIg=@Fd^0oj1hZy1DtO_IvpU$kK;F zho|aR6L;&yy&L;Jd~B!Bf|epT>_E}b89>{zq^~d)rt`NmmI<7+9S@?}4aKoNq0-(T z1$v=EI79gm>7@yJG4CDHl_aUNQghLb7-|LU`}=mkG5ceQ$2#`3Jg7!m`9)x*r!OLT zz5rzm@?KdIV1To)@t zpjoDpH!saF!l7B^{p7*tt!_chQ7XUBDwQza zh7FEEH_)LqN&$2gyr%HF3#*V|g8rhs9&yy@xH$A{p-RTbt8&DyRgc_uX8PrauLQ8l zn_JX`*llJNdCVUH$8V~iwn>ADjS-q*S)-XwR7I1W&AIs%891M*M5LmR*5Uim@`i~e z+=cN6c;p$1<&82W#MIv$Zk6eT$IK-!E|aZg0D&z9We9TRG_OMLy9N$tvZJKj%9&^0oMj!asu(GL`)kC7ItZ_c?w z*MCe8nl#+?XfsdB)DXK6H}a?dS-noRXKJ;ynkSs#ery!SnbKN=v5Y%{MguCXaU5W(l@lU9N&P98|(*6FRab|Zw=*d^f11<-nJu(}`)djj(9aDUGs zU6dJB`4#w9%Z&~vqUPfMFqJ=Xq!dFAjs)E1?G2+(qop%G^Bw8*7y(&nK`$W)@N$d}U#pqfOv0CDs&Wpi@{GW8K7*d}zkUlHwOyT)k6V zMNcd5SuL6c@o*>VglGW(K`sKSq>I1;Kc6QV9RP}FNl#rF37ukn7*6;n39SV80` zpny&DqO3Px6XUwu+acr=F}kN-&*#l4Ri+c6Ev}e~J#rkREa9MGH=s#A0(oo`Cz4Dy zlz;P}b?Drd5gd*1v2Y*eSCDm1@0+leTl?SJIPH9~-N7N@R38aR!HBHlnUm6`>8Zy# zI}1N}jISN6_RFN;X&>aV@W|zdbfqTGyLj*oDCVt* zi8eQOa?J(x+$cV)|FFsF%CYlT`LzWmrY@`RRUO}gV`Jpv=;`<#Ykn4~JrBybz3$?^ z6?iUNL62|BGPlL|G;;{LWvVTyTARrV#Le+CV6K}!@4#^Spf&fr50kak!hB8$--kQB zt*%xP!6P`wRN>3xtk)fNECz?zAGI=1`{WXiG0QIh9~Wij@~~yIhua49ravD_eM($q zg{cp|CZE1BZ$6=wYl0pbz7A?p!SC1ic#OGq-1sIQdcyw@$)0mx=5p-4w84?#RxyVj z23hx&fpu(iCr17THG74=Y)&lSp_hfnTXrZlQW(X^(ig z4}*#vO3}Ye++>2Pw^(+EzqnE%a>T1Tcl=S^p7)kTt-M^t$oTuR~@=HmRsW zqX@irl! z_G&Q^#$5^0b#&8MuGq2uAv%ULC9$+HA#z?u>jb(7=mBt}ge zdX06bpbfYKy&KyPm}^`)=TFy=n^hh}FrIjbPDp0xz@nPs%llFtQ`s-8m)=_HY|@)$ zjX12&gR4I1#jav_(l7ws4*}E zhu=Rv8={WCC)~G;4K4d_vHvyM;#R6BB)7M~^`4iach2QMC0`=Wizi3d0i(%Rc_n`8 znd1hU{RZbeU48U~i;ds!)${eR{*hvs0KS_t!)c2TMlY_5?DG|?%7ai9ec-k_1r?07wm{ftG_jG_9%Bd08Q#AoVxa{DgG81RyE@Dvgdgc z^dDA6L67a=Ym2A>mHwN9pj<m2)n#@Jly{*X4oRt!4s6FXJnO5iG=6u!k>|V6(35tUkabI+ z^t+$_hKjF!yp24s*Gd?A`ksuhdWv^Bt`gb;EZg02llb%)6JQ&lAW8fnb0NO;g#rUv z=0>)n(;5C5mit2Pb?uXbiWWYt1{TCrEX(Ga01slkAUBq*sOfDUe{j%$UTVL#RLebi zqcNPn_Ai$D-^d;hjts>%~f8J96gKXAQqtBi**Jk6F?I52zC@>1fzPGPZu#AjB3-0*<*l#(iKOBm)en~@q zqa22C^9Y}DK`Bal=OO!id&+kB0z>y5!Ka+f{3`4Qb+mc-OvyWBK139(>Q6$2W#r{k z%W;P`i{orU(Q9dM`Zg8)%{6WtBL_K5_8$ut=h)-F$xylo|F27<15avq0W04nL90gD zx@$)L0OqH07$yec2*K!kQahRyeik0|6WQ&h1N!~Vp$*CO7rw5rAa)w`^wK3xYL>8~ z;mx8f{8N0+HA;!#K=rH3;Kx06PZtwUWrCm8%EoXB7IzcL20*a=Rrf)5hTky(sW;xP zVr0m0HKOdi#={esyD_!(J_1}b|NLq?B)O3C>rYk{(;dn)PIVkAy^`WLj!54YEat7QK?g7nI*3>Er+-P$$X7pHdM8GZvq_;w%BEV66A z=2xRw%$YPTU;D|ed7*ww4H@&-o^$phFZ_C+uIR{Rf=Q3ZL4+h0_0?U2sbJ}=zbJ@9 z7c)Sct-3Zv((Q zY~dOD10N`0*!K9};Avw?rI}Gc=>B{3f^F-G129Bv6-Q#BfxuLQ zzE0lI&K%>j9{sv3h|M~?dV=_IPz4^ndkOX;BHK)uo)WqK#Rax;n0(qF(KI0{-GF_~ zNM-@U06Jh)81O-N9_4F-x5-cC00VQ--M0Bc(l`|m&|*Kjs3dJS!Tbpm?KxF5`HPq$ ziSMx&S%ajrj25qLQD)E1!;-U-oI>CIoK*f|6}K!SGNq6(1$Z*@1&#l~IEMhFVCST@)1+`=}zFve{CGeVprl!JOnNLO?#6?4(;FezieJ1mT?0n zYN@>xulHpntV_28_5I5|eN6JLiaIkD`6R_G_|H>sQ+B*8^}S{F_{WY$$@_ek97wlZNs*`Nq?@vSqOrW3y zKynS6`_acdxWCIp>sPj8un%qJ!MS9*f{A4P-Evdy4%&$YdOm@75=Pq7EpJP*h6)zK z1hq8<3(QpHS7>SuT$p(TqZNHri~IO?*7!Pq&_(aOKBBhnRjJTs=2z(lucR)zu}0JO zb1>^Tl-zISY76D+$D+%<3#ol0z(cgPnqWQQ&iUDsHO99en>ToXa(kF5Q|Gs9EM&<- z`yCk@!W)wzt|VMB$%+tU8)8}cJ$dT)ym)0$loQJ^0rx;DDu818yQ2SV zP`{g;z`}i?);B7~eeB9N!LZBETNm7{)5m0iMW}LLeW2VK*79ALqJJk8Yh$#C+yM;V z>Ujl~tBk2418pNKjAZ?yOBeHyJGE~=A)F>?UOD|gu|pceI3>06MxJ`>89+>39db!}cT<$kB(ltm z)ZsSHbf(!?ut8#k-b+!-bMGDaQ+}@0nGXIrTm}-E?Lc^$yEU4LrkdQ>Sj4t;B(V0^bfBqZgR$q7>6f>Jphe0B1+{>@e@KC=AlU;krWF_s6nmiG5 zgjfd%JJXYaIw68#H==VLeJ<_zU)YLN|AS>;nESt`syZI@VmWu351S3Y^O0uRLA%>N z{&Thic%0y$|8MLzVE?L{U1k^drG`b~6|ig5M^^mGK5G!r3f}FEUkrZzbb`8fD)#l2 z$>_y!Vw^^rmOgg7U zL4s;U8K9q?-u3?de(f$dbIOJIZMbpaoM(KLfz>g73?kNhga&dyh!XjUZB68$WK#Sb zZU=t(;o3vWy*9wZUeGzw9QsU0T(?<>&qx+Vx_=%`CXB` z**|_KuKsD0Ed0yf7FVJy|1P+ZLwL|XwX&qzu|-}j)%03H0q*EcsOR6o`s$;4dPbU- zjv(hUZDVk2{wea=q(2fz*4|u=Zm+8VSL;)px6;75CNh*EQXB9Bk92YCysP@(J9-4>;Ju@X5lyC(0!<^ zRH?t@eq_(L)T29HJ{Gk?w{^PMuf|OK!?*4`SSEoZqz0c4f}*$bpGGfN4X&gUFeO{R z#*pH^1x`A|Pu4GLw57s$?O%Dr$3c-oDAPQSG34HgW)2M|_|;*StOA-Bd$`)4Io&;j ze|{K`Ds}cDURPsCARjhX8gXkgH;GF6$H(Ux*oIlz!*5;+x#P8~lgpnrAXtedRUhSV7ae%b9|4g)N}E@v~rqdrH5UV>eQwY)lzfXMvoG88Y)__Y~sO|0zK>`di@hC zt*@=T;^LGY*oCg2NTsPOw} zve%XUM=Az}NvBqsk+sMXt$n(^Ra=iC4r}uCD$^1%Y}BOb5!$41PRoel^$5S3Ry0V+ zz^&r*apPK`zyu9>;-nWQS{=Y-t|zVew=R6~EW8H+Lw*m1uM zVH^7XNZ-7U3k7T8rNlip_z$5ejEtB3t;bNvZt7^?JRusOu_+s}utk zXxZ9uJejv^eSmadG_NE-#IFrM*MOP!#T^5HPiu&%0}NpIrUG;=O0DIFok4;{$D7bg ze+Fa*H{bEDe}6|y1JyqHQom^}(1p&6wHgcMiS(VU?{0iUvZv$OaMSS!k~gSMvQIhhdC)vQJ4-Q^SDjuNr0O}jW7nt5IVc)U$Zs-JCeG(*J`pFN{rlmmrBoH zc=G=+^&WmnuYdozBja>TX`B;Iu<1FUN>g(qSe>$^HcsV6qcX#dJC=FUIu0}|w^&wI z4m5KsY8q+|G|jyb1r!w(PyvB2-S_8l|9<}fyskGF*Y$e8o=f%a@o7qNu4<1BzM3lu z*YyYoOk7$#vcG_QjTzH)Y}Lxj_S^#rz!jw^P^t=Typ z{jX_roT<3KG0I_no~J>9=&-@p$CZ&m>Ohea)cjkkPnh`_WOFHG8IKgi~mtYf=Hc-}y)VHk4jO2`+ene9%U zleZP08CCv+TnsMk94AoBdbBs+@34-_l3q-PHZ>p}mQF_WWvRN4J{GQ2(9^!lfznS3 z&x{P4Y}H-X4jxrc>NUFASRx@0IBFc!H|9K3ZaZ{s-G4N@53U*n{eVs0 zeF1^cj*`F>x)VaCV^ZZW^#|xxr4z%ck>amH`&?Scs1Qh=JQ5 z@8Q=sr{x=x22P5c$O4_+gP{H9e?nid(sesmx9c(3^u+4Jsepn{jx>wO^4sl-AbSss zUPkz&B}*NGor;Tfl`a(T6Isg>JX%u05uV+g5u%tuUo>en$E@~~AkrBh8ra~zP`b8} zYf>+et=9z*ybtrb?kWHx<%1;JK&Cu{^G#56n_F4R2Ebe9X))gbadT_(Vq|>l0{kh< zSzfiS$i=VEdf&{wWLWcgFxC2>&9(8ngD*^j{I}k8^HSk!xxhgU8&7|NmXk?fVa|}9 z5oV2R;08S-ObegPn=!Ch`t}_wP)h@*VaNgXxH^()jz_)Z0#L87zn!)HZ&r|kC@LX& zAgL>s6tuu*sXn(N{1uQ8)wa&kHo)c(lMzX?-z@l#V2MtW9MUtbYzR^-x!>qKLaPao zBM3fqMWge)0|A1pL95LLXV-tJRlxC6s3Qpn0gQiE2X6%IW2mU3pI^V@5cy#&yEQ$H zxpkje&<$V6>!yg7$55WffX`InqP$xJ55AB`K29x)f>sOE4D>*z%KTBn>bzrNO=TGf zb3+>>W{`Umn~Ct!<~ZEfM7Q|btN^B6z~rov|1uf42hKRPmM0@O$UZz2X4f`v$Re`; z3Rc?E=)}fwWi#YuC8{e(Dp%J#q*%@sTQ4IWZg(9`Gvfc~yrdK5xBjER5E+>)I>ZMI z%i$e@8(9B;zT6PfE*CbPi(%zgp@O0^*-@+2Zhpr$|53ja&A75!D z=EDPh-CI9D5&h72gp6>!9u7?$mqe==_kcEMmInGGRGw@My@oQNn(K#X!n)9l;HlV9wI5?d+8JsY_%vGh>0auz^0d9 zN7g9+hlwt9v#)Ad@^|M5nZU+|!H~kN4Quo)of8=>iLMCTEyl~}rgtw{V_DnG#y^dH zkMsV+dYR`h^&1!a)=T@1IMY^&5#0evZjD`?LH8QydZ4iBr@5WB;BKBz80rY*eEI-v7 zOw4T)@4(bdGrl<1fgZD?0%lI_Nmctp#cjdDA<|Bzh&HtTIsS`F=j!cUo*SoA(EHH} zqCuq)_KLRJEhqZERonpZ0XZC( zMcEO}x+KvsVO2Ekcudk&-1BY{7FM0CNi4Ezs~HrxJxNFbAR<4&hpxff2)F}`dF8gi zIj1}7enVlhhnESIHBF#gl%FzOuK1R4Nmu9u@^oL;6>bYd39`>yONt81RZe7%-`R6V zZ}!M-XF(uemS96WiK8Xl5 zWznoTu^rZ4mKwvbF2JKAxMNa3i_J3p-=avg|5j#Z-NW(6vkuyUYSk;XU)RSBg!$gt zG?VSE15b^LL+4i{1qUauG%_bva~n-`c%$YomM9NXHn!w&g@gY>yy`pH^@jU&IYOrG1U z%9UZJ)>7;^(t0DLBzem1{8}@r9G0nXWW_3JT;#lmG4?p> zl+xSrj{Tn;mIzvW)5%DeteOOS?Gs7Dr%;$E4Iw6}{=@%$E&V83i`e5N(nAFyw94fp zjM!qez~29GzfjX|2z+^Y`x3xD=2w`T(&Jy1?4ajCg>G~s=_l^cvrHQxdf_hBk4sf9sJ;OCU zMn-|drDHO3xoiZ0bx#P-9lU3N?BAY%#2ujNO9aTt`J=o3$E5%T2c0S{lJg#QFx;Eyk$v+5T<r!u(%huI=TI`grHA(e$J((w(=LW0yW{fM1*$t_sV&x7Mz2 zQwu9>D}O4CQTOWJJm45L6}Mn8r%H^tV4A)uIAO8yJ6T)0VeN5?)XW%ZTS@1Lr)&!O zb`(}(XgG0HSf3vnTt$R$_v#b2?1IJoY`=zT3B;V06dzp|4|VOJ!R>I=Imtjn9^H zOgCPQUJg0*N*bjd8rG!6M;;>u?O6EBoRtD`ia}+mHDHH!>2_0^a$$pUe;dAszl~h% zf8SXK^)x68kLclBZMo%P*dp(n`Z@M@AiEqBXWOXhFL|ekK&vH@s-$m3&J^ztJ&(gA zpIoHY7}!o6NaBTV(UYnx*6}(hZ6sl9eqDB_Ts=B5*5SjXY5or3>?`1V#pz3MB%ywA z!RZ4Wi3zs(;RE77J##H>+_s@Cp@Oc;bQ_KLmflG*MTqHNc05f*rrte}2|H3m{WLl#)94s4{+icrML< z{7U7RaP@D__gOmrZ^=UeC{nnRL~!DY-7!6N>vlKhyNtM+{l(4Wc~ZT{vUBp;K8P@` z=1>>Vp73>RGhHzLWGpGqf;#v{S6y_{ z>-g_g3mhcj>5fALN|fWiw$aP)4Fm^}P$^u#=S!@3*d29HIFfawI2<%t^lqP`RU&R+zGJyT)gOyr&W|LvVFsWXtg7}YaUmYTI1(xZqx6-*QFrTrZsO5ZyiUh*i2a%w*-yCgbX zm43h=8rVdGQNAiqX{6RGVJCd%l01(>Ab1sEmvBmq&wM!gkLiI5R}*C9ebHSUp5P$g z@2Up7=H|;#LuZv2Y!_0@MN)`F;kyq15=~}*tMLJfT{g=eU(-vx3eafr&KcEI#{I%0 zmh#Uky)DzLVPR_$mFMMgE^wYAwS4 z4Q60YeU6Q^X+;$TT^hqAbn8Q&=}=Y_g|nycO%4Bp?gv=X)Jo}f_qsEmv3+_jdGZQw z3K#oDj-;*@fu4;2$gUn8oaEVaSC)y1vT6ALFtC-)41jfVzmr$C+vszuH_jGJT~m^e z2>%xW>v5TP)!t)+-g3sDenF#9a?1ysR6MEqZBv-@sFOEgZ?O2p9mZ2SRI=*i)w0~9 z_m_~U7kXC7+y3s102SF#Qu$kecYKVzw$_SoB3R;8p103ra+%x%Zv&c zyf`(Q%+6rQaZ6V?qmMyWyYL5Bt-nn}RI4}VApaHYh@?SeHOMc*TrCAwWPUQ1}8)i_hGJr z5_RQa@cT#-nsASC>|{!CN#UPu4t zb1MB`J(x>bnx#khlIaE=cJZYgD4Vyni$_6jWvgNd-BHP1&BA$Z&~tB?BbA?+@3>fR z(3H+JGA`JYv!y3Y_+2v%N6lBJ&N?C5PB&Pgl+JT*>VMiU7Af6j9&21Rv0r#nj>C|H zWQdWT#IoOJ+I{MID!k1|QY_rDB{~M_KbiNzXv>@`-FO{vfsEkr&dov670}0fiU-Y0 ze2Yn@-X6AcVnN-7`i_?YVp_Z(W#^=YEuI2y!hu`5E0954!#ZW=7fu1-mM zDDoZuuW&@-$oQ#yDooBdlvVZrn1s#h^+y311 zhwz5)k*mO!Dks&?PSc9E-~3>L=^c2{fJoIzuhDXDSHfK04iU3yN`nf%U(-)BvMunK z>MFM3b)H2ZCuDDSSu&p;A=Uga>WKwEReP^*Zsz6wwCE}AbHr6PXf0%Cgxy$~xYCwt}hx5iTUT$KN0!ED!3#I`$hr^XM4N zCf4XrgiH?PG`}k#s@<M}HSu_5GU4%Fc&S`<^HV zbG(r|#~T%};;KaFF&~>3wg|lE@~TI+J?F1RP868O!t^?uTzTC_a}xBNu{q!PnJ(_H zmnqAu&7}bbA0w1`$ixzw1Obmotn^>{i9BM_&+#kWG%g>#v-iW$ElA$a=j>YHy^?|M zI&2R^7b3IOZ1!kh!H0_RE^l}9RN5&gqSq$trmEgh0`GKTQp)C!0z9{5mGKu*d4WsN zPfL7qZsilB+#|s$(a=ghE%LkE!F!Lc9sq{Ut2(kJC_7@Qg7jr7uFt*lr!wEcSvS^p z&JoI5yggv#;6V+13)~7k&_@qAV^>a`*g8*T zM`v$7dLG>SU4Or$5*+``{3cc)E^QjWc>!CDa7&W}K*Na2gfku?HaM#^0_X5-SqI51 zbUlTjv)R>rR$FbFOf>B{SglYL|HTMs`#n1g?|a){)S+s(=ItKr@x$QQx3oIEeI{~u z3z=vqUwj+cLQA$LK^f^Q}K4blG~rihO97IQZsJnO1OXUjOw+Sm^W`7 zPv>sK-Kvu*m&~~>jB!Y}{jEIQqV~Q*>GW)RoC)$&;*%~0gVPykO`;EM>^y4og( zJZLL=2VNiegDVy&|>(Dt%^(+)Ib5+Av~Iw^+Vx8P+>X&ThLm(kUxcj#?A0CkZhn;l>6 z&r~&U*B(G}*0Gmab?h(kqH-eSOF2<2N=_pukNjldgP|orq(KtBSvH1{-4jHb8RHMT zTe>c3`&KuXVqJ+15J8@3X8w{vZS@w^09vk*$8d`3>X_f5vWp)X%@JkoEZE{5Zt-dJ zFv{NeQ5fqw9@IcbwYlA_9D@eu({scmbIj85r3lH`-0z0^0e{5XPf*7etEHu@X6Bj{ zA>~q>F1U6z@ByP~`#NUsWs5f=Xmw@2#Q-elVuA47Z(iMB`|m0GOFhQ;uTR4c3zJ9M zrrtp$nAKA*`b~BkSysu}tyZ^qR%Ysm&5n5c9D!#!DGZg#@e#>S(knn>l!UeC^N+$> zd49&$chHHO?~V)Dp9}Q?*oENb4%L;_<%?e`Oq0r1OF&rk-KqM8WZNCpd5m)WaAN9E zx@ZfL%3swVeQD|2(W3FUug>+zY}eCZ*64xSSJ6hRt?6T13y*b1%lb5wk=My2vnCBs zawUbjl7aIE8eitEjrjp`|=X-WivOBS|4b>x&b;YzC znA>QvPf5Xi0Nn4i4Rk?3xKRE3PTzrn1R$!+y(ifygwSudl?x<(0m z)%WzZ}tG_LLV`ZDiJo)4Z4(dN`Oek77fz^HQMUGpx*`k4DcWv+yGyptrP{oF} zlQIop4TUSLEg}cA1@sYW5s))mp5ELqW%Yxyp~MW>Po>EpQh21a`S_4>oY>5R*|f2j z8KhXG5}9PN{Qj{ztonYv({9zR`HDt@yXCmFOdE)h4ITYbaw`zXMsy{$v zkQ*7_>CejX&~c8T8483=I~KgS(rX_J!7)D4ts%Ab5Axlk)sT znxN}1HcQq>oJ22mwx%`2EAg~CR(H&nSIM*OTwQL7W& z==}P4y?;$Hs#(VH2Z_87l2*@84^sk;@T%)k#kvDJ=NiFNk$tM7o(mT1>UsgTMXKS4 zZJDo{=?EoNKZ28QLJHHoDr##VYA|Hn=vZ!05#qFNQ{_ zRnNrGchy#3&u`|%*GsG=30{dR^$C5hp#QGK5`Wtbc{_QiUKZ21F8d7DME+bvsRmIp zjyGF>5AsQn$6x8po;74!>(ia!)S`G;MqK5;XS7ee3|iAF0K=&YIc-B_xE-Nus*;ZA zJ6_h2&)HO2-?%j}Vkq&XeEwKExH&-6Qt{`@G zr$O-xEi#yIt?=EAy@-A8j=%ayyJD<^SA0hzq+5T|KI%Uyg^hP?gQlgc-dbDpo$GH5 zcA0nXeH*z1iU7s=k7;*SnV zop+1D%hk2b9g*KxAs-{mUV0XbR>8lk)d%`T6$;{t1MvOyPCNIL3pgl-(|R=45BE^w zRX61vFf6(2`nOxIc}+&LJ|t{4aE9b&ku9Xp-+s20CdrfiW$zccv)n+TYERvGt5RE& zd~~IN<0uc88J+uHN}hT37J|fT#v~}u$Na4iNF1%0zhsgoe9?qi)~;Cz@&$X=bG8j= zwxn-4lP${)ENn`GZ>QyNF~~6}XcZBufapOk6O(vESg8m0N6hDrF-9HOLcb=3$(wO- zX#DhuyQ>uh_oF^sZ67A5cD%FiH78XN2Ku=v{ZK{Jaqo_I=k}y!qbFxjxRZl-da9yi z;gCEB|4^n`T&O2=jgP;=C!OXUai9F#l^K%`p-mA(JKmeb8iigKc*IHY{T{av z1=KPN@ZJE3BkL)_kY%)CD0Tw;cNOt}1G7`d&-31@?Q)!|%P{fO>z$?KHYPhu&5 zaKu~abONvatlUEjH|IL4`OA9VMc=%5g;Kiy`E5^Rf+}8b<6WQzO&SIteG+)XnFVj1W*R4u z=3t7X`Dm1Xf*MH%2UUf2tgM3E+!RNr%gKhG-Pi35f_*>RY3vg9 z$fsB+Ik8+lbG#(RQ0e5t1$f>`08-S7>VyfSEfe#B!I$w8!4TP~X0A8<#T(~3%VbT% z0Y+-1PmROynp4w3?pC)JB2#C0F1N*MwZe>%750juW{iz2e+7>0>uZbCz?x8n!+bew z)1{Ahq*Y}6g~&Gr?tJb$UE-kU$ZT04aFPo!uA84^gSop^iOx)6BPe%E!%0zo;s!)`caOct>5Qd;RSdz+&_S(blG+H|K56n!wS?g9d^5p2@>9QlVy8c(x%WhKEANdRaJh_b_R6Q{PstaU+i zn$=vzJF1s7J1)i*NyB6 zRG4{M=6G;>x?P=!U%*xU9c$?pKKRvCrG~P}I0)&bi6ZtYE~G@ND+mdOALY_M@7&ZQ zjYu(7@le@mbSwUODP@c~j3Y!e;oqKZp;F?b`=Rd+>6MA3W))Dc}RK&&rm zjjX)tGr#$U#CZj-HemZH?9dOC+-D2Ylr351U~TCzK{89@UAk{R39~og-KXi;j)jiN zCaMr@zRR4l$a(6stN@wDQeb0jl88`+h`#33w&xa^TS-gWfaKO+EeSz|nCG*}SwX@1 z;fY(yyL)9H8;Zr7guQ^~_X>}9u_vbP9+V8iFIcmR$_sJJnX4IRU@XAD`2{`_gA4Jw z@h5Uqb^%>rLV5pKK-X+FgwA|ziT4;Aii6``o#Xt| z;;oa<80t2}GLE7WKQtrv%R_hg-)0nBd2;ea&Nxdjy7s%ZjpvY8ftXv{4oGW9D~``^ z1ej%uzaEW^r!9c~)7@Y&zHWi(^h%Re2v_p(lTj9P-D$@xx?=t=;JbCkze$zOeEF%z z`4j=hjhnTQ;rC;{Ur(zzaT5T_`qd`}_%uhYSrv*zpMzU7)_k(J`WG&Y3=Q}fIhy>%3$d`Q2$V%Ngc zDkC%Can>Kb^JfxZqn~mUl!uKgF)YV@HH$}C$Diy}+7{_)kurRRefc%S*6u)jDk)Z7 zTZgKbY6lU{)1txf1;Ql=ENfG{YT^~{$Gt3akdSx zjm~EpufW+FlW+Lb)c2Sj)%o}I!2lVPQG`$^!--$-h z(SI!O+v1F>T=ko_m(CZcvr+z6K3%1A%I^9PRm<88jm+Y@b#mpQ&`?o(faFH|FZ|8! z4LsNtxw@Ba3^C&b%Hw|efbWO&YZjFcXt?f`uB(88a7kAVks{Z=>}_Jm(d+ze%(Dh< zp>-7+M}JnG!ugUOfh~(X)-QjP-J{HR{Xx@NuwBdR2ldEJ`&pcP;GS7aCE(AZxuZ+6 zKeyij%aoi*2`r^j)*WCd*xhrFoh?=tjT$>V4F0Ix`QoH!Yu~mVzbYI{KlCkfhM&VzK26!IdiGYTZ-6a8Lf^aKe=xkhI%}PItMS!V1kz=|m9)gD6yNy0MfWsj-}+#IBI>Gl z&c!RJ?}x0kj6|E~9!&5fgUSL-DsO8A7pW(GR<&eeF*^MkEwAJWC6J=Ejb*i!0tC@S zp5AD*ZTS8dN|gBlwy+lLQT?1iF$iq@NRjlGZDk$3*I$ubH+B-*yL~`nhJqdoYETCm*`^BCR z%ecqB_Ug%43|suRKY`w>&MyOM&?LnWHrG;-IbM?0B$vAVD3@nw*u@MX59wnuzMB~! zZ32)T-|A?9_5rMQ7;V@^IS5B=r!_+0J@i$F;hBn0_*0Er3z5c2<7`ZhDM&g%03PQk z+xWXEzv1wCBeKOh%D!>8jK1Hxy!@K7+03YEHSGnJ0XgdJG8o$pA9zi)@l(K~PNjum zi_W@>7E+-n|F?1(Xjy{)p?k{n${vM7sUao``b&Q)nrYPvUn^iMd=Q5pNA^YTIrN{Y z&9tYOiEltkc$ho8<193?vmi0+m4U)pChv3~V*f4t=S~1Ie0OtY)o2M$@IbBg+1_Ij zb~~oqvrBF)$XT*o&Ur0{Vz~txwO%7)#w$yFAhmAr{!1XAmK`|)a?`MwW`i?&mY zrw-PE-A&`UM*O~!UPWxmz;x#KA%8#58!$bHBR@(&~Qwbe>YpkKJ+jpJn6D?fO~wxaMUW&-#1aFP7Xm zVv^}|1mX~H*X--J>eV<+bGsi#)B}P`JJ>C($Tzyx_dNY+8X~qYn?O1LpovBaLn#-o zDOx6r^a|uD4x&F;wzRMAjn?c){0-|P+S?4nZ;FkSoUa!w);nKfX0q-jKzLn|oVdRW zbl(pFEH~oJhn^b2RCD`Cbs<}CPdI|;;%x$eNGnUoyf)2&TrQK&nT)P{fwL~+=|j{S zaK@SU$`?aK_st!oT|0s=JDgyt49{(ArIV~|r`(isgo_8S12qs?8?x1Q`*vkU1WeOG zNpbht?}zqTn%&G0EoLD+K-4nq=zjvkfh%(zaskrS?eFW%xa}iSpV7Mp;!s5mQ1DZJ z5RA~++Z}I9aEGu|WaoX~k^)5P&lBbR+8iUR^;Qrhz z3VikmTFI-SF^Ur->74D&j>EUCfYjDb#o2Qo+lVhCm&h~kxFRPw(lVRejl2zGdHHQB zNTSUM2AqQ)S*2k9V5V)rk}cv*eZt%g09kLJIx9Oe*tf`7P`K9FnNC59$Ag?zP-j2o zwmuO?-PybTqciP1gw@iR&|Lsre@wG5)FX4w`F*%1;*w&{lmdR% z6eiaQB@cz>R}Opt4IYy}yqn!iqxCY!!joSPEME6qP>41#z5_)?BwhX&f|bn0oWU*H zLgN4WmS6NGi*%)mT@`=o(0hdVroTlRC<&HG+YuY3$ctHXCI1-36#w2O+%h$R@oEJ| zFl0H70JM6Wj=l$}`A8b~k!$EU+;c`rN7$~!^9bMb#CR(Kb^eS&(}iEx+f}_Zf3qK)qG6Kp8XZGJFmje6JCcPlna_B);|CGE=tD_n1n^!C3#d;Gt_dQ4D?% zTy8-qTNdMjte5ZxpBoNZyKmWVfdSx48>G9ks?3FR7vgn^MCqD@FK#UM=IvehM3k%g zlrP$n&h^|l51y^Rd4gp^Qk#G_u4-oe{O0f5nb{+DB@6oDqfmH8|F_?#9|r6^qTuxW z&aq#S=a(zSu=`*aF>WVQRYjXC2l6~}_N2$Z9AA6ah;th_T#JhYv)2d*j@nsA*7Wj* zz63Mf&my3ShauRuCY2-d4CFm)-?P(9+Zn^dk&s=N46uG*kk7}_a0~an)r;ByzRH5+ zL)zx(VtxoLPdq{FaStOhiiKlE&?x_q9>AY~UZPz8EXr%KgY%R^g8M;iXzu9K zZh-4 zN9rp_%+*iqTPS=vq8q&9UA{Xt&zXmd~MqU%GhlRk9Ac%5(^9hiFq; z#FcIBe>}l}TvHyB!>Z`G0BKd)(AiiM01TPG}1LkZG8+k~KGCL6jeZg>L@B$-y zmbPpATlj_-F2!Qk_20qM!mF@cbKlB2W($RgJKylf>W`yxc+p#mTW08k%&l^N)Oj)J zs#zV925zqD&tRVT%(_L@OZcIij(D@xGy7;tvEFHbWmxv9oNgj(9mhaZ9A6PRkP7tWi6#SA z&w{E1BiQPx7%qHERE$S%u6Z{)nLbN3Ol4}e5TZ(|x7O%(@I~G?wO`mg{`2mt(O|bu z={OSOQ`Fb6G3>KBt}m)x{VgRRXFYKt#w9Hi4R;XioMFl`i1xJD67PKhO(ya98Zz3I z7;mt3b);ho!G71BRiQ|&8ugKQjZKYsMr`cu(WYQ$es5_YH40Z=;1?ZVjR<;=$A-(6 zRa)jiJ6qgILFM#I9YoikjFvH4#qq*^_E7y{2%bu0%MF=+b=k^5cg(s z77*+`rKLF*yfb}o6KI!RKY2r(^%v43P+>`r7nDRF^V@Xfyn{=!mA_}+6s($`)4ulb zBI`EgI}s^RwG3W8_tiTyL8Y|}796$Joe$2CE`A)yB(wWrQ86nhm?#N zOKDMI<;n@Ab-adUD`+G)<|B;%745?qiC{!s9vhQ#T|d6_kcFK1K;OI$mnYjx^nW}a z_5e%<4Yan&FZoRw-Dux0(UY-^(QYGIVk0d=>V^RuIT3h94*7s4opRFeobw>Vt6XN zhC2}#H?b7m!kHAmqu-6wvD#uTg=tjYM}@E1!JKIanW%tG+!si0IBs?2534mLKGdJa z2<=J<(3%wCWi`G(9my(F?`Y)m32jB8IH!ZpSn2`zG(j8@Mn>2!Z_r$U5LqEaP1`Rt zmEMC7DgTML-U=6*jV!-w@m6oVZ^3zU6vWC#dz&nZW~7In+xrLg%Mn$$+=1j{d>pTF z9Ix^M*W^UVrC14UZREjOwh;3}k|N?ekBI%hB)8tC!C;4#!27q2tDDN>tZI(t%dXYwfOXNXlVph692+;V}6WWL-j4#Ht`e&ky|**_85$ z)sC51N$2+@@ej;4v|#^u|E#A)69Nw{^BuirxYB&a?tJMP%WB_#P!jTNc+b| zNmNK;5vWm`Vnrgf9HpFMoNy$u4+~OqzY(iA;^`I~ZNVKl={Sj$vLY0KW%_ z-s-aZQG_hfJMN)3yR*VK>vwHyFkqUvZ`&0QER#Iy6Jqk-?&F4GelV?@XxV#=0%>vySVcGI-HHH)4>g7-Z zZduHED650>H`7z)6Z^v@cbS=z3>f%if*>=+g4ZlnE`gDIgY=xgly#4P=P6Iokp zTVwc$<#^5q4PwL>Mbol-E}O3Mkjk?D@1KDVI(MZM- zmM?I{p7?ix@z%n8l8%4nNcXqxMA~onmWdHFiod%yy7=g08s4{&6Cy9}ps6!~P7!8h zP{XbMGqI|;K9vv-7X z)?E^j;}R8&pKXA=_crY3awt0;>$&(fxpK44?+WOj@P~uhwl+W)lk{8bm^-lI6sO{r_=T3Dz{VR=C zA2dMt%ljCzCOS+jbOVjg0J2%JpVev2HH~d929g&|mdbC!_&d-FygydWkFb83J`)}) zM%Z*~z0ZkU=+w@s_<;09e8`PT!A|zOO)rK!A3+e_d?8>T!BI7)@|LJ$vZ6n;-4ZT? z&UuXYRhM!=;r$%ts62?{uNlm9NjQMt8g~!a({HeNTaTt*MZROQj)O_d zwOrXz&Vf=4etg||OW|7W5zVn%9}7I*@b+N>^rF@;2kZF+YvhB+d&LmkP;;%jpy3VTXD4?I8N#@oM|I;0~XtB2$*y!U82EmB<$nGSsUi>{h=l&$fvGpA#2{Xu>H zV0V*-lyUpt^}!(-+9o>Rq7&6>vDrPgd1Ws3`S&pF@eC*t1G|O-sIV5_9eiOy78v%{v|c1|~JuoO-Z%C^J}$Xqa1} z0#`578{+DgLTJIS4F;oyfr{V0YD>W1S=V{~c^*SA9(~S2Wi9z%4SkLFcb&M+seMwn zlvEWko;EbmfDqzw6$Y&}dUtYa;)hAa^*6o}vOa^}mAmL-Ox45PEIod^9Az+ym>NBR zufK5pXiZ8QhWnA;f)AsYPH>CNv+)ZrTE2RFn7V~9Gyhd=tQ?9JB-}pN`uf(R0SP++ z0@R+^I?_U3rqEZk#r_tHqHqcCQ8sBfI#RQ+rER<087-@x$dC^OMsoRx2VOLL86s$k zdj3J#-($b|9_?%X(~nK5P;OWQJbEAk$qRghTp<;+KDu%YTmdBVWrBL$c`8oLy{6sT8r*4?! z^c@LC9FB5B#CXW9CJhGPUC=8C&NW2ppsL6~FHh(vy*n&Z0ZhVvh|7nH6 zxg|U-ZirN~RYZrVM+S{NP}Gt(HsVj!v8@W12P8tTcw(S|g^$jCN9cp5bNTquG|Ej- z_}~ZWfMJd?W}$_oQ8^iwCDLJ;JJ{qK{OSmw;|MO_8O%WJ?vL1KMEk3xehGdN=|4!= z=7?c()f^vmZ`G$~T=x+-g9Zo4v3Nh4S}Yg4_V2$kk+nfF0zlfBllBipWo>;A6gBc` zzZkzuAtJX=*KkbCbz!UKprOq(G$FlINZv?=(XA9w&W|xcJj`w;XoXHBwK><--2CB% zJH$wk#}e(Y^7GKP+ISsxr)0Nn8g_A3a29+gH}cX6Gkq*KLYzveXP#L*5<98&I3PPX zv+AX-=eqlcvpy=)^x^vneC`PtcIY|x?-i&)skNKn{fN%)^j9{ zJ7#h-8YWvb4{a_OYLZ9L&$SG1&c050_(E-m8>H|3w@Ea=M!6lYWFmF~7kf0K7}5k2M`8DlD_Usf{6b~O0pZ}$l_Uh*K%fwjk}E{SrFUB1poj{BiV zWU99xdm?@zrRJQ1`?`(UP^T19!_#qlD60}2ytmcE|jocq(*ZeiZ_jC^aRxqU7=>UW;tehl(zyN=?HPXU2@1kNb8p(cNj{@i-(hzs+% zy6Rk{DJfYrt(29b>0eDA%S1m6muYVPq1h4 zR=M-BTPh%d;C>=&cR+ZRV1XRnDDCO|H!f0>b)*1KWceClIFhsQq;$R zt_9;KvEKut-`#FlNYZ14GxYd7X#Ee z4Sr*flQ5;j^mXXF0DodylqXi9K`p%>c0%1C*ju;NIp&IEc35T^2Qyfz_{eDQg#(A% z4`~+ISpHBH4KFHNW*>^8wsPXT_cmh2v{m3n3e=0Y6>wWu+fUWmV0P!j(C?KyVjQOO zC-Gf@(0wnbQhEcLl2{+mvaXa!o8M zGk3`a1<{&v8W$`pcd;_f+@dsdw@lDfP%&}KB@s~E0cGd;_Pg)rKKK1R=lG9*c+Thg zp099S*XQ$oz3LEbqqGLg>iELgBlfqym4nkO(ePEp4>mQjy!mvF(j^?g}sKOw~jRsEz)ak zq6BGl?U6-#6DuLHrO)JlmLe`B{?}44W@K`ni(2Z*x0^4kg>`RaMo-l8df>X#SGVfF z@skvx&&S&b@th{$Z(q|GSM_nqsC^dB=@(@^&$RYx|5yvYEw%+F-UaM%9gh<9+rqv{ zTA?5w4V_1sDMOGgsrhS968K(9M;;jJD=GU|7{SjhqCn`vg?5+z`8LOiGpi#GsEop0 z@?ZYM!NQndVo||p4$xx%vX!| zCR{LQsyntgKj#INzM8z_j~LbZqUn3M3LeG76}@-!LEd?DKTg?QDX^kK^y}`Z1w}v6 z#DlDl$}^rxJ9BfUmt5Nwb@_AF4R7@A2TLxCIJ2QU_@R@;dSxjSV6buq|hlGdWgLYC|51R3Sw zg-J$ysGp~LWVB%di-9OJnlc@H!E<|o86cjztkm2zuiMx%q}}&1YxT69Wpc!4C0WK$ z4lX#6@y|=Em6;2b+C+A0HU;JJd}hzqu9HR3k8ir3tg=YG4_C>12cDuguLMFy{{%lu zwy#uGRHU>7r2_P**kbg>W!*E5y&~VS4MlB>%gPtDI7Vsv&BVQ*zPtLLDBe?8gxJc&|<>yRH#)x8A4Qga2??3s=Gq=NT`}wG2UD^s4ecC;UuWj6U3*i;^ z?@zA7!X%g9XFf<7Az>trA|-=es6d0$d+|@CFQDty*FQ31{WUVceKAh8#!e>Ox7vPYDNv%!fLE7^zfc7Hoo zk=nq9)*=8vtzj>n?QN0Iop29B=F}%9`0o$JDzh0*HR2wGdskTdO?Z7G?~FoZ?>w)H zBF|9#<|4-x2ZlD~U^38o*=+xO0DdTeqh~@=?XVVL-=972`kuvpEvIX7K-?kLw=*;= zeNMixoz!Eh{VJd}omTZFs zJK3n~a-na5D0@+5t4 zEKPF-b0B`s2Hg$L(0jG~miTwm)=$d_lcS00vAYPQE=!s+|EuYh3X7q_zRgD_>@#C7 z0w!U5{cPGj3#-G?02(Gz_O+bHc;)O6vQ%9~IZqk1pF1GvZ5rDA$Wr3}apb;USfLi} zD|Iffw1`N#IQF<4O$uF82RK>$F7>{BG2}a`UBlGIrb}(D=Z|XTNQki3B&E>|YiWf? z5tw!5V9fj`oHvplsGVirD`e$ai%R6z0^E+;)^FuAZaEVd+%JyKvF-2fM`W#ctwQ4! z2+32}TPS@$MDvY@;YLau@rD9Hv1god2!SD@$k!Z;ss}xwWR_A_4lW~KuiEXV51*@{ z;uK@Zut$}Svg+rX^hK&DVPBC=^v86qCA}=qfA#idFk0GLZy5qJAhKn<63xK>eypVN zG97;4ihpUnHSa@B8F7R3U(fStx#rfXO`2zKy2$%?(+;Yg|1^ADH^|cBbfeVEpa{WR zBEnrcG}Y$@vo@^Wr{iZshFp;ka4m1{z`}lR>$r>!`CaG*ZX>{~8g`@;g*~Mgc^9HM zY3Lq%I?bD{2^Hxb=slDr(qkL+cN1~JXK#PLmcOf{b&DHZb1vvmA>#9E(CK9(rK^2` z2;|j!R@a;cPa^{jvT5h=-*v>DSLDpMgc?7JoWG?)xl5{yUHfS!Dd-=>m!7+BT8nMI z{?ux79EOk3a+VpHZ+PC3aW-y@Duq2gI%)9WomMgC&2mR&4+D(~AzD&7i-*+`{UdhNN!9VJdIMyCU1vN*c133)*O0eP}b}HQP zv3p2CcYbQQyzj>{&a2J&iYjidVoE#bM? zRPkm((o_#Ww8?jXZz?~dsBMgJUNTfn-Dp<~Pa1u}a#r2=hqO zyTsa^>J@a1npk`t*2g{)a%qNt#tr2TX2pq*3XZmU8YQ+yi2G|Cw8;k0w*MF4nnr`0Sg-5W$-xXkG@hT>8eB$^~i$K91$(@94`>e@G4YxDep zb6*r{67#}sO&fCUom6o&VLGP{`_RI%scmJi7VqIqVdG?gu!jO`ew7?BRn_`YoE9LF zk54Wa*2bDtXR4+KIzGI{s}#SxzdGyjn#0ZMthDwoa16X#9fO&A5r+di3W{DQ>lS_> z>Cp~OC_cWN;b9EgI@E6-gaN;=UmDW{!amPHgsd5_c1NH3SZ^nrN#HI*yt7bnu3k#o zf>0U>PU%e{+U#x_Rc!;03zF38kqk1^0f0$}U1`@w^(#9fI|! zV+hsRzyvkpuT%77KgJi+4 z_4M>+tnJLCnYn&K9fo;IUB)0Z)<`d($e^r-(k5=(rUN1lAl)jh26Bg+Y|2~!`{zF= zv!aT%0Ll?w_09V0bs1i2;NEKMY4)VP(5{5WkYp zYV{?VD4>fS=d=Yr8j-#Avlgue_gIniXh-IE>Mr;zGuV4Ni<(6v%pq96hOVHVg2k)*_P#TAa z!2X9%`7N@(+^^<+^0)>I5#Q}md*fvj6sUPRWK^#-y(NyUq;)$zjf9MUGoozQG?p9V zH``7V2U0U(@5f6IEN@XU-CJgVm;v3mx3LkRS*LDj#xjbkmYt==C?ZO?;tMaWW?vS2 zRIOA@$3<7tw!qeU1qv~H)?Hp1;=Yqos_z0>HOH9jQBR%(V}l%-aPSc)@FV&-b)Z$LTe%cD$s5t&PAhSB<@-qAVyp!LMVaZ4 z{s@+>VZOk?hvt8vG(m>Ar7dd)(`jKX6X7h1nZB7*V`~vyc*q6{ll*&bJ^~$p16u2E z(Z5wpHAGM3X*kFhZ*+|b`8dO){(gJ2*YxRm>wc)#%xR>CPNvnD{jAlqw^`_Br5U@PB+afM)x$f^lsDew z?6iUWsfW_!m)Z{{981>rG|p&;^Zauz6fGTAtvHqA!ys= zuS(ugDYmFo&`{?vI?A}oG~Ij zN@nsA!mN!!$j^$AOf92{A91Z}{OsV`jGGSd4gp!n3;Br-w|sy7`Yx5L_aTeXVIucE z`swcCFhfBPAMI?vYTVnKVhz?xm}h#mufP{pC0W2!FAQMv@zr010oR0LV@Kmy`rD7Z z07Swmr)`@GljTb7Ewt7dmS$)OQ<2xPio?%LOu}wa+t;C(@?11qpb|L{_dE*E~pF5<-~Zzr^%>o z{Hw}DyTOsceY))-y{y|yZR4YffcnD0{OGwElj&~Ks#6#e&0m==CrU??R!1Y72eh61 zgA;a=hJDdd{*@6yBCaVx5BEpRq&Kvy!AD0E?mej(9I#VPU_H_<@Ymo!8$sBDy@yn@ zAmP`;tp9+0<%+K#B)%J6O{QIH@G@-CTV=Vg&fJ5ZMvBubNAiu#$;>WWw0>BKfp*ZB z+=t@c>yZHm?YYX~clltx;TJWNs)X~8-cguxB6T0I7~fy}m*sT3?=Y}v?3ds~k{uqv zDs%{6LpQ1$uT-O|crRsPevB=!NPW}Rb!G=y`zk%|kOTv>xbF_VN~&kgw_!B~`yFra zlW@$h%Zgb*s>^%=0t!D;Cky3#Dz)ujdtNQ1IC;Idzz-!QXayZJ^BB*#=dFR`r>n+k zC!VSAn__^Dr!a*+=(##_f4XwwOicI z7sePw^{jLN*T@&(ZOJ?Js_jR70zRI|w|d2WbZ=R(5;ixg5ZZ4neZzFI;~xB5mS34x zzxq<|K!vN>sn3=-v^W)n7T)myD%o*dx?}7wXhFVD7@8Ny9|vBU7yQ{GtNqFj8M*UAs7q)mIeCJttVnd}U>^gCi?DD%v60BYijm0I4E(o2JWIzh{C1HH}i%G|IH)^HVn##7c`^ zU`WiGsmF*kO?H>9y{UjOs zZW}apd;pbw7y+$8*|ccImmY6y%Ga+~;CP$P@(1U$0d2{sf~wz$N_}~SxPMhYI;pJYZ{$mDlZ0)IQ8h!mM%B(YnyG|7? z*SfLOFbgkY4)!&=b+Nx;2kh|Q-+HM>teJv&tK&mNbp5sNK&xBDxEg!u;|qbL_*L7B6iPWbu*}A)^7yUH<+rFBxL+PbYpcg)- zeP)_uBaS=a5~BV!Tv-_9QSIs$I1i7S*(c8Y?WpAAny?_z7zf4RV#698vBEY7f;k>l zLEBtmam?us403XPb=JQ>tFF7OYCUYudi0efQypJ8?PKKvlg1tDwz~a(?sL$w7bTQ% zkMQ}8b`U|9e?VlbS4o7_<}!p8SHxrhL*7Xgcbbl#{NBq=htiI;d`pk{RR)Ym{2}}I zTY%=fA;-9M`_XL&jHa5NAh2ZmyjOdRfBk0aq~<>fbRRePp;hb^iGCPkpEDx={g=tB z(+_z|;IIjz)i@s-yDkD^@YtIbF07-4r+`@l<+%DJTpo$@aM$A838cdx?3CH@^x_NJ zkHmxT3e$Ovznn^{;k}+{KxI~qT0BerMSRD%>!G|U`$KeMBYa*kee%pJOBazf_5Gd{ z*q?_@N+<$f(N*mlpJdIggo(|7;-wFItqJKgjd|e*^JE1bZy!RtGa_Nq8dK&e^U@6c zGnUqvjFg7lYVPl-W*`5K$c?{|FZ438j`zygIl=)g=`RLxSXCTapMBDQWJXXv@rrEK z;b!TwzUm6d<*?tfhO;fBbJ_Ka;xUE$(o$v&OR{r}|E${Zm1J%mE?CDD1!$yNl#*Dv z)hVdOFWef%*l;bVtPYs8{`MqDoI9t!V0_Q9tM--x?FJO>N!09o0+j4%A&i?S_JajI z&ANXG9q@na#U5Huu5LQl8K-}aXEnl@1A;pZ-_6e{fwYeQsZKU~FtvveFuLY-WQkf3 zJHC3-kG4|D9x}QB*%JvBCKIX~5y{Q{0h=~V-qN6`rj5$w*A91*Tc&3Pj{b=RS{v?6 z_d_ccbQ$~e^ZWADsTbvLg14SJu zp1Y^?2eb_u+_Y$}+1MJK@*|Gc@n$)%&Y%Uzst%>}m(+RVhh@t)`q8-6rvkm>g%0^> zw9{#ayX|6p9&{Rlr??F3borx^{)AI(XyCB1rdyj7NzxQ0Qne!U|i&agZF z&#fpOzF@aCW-%aDo_>sVoVMypw9A?a4lgb+X@IW>n(vYLnj#s#ZqHg1(%(&@4^osD zPow*>yw8n8c*jYu`cj@>y-`e^{lye+&~;!mBdy5@#AC|YuA3j@{j0L>-XO{l6E)LB zbbE=GE}WLtkP41ON@O&{;<;p9o&@AI-!U(nBoLdzeR=Zb7EaSY&p$pqOudo%-f#J~ z*+7=DEU=AarG|TRw~TrnTBMDNtgMrNP>iXnHRMC0!$2hMiIUWtlV0b^|0X&a@d<*HO%|D4p5L&m#oqAlps?9J|Ma(tZvUggE={F{Ms?gnp2%gQI|3KXy zPW~6uEsCibnA;j;SNWuA$h0&(R9sOI|NV0oh96N)vBkf>cF+`61xR+wX#af8+*G1_ zjTR#7X8*C8js}qdp`+r$RmNll&9cB|*G#Q(j%3e!(LQK+aB!r`hN(EUV?#Ww$Wixq zDV_W+8(KdV7$=s0(d|6ZexFdodZKOxlfL#;R5Z`;WZXd)2}iTh_iXk6`kl0DG1=Q` zGR1tJZkF6|@o>WB!AZoLLJ!O&tbir73DsOE)F3r;9hq1vj?UwlL|U_ zQ-*quEdTC*FJnP8L{jAS#@gx8rv{*d?m=G|QQ7H4-jTuXv9!MDxUkWys+2smdRPcTMoXq3`(5y*T0$*yF3qW$>6E%I!rpV zQnu$*o&`T7^yxw8JbQ}UPd9lT_aORJk;;K9d5oJz=$pxPwx>eLVkOB@L^eO>#ojmF zL8%F>lWgxRsNi>0-yrUarl&3ni7%RP9A@@2NLHqOFJ5SU^u$kDY#MUqiUUDP7^W(j zUZL!uSrl_V^Mq53iVkNggTDEneaXIUq#)N5Y)`m&t;9^=)oTAS_Oktu|HY8g(pk`1 zEGBa*Z8s_r!~aFNHGp_3R5}PE7@A)lI)@Y1o2hYGnqMFW$ch?0dV`g#jhVpB^~$ zNW5t#m(m#s`uxav#-MTN=#Gf~Q?-QsQxv^4``x;i<^=dnBu8ByA2iOQiJv;D9Y|N51dgG?Mx^UDE*a8rL=9 z>v^P^^dC~RG>uLuF+{dNwi*qArp{%$xLFW9o?8--5p;{ndxya-ES1!{k%X}y@br8N(vzFv&usgQyS^MU`##2fYJ*K+V19_9aZR2Q8=JpV2AY9~qg4A>j9jQ{PJLp$Me#kXD{tJLJ=LsD;^SrM;o5;!Nj z8rhvBEKBDFRs{CW|9eDUwYYO-MhsCeaJKEffp~jViur^-M1JnM2{RRSMZ8?QWoAgU1l2 z?rSA=Mztzzs1dKDw#hQzn;i(fnQhEd4jxiXrBg`g{WwmdIQ3;&b@pa*y~)tanm`If zA4LlxAH^_#=Ed%_=lODFH0|-l+F#Ar=ab)*l$t{&hiMMQR(&*k-D<(Tfgoy2@s>wF zt3@8++~lk%i?4sLd0AkB6!#G!Wro8pZ+GRcRMOgN5?E)tAaHtVFWR{Gr4}@{_Q4O- z)orRdTa6_c^B~|^uZQ@Y-zH<<%no{}8PKIygLCaH>kgCco!26ce0hL~>?;jLnBg3g z9JKAJ1#=&EKLDkEjZ$byMiv%)T)8`XKqoOW+icNy=cdFX%s(pzs zVgbGJzhMR-UVV$5_7&)UXd5Gn=D2_M`NfbcCrS*bK-KJbeH78G$K~k^HhgkxehaK zAjjWG@cBLtF($aa0)-A`g?eV^p2weNI+#n7$u z|5I%@whYO+b>F?YW+y@MRr`kTuctzi?WLS_SlsydYte<<60W(%A~=pgSgMp#QNBzL8KCY$b`^xG+_YcYrb~D7&pUo zkK2~WG!0bN7IYn=83>hyCR9J2sJ_x|VZBQGp_rQK16k2PB3z4I{5yimJof3ti!dYd zXj*{mm1^NQ-{zm|8DLNK%bygns7Vr0ZZax${rqBlt zcLihrS=7|vDPrzrnjIfZ?XXvVWMVo1)ATd@*Pv80yKd}h{haAa4(ppNqkO)#M25&G zrQX8SR4|IT-*r~i`{;#D?HBnd%UsA-O(sq(|Ct=U>_Q-~{ex0}kC6RsHKg9|k z=}hV;C^q8Ip-uOD@kQ6eKEQiGHb>{%1a*pdoHM+*-rc2}x9eGJBJ`CdG=cvBS+6io zPVkV(Cx?=(eil(Q5?gw8or&JQ|0(m{>ept)Sm~@duui+DJnboFyO7z`+xS|Jd@LhO zj56o^4*2_TPdtA=t!sCnT@pX%T<~0gFPX`F8X7+Ur96mVh$fO4rog8jR&A}z6c;H3 z#yUg!^H5!~*1wISe#bwKVj>H71-WS@7D7OadBHK6S4trv-uPb{|81`qAJv0#b;fO<^>ymQSk{Tm6Gr5& zb1+nv~wPC*cz6wNZQPnHI^si_7<{oWI-9P9UL0u9qVN9E%9%)Fx1ZXPKCXGwipr1g-y-{ufQ=Yyhu zZyjYwUD>cM*8%st4V4JyQZk&-}Z&}(l)EyN@};dx`1V#dElCZ-diZ@V`cyf*GIHr=Fj}b zRx3dqu$mD_5O8~Ho%%501|+*(^jgs|sc?ehuE3*|;26?%rxgwjqolzWJiF$8%}h+* zS1sV?MZEtT8lXf?Hu+KWxaYEh7rQf~z5Y?wX66wiPYh+{39*di@}T>22bvotSpRmHg}l0hqixnK@p6VfN}l0%~ZK zx4qf7{MIk2T}gX)AkjKu>HHVUY*hZ6OF*h+YmSKjk|?+Z&OvZ&XdT0`ye+6rs6{%I zcplp{(nTcY<0lq(gPoJZ6u+!S`ej7*GeV*Iy}7fljYYK4qAZuLo!bu}=lP@^2~*yK z7oT2#oX}Iy#CrMc-KAi0Znu5yoH}2bU#2>Rn#4L24aO*lK#(|Kq6W0Ui|9C70Qf=w zL{52Ar&V`b=K`^>bXXi?i9DhJTE!;fgpIJvzz|s0#K!O&Gv8QOysvV_MZ*EB-`zwB z57!lI36Ff_sV~Dqm`WVJ4gNWQanBn+Q{ffmcnP$5{Akcqo5efwCcl@+Cwrm(m(hnR zwiU=OI){YzqLYF{;e~z3;y9$!mW?LG&AXytf7#W z<58vY@8hiX0S&XwUw$ZCwK79P%^$X?`3sQ_-|!5v+ovxbOlK(#IdoU&&kF< zR+IqaK3n~CeNtyj(?%CW1Bs`+{K{|xQPqpymHbxo(SG{-0dFM>fHbdizj#)xWcSX^ zPJm7&476CR(Jvh{n@Tyzz2EA{x)L&&Q%-R;ZL*ds#fg|IWEDZzF=L|tc@3C>xmavR z-c0aKS49<3BZjVOSkb3E0;tSlL^s4Jsd_suU0F&7@sD!Pn8|{L;VysMSYMl1-CDf= zvV)@OfGhPidOZ_%SYaUKcwi4r*n8z+cdHI19%6VxU*?Y-A>fn<+^_QehLHQimcV6~ z7=(_AXaD8$W6Fs0*m|l-so{0d0*IR&RNqqdLP1}^o2|3((j)|2Tg(Ra>lwpC?DI^f zj5+ASH=(oewQM%KRUx_OH@Pg!e*x5uVCS-S^(jXUAN%jhlc6&}=@QX`qEI`>>L*@_ zx!oe@+R#NA%r}wolZ^R-uy;AFSrNF4t5l_IFH1@Y^l*_7Y7~JvsMojucFRdsBI|A0 zJG+VkY(#gHv(jh{IHnG?c}1E0vHz3+JNko#=h(h+<2t;2b)~|mFlUUYDt-0u?8%ea zylKR6D>imwIYleM@2k>>6b3OTKHSMY+of!=VZ$ipBiaWiPyI9AI|LvC}tUa%c$_L!6)Y7cSwgQYV1uFI{&Vv^;#@rrcn_tZ;rW1+AL1P8QV{h!}CmeCBGwx_4~l#i}&h%!5NrH z%}3Az_72%aii_6FTk{^(w{EyVo^(o#RS@5%w>=~mXP8j*x`wZrDDBYLc|t(?>(S|d z;&~OT9KS@<``@gGdepn6cS{nh!;{|42b$PMfB04jLCo9E%P51Y2HA`+x?R;-qC1>s zqxT!(bp^{_(MsmT{o~91+J@`+FUP)mAPi{3xF0Py9H#dfl@wj1Ij75s@7U?*KN?q; zGWmTOOco0yBnq*Y2)tvS+gUIJ12dBSzj@^SB7&4JcHCN$um7!wuFFD|X|i zB3zZ$2j>XY(k^9P05uDvcj;ekb@;S8XaD_;4k)05{7r2L_3c;E#9YATY+JG#b$I+29gZV>?B<2?{GopzyPM&TfCqqe9kNSoSvtwv zh_mOQEH@J!>vZYDrk}TS4rDczwO;N0Mct1)AHsub@K2Zobks&wrhK$sUn12?DPxM} z_hxpJO`eO~e7iaNLO_+{DGsn-*TOgtWx!TGm?*{1^C=#3rc!F=-4@EenZDiqI(K_L zXC6kPEFrGQ@4vk-&=C}pMg74_&4*8ouK-7ZE#fLrA_Q+&S<5;??s|z}Iol6u)$9ZJ z{kSTsQt$IH!?+`;bEkU}+YNYof?@Qh*>NR{S%}JF;MuD^x7l&9;l=0opWj`W5q&93 zvA0dyl+Pxj{hS!Oe`(I}@bI`#$=sZJM^XFw$JLzrJ1`3&FKAYs+UPG-6pDc`PNC%c zy@C!b5Sp|apEirBXuJbJdu^uBsaV)H!?esTZilmmA-pYW035wM4IU*PcV6uL9yHxK zs7KhusdP6yZFX$ZwZuq`c*Kr{B~O{I0OqP*oxim9g&+D|ta}3Or&18XJgViH3Dc`4 zZf}(H14EBsIo(8yb;}*ul&HR}r!C^$vnt}a;MDG@mnMFPXGzm_uZ=L9aJS!IA6v5r z$((0znlGG=T2tojwj|i`^Uft|qtD^@CF=a~v=?y=h+)2yN7DFF^xZ+U z@7u!1!JkBRSxnWA3KV!_e)&4W`b14Kq`QaYq%gAJy`W2e2xN!g%}j`9Pq^ADE06b#76+ z>Nm+=;|$CbkGX)*Yl+1Ne|C;k-WZK(eU?jW=tvF_8m-^=7(@rv|LR-RzajRnvac~* zSuyY@POB4Y|8Q~R%a*Z7(F(>HXw2516BgDP*);vgaBIcS9N>yR+KIyQB zAKs#AR*S1Ck<%}=S1-Js{?qj=)OYzZT)Rrs%v)4bVif+}9~GR|1_SHoMI0~a)5^+b zO#4=zbo#^l+-L~vt_`mk{-}h23sM$e8-M-&H?r9I3sbr07v0PZ;I7(N=)K{K(BaJX zLSl>H)-N&Gev4%M%QUDxRn>XYVBPRQpv*1V+?#nhLD|?v#Y}N?Q&+*U`kz96k~+U| zGs-|o)Bru)pH9wM+~ag$U&#IY_CbD`Lx3?D#risY?nXYYs8SMb77m0_wH7-o&g6)0 zGMxkN9uN)Q<)Rg65;*IXORTkFOAUbckN>s?j;iN|t_tIB-Ssb{h}<77i^dCLoc03z_OjZXq{NrMXrbEWtMn{~q&gLvefQ^}8_YCf}-Vsljrm zXittu-Q&!^OQhzX&W)A~R|P8An4aw1q+0y|c!+qrdZebZSTuUm<%a8* z9v5SqtBQy?vCOKTgmCzS&x5h5>_hPQPG&; zJ=8NC_El5JbfoUxw1f%2Lg=qaZdDhjR8|3}RFJJyB-^uXO1%~LQq*;C6AL__Pp}qa z<%ny+Ye%e22zOE9p?%;#FSCBPf3JN6nmxusXF{`>o65z)Zcxn&S}fVfawi8PJ`*yT z&7Aq5pJ!i;K9LLV1os7K$)1!^vThta!c*cER~!7dS3QO5f}u+@hS|WJic#$A!1`6tKmqy=`>WXuXCV=wHWxn zk&pdWt^V;rxew4x-pZM(t3KMw)jD#ifY<*Ny9)(;_gG*I4Cq-dTEz`L4{irTcU8aU zU3vX+^3S8FJfGGem70&puq9t%+V*QO$>&Sys|JJVg$ZIz&&{H>nuH}+)T1AKw^^iV zH@Hs{p?3S*<_qUi2q%YYO(qB>Qrfb9cM1*Jr1Hde`6 zd^)HdTmTzV>s!^ygpuF4wdE@{3OHfGRfcI&y#xOM!^{VPo&4RJ0N*_`H@^ks&@3oQ z4pw<5{Mg4P(SMU-j)~*eqi8l~Uy3*&@t%!W5S0n5z3HM6=9x1fcUQXTI;?m-IQ%C} zMvgmQ=+}rpNUD;VXQ5&R%;pUdHrk3q;#f0zU=kuP)a7=>Ti z;y_xtlS(I`{Ua=FBb8-JK^weD;Eu;(jXS6BfC6lS%VD)`T8#`(K5MdjzSo zA3`OqJZ7A|2XMF359Z$k_SKX(ii}Ze^Y<`Hs3V+t;zniJ3v(OEllx|QRv=8q6Lj$L zgwZ=2fYNt9K+|D!#*v7Blz(^L!17dL2-?0IM zH!#b9seHpmaE$vcDI&xpP9?&S)MlGeUy@tm*rOS!$xri=+Q;&V6d;hZ7~WT^7PMQ- z|C}N2YAwxS9KJ^OnjOPbmrZu z4E8_uPugN}EZOJZoa`f?w)8*BGQ%5o=c%Kmm<2_>!ZCdnIE=_3hMZN=3Ho0FBQI$N$c+f#TkcW(X(fwFInt=49+GR z{e*KKp~z1oPeYRc1yW`fYMkaJ6t9dO8=jK@BxxWi_@OZL1=hC zdR3(EUl_UP((0%O>&D?y+=ncrXQ}9th9V7qC<)vDyW(@ennxD`xR27VBk?br0tYZo zMu3|g8QWG{YIb|**13c{tGOU#bG{cunn}w41y|sTHLoF&c~(lS`)>Oyju{nB2R6ky8_1|#B#z{mlfBt3X^M-#S*~Nc zz@6~BIsVg5W!QeZfYOE%!E=ieS1U92TV*WMb5!9vum(;`&C)qchO~j1AS0B*v)Bt# z``}{J`jbM`QS_*3GTWDI_g)Qq?|p?~C~B_Jjp|-RGvI%IGoy>{`u80yHYl@I-PoY5k#f z1`ZcepU|UO@TX^^BO_FSsP3Py^@1OUxEfK!WiHQYx%aG8uz!9(XX%z;rs9R5Y6DJl z*~93OYTh5^2IcE;+DEfi7NJG{FF}T8W?1b%_AVsaI{BD4Gb0Hc1Ct*|QU&X#%h*p}~2pnw; zi8EX1+tv+eA`8(12+NOsbSW~u!aeklpdqT)qV+L2y7aP>>$mM;bl@_CeF6&I=^v~` z+gC)jm4$t|+_nSM7i64e;hbl6(-@4q{i&rERE$=Me1)noqwHa80n01WY_`sj%mG6C zDJ0nD+-ly~a1{`gtIyH-D>Px2&Gq3~QCF`nQcw?%a8)_A`KhL{`!tkoU{P?Zs@}XMmI{Geudz^XM8TXTxjPpA6a3hoE7y&Q=IF{d-I@4 zcVVWMVBz}hw~1Sov}}>k#ZT(&p3n;jTjR}?qpCo1=LCOEPUm%vK9;oR;oTO4wuDII z0-cN#hNvjJ9juGV#3+>zPOUOSY0PR-QJY{T&E!?Rf}K(;c>FusQThO^QHq-jYKMUx zV}%njR0Fem&ZB|lmgU0sxzhai9NyPM;VYlFwrmipLq_5iviWi^vxb%DR~Wb@o8Ty3 z<-f@(dp{^yXyc{w_U82u%PTnqT*KEt=HnVVH|qx<{sD(e#;q^c%LGR>f5qHieP1^o zI=%4cfiTH$%h$8~E?NClc&w>o$mdeelb|6Dc79a!9Qsgj#Wq1$3&4{D zf&!f@-@+0~E89EN@$;=TS+tRx{8zz-n&a9TLX}t)%>3bPY!S1*LobidkD!ME$xAXY z=o>5?VziQgNnyK5^oB%(2u*F;C(UfI?tu+Q0xn~mtXz*q=KvuOI=C1a`3g+V^eKRh zoyOwmO0sw7zMV42|E#jFg{pdc&T;CQ5#u@3C0OWnVo!)L(qii5@!4R0cYU0uQX}p= z?xXi-Yh6o<@A7c0q|NRxd{gH|56IsnBQrSEKQcOynd95`R$T>jf7FZmn)<7q zs*Ia2!cwCTZybA#d=l2ea-ywazAkTZi%O(21iJvaV`LtfZ{S`aF4aEW%KSq+m3{T= zAB(3)*W^Uoe^BSYIX~#FS9)nRoTbyH3uhVxwli!ev_GhO$_891=ZK=*NnHuP>I5rp z@0({t#sjTDIsggKc32r^>e`ZtH!iP#9b*=S<Z>%ftxk+2d=zGvk8Tm zg;k|w=^zxsaA|8(46yCp7597Nhw+W{_@Ci&wqi;u-U%_|6uzaQxF^{wbp{t8;n*ZT zIWO4JfF3KK<)FBxhrdT|^Nam_?tWS>fNDEUP3Vt}a4K9PXxqj9=BMQR2t~gB1xNV&-Hp275{ea_;>ZqGcq}*eEI`O%-A9$e6u!+#)`@9 zjYhKeD|J~R*5kord0M8>g#MLp+DMBvfk3Htm8%*wsvD_tZO9q_#L4D(OJ|vn2ULxy zuT>By5pg$TlVDvhwEGZ}CZb^9Bke!3S__qiZ_1hElwEzu{VrKf$kwS6vOJSWp=pyE zwN781Q?C~{i47`L^WYyr>7}hd)fnyT9G%JpAC$d*v&eXW_jb6NjTkC-ZS4W~^*h=; zB9J7l@-4-zVE`%bCrqj;jNA)}EYyF6aNB1OxQTU73{#KuKli zpvA3j+*U2(n%@X@U&~+iaQwYCYP)pI%5QFZ#z9r|HlA{Nncr6pgf=G4zsr|n*kXGD z+v;WjK^rW!+imnWh8n=no?|@-DeLRttqOO{Gnd7WLth zya1!Oe`)(u4bC$*;djdMt2F`I)v?Ol@Q*8f6sNal(pSWQUwH>_EZHxK+nj!*iZO1M zkR%{0xWA*<5uwXf7B0PCmdyva53zwzQ)}!GYG^~_my;%wXkne}G6d;EKSROa6mnLf zW?BNH6MN%^VC-jUwZs11FnJm{?5K1qCCFP7u4mnXQIz#U%pO9LSiF;;c{dYa^%Lny zl(e01CsKbQs}$$C_#qGXuh#w&di>45G+PwiL%%PXTypO&?2#_zsH~qoytz6G*gVL} z4ng7K#mNiyettH^ylb!(rDAzvLS4*~{Hp5$-^AI{=J5Z+*PD1Hy+{4O7^TN!$|=uD zbHbCAO-`924xmkzr8b<>av-BJ=K&{_L9;TC1DchZD4LZGDw-n>U|FC!4~aP!2r8Nb zpojvO^E|(`?!9Z>b^id?+8aK6zWclPd%s^wEgW%9YvYOI&7sbHsIe9I*_0<)9O}83 z)I4WCCXq0|mKFG$Z>{p>>8*Mb0- z{}XsyACt;Ryx0to9@``nBt6hzyO}BV)CAjH8!r2QL-tTo#UnF@Jv-Ry^aONss^5^} zrRV41KQQ-kGvQsS+s+6|C4WLc-CEUEzkmPF8KCk(O;!ilgL13{^u!+4vP~t;CIMl+ zu2OT>=ku@oGmD`~qk~`i^I(En|1k$()6A4%&nN+QM{cl6?PYnS4W0`sWX^dyZG*~= zOaoIJ5z+GMMt5m1YGR~6Ng6T{mGq8eGR{e#cm`SQft5R&*6e&Ek*mxgO+ul}7Bf3Q zLX@J6PT$}K1ykKgD}Iu^kkN=P4YhdHM4ePb^zeJ$@u5n~m;4u?aNVV%E19aaTCTX2 zE3Ko={nBZ=@ae4QbZ}dZlP-2tXXZ6#e6q4D?Y6DOfTpj@re@$s zd|*otM=K}gHR(UtMro_&OWZv(%awc8*A81lOKl>RBSljILE^u6cYMsDZwsUMo1}A8 zW?Jn_TS_FfDdSWuw7wT&NYhdb&jGm?2dPEaO;&T#gMRt2-WJUTvpSQ($i1ud39%&d z9T^SZB}uv}UQ(Z2b0>L_>lRD8C*QmWl`0n^L8g{TQFLaHlwmn3!*+{i2;DhXE;aIA zt5tY&PHw?!dKmJ7V!0@JZ7hkEAt`?$=qbUe?c4%}_S9n;#t_&o2~QT~aM zq7svn@n8#d;XfnAcZhtw>QRHaw+3zMlW5GEHUb0Cc<5HEu^*@V4IgPXF8wRNF&4RP zz_qk{XzVLG$Z5V@d8aN)u+_)eMbdw;)p262=*Q!$v>I?VuQdtO#Jlgkk@Lje>J3w8 z*8xb6*F%z78muP*7J}h?uvq?nj(Z>T$-KbYc6Ms=unlsrs@g}*BP#?H5<{nXn+1Lt zcTNIh-qH%oXzeDdC9;m&K?MV+Zj|r93XVmDvRymH3X{|$+{jsjNZ4iNe zh3Fq;Kz&&i1Jy-6HN17tM8AT;{cc14+iP`30di+kgqCe-Cf8NmKf@~ard7+kXqBx! z>kkFYPdBgRvz2DzF(X`P0#XFnsoNzi-7E{y5h}<>K_VNsLOY5AQY-3)?(l5u4`RmH zzP@gE;|P`1F-}Ra@y_*PO9^ggz+2a8J-mdV_NJsLk8jqcJZ!>hCaYM$4 z^q@l8st?&`Er|P9RE#^=Uw`P1EfzD#a~mt}vXv*WD0R$szhbzqV69JD?R-o4KjEKr zoU{taM0Wc&qvFDW^kefa))fOutu zIk@7FFYAaOy8W{q@7#IzsyapvE-&WsQ%M_ZJwvfgb>Di%&ky~48WI;IYx*ZZDGiDU7yM8$ zjsam?J2X%>;?KxAw-$tGko!=+a54Sk5i9-O>bD*&rQpkE0xO+ta}T4Id0I8J&uRx+ zZw0$H_G*s*`Itt-b6+4jdcDzT&LpvJ*hk_sxgWj%sAw+Fcy}#rL$Nh+;)5`h-dKLu zOma(5g+#R+Gj6|mq~a1B!&leOLL)XEBIF0N=IVXCcT$K5%xUWJjS|PX#B)O$JE4fZ|E+uZ;*gj zr**iHAR#SEeS@C$7|}z27tim0Nu<*IIzb_Hh0Oq?=SI910`#U5d{jy@J^(nnF~rdf z4rs%Pm3e@0g;+%sfZK z1RKTgZP}|xu|mxxo(GHfpg)kHZE61)YV&Q7>8o<-Ek^gVT($&TH*zL$Wm{l*8NM-2#$PS-CLTmH_oCs+8 z{-_{JV=tiwH6LOrNqft!q5pzRzb2SOucsQWeYVh5Vm*G(^eC{nleS_DoZ}hnUf6cs zL##p(hIw&%m2zPM6(igKGAg~2?|FuI93QksoBCOSZ)u|W+;!tnUdo9xy_Zw^W2bXB z-XwZ7H`p5QHg{ZkNu#3DuP6QG>8;ON1QSXhm_5Y*c))Dj6i}+vv zu(*`@VfUAXByLI6?SgY73bkwplO&6MJ!6i#V{_kjs~o+P&OZD9_{MKw9u&0vyrh$I zPyNz|?ZYD3>_XUMX7yQ>trZ8n$$0!A!=4cU@84 zRcNN%>MxeT%zh1?j@j{u&HUCPW@k-$F5Noes#n+z(^(&=jNKPDGT3pd6jiY+s9Y%r z3~Et%j4d?6|9j^M7`dUp-X4U|o2TfVnX9-H|5-^lDgnk=8K}6e8~T;3JCj|ryoG*B zU&9x@oT4WnMU@DDSz8&}M6UvxS}<%#EpviUX0mx>{id^v_po(|=LLxv+O^^-B$( z!P2B(9Xl!R*4OnVdx@?(9xlC_;v+dx&u#zP#BLIpm&8U`GQ_#P$4mU3fBXb8va zb80kQqVt_FYCUBDDqPe&Xd;o{P7Qa{g+&CCrGty{7M@A6W8UVcNCm$W)(^FfH)goD zV&J~9|Dq=^N+#vxt(7pd?VBn$>jQtj-kchlpKxY7H{uF)v0p7$(@vF4Xua{hvOR~u zZE@Kg3z@ccOa_0L3*u@bM-R0)80=>`$c(#`huaRbPh~R>QSKhszVQ3cumy6l-4Jx{ zaJD@9;oSjB=~dp$bGN$0KapUYmZaA~Unhf5-mH&*0;3ym+?GM)xL!IV$sVxDKJ|5! zRYIIAOHo|uwru#~_H`?fsk$yT5hyv;qk`Ih3~0+57u4xwc>kB1_>kb zYF74KNBQ^n4CW}=QA>fu+Eep0zQKI-B{`p^8Ww-6$vBWy*gcN=EA%5{vw1Y0q>&&JYBWhN z>+)E`DaVnO=BKTr0j^(5RcG_^S_*XZQi$1UX7XxX#LL3IL~d}7zbj4l+AH&s#wYBy?uc@2XA*o-OaH4(UKPLSeZRfJolfAHF^h9sn)y@1Y zZWg-NmuQ51$^k63DGwU-eN@Ou{lQ3t?Pz~BugTLwzI(Pjd=2P6d|kEsBXQ_gn8Jw8 zVF!6G9mF#$zheP7r@R{FjorwF<1Sq8@|JExx%&uVr*>KlBV6l!H?;+Rd+1>kM>5Gh z*Hmd4gqk6{u4bk$pTp<2?;S2On8veEuySh@FzJ3d22pd^*(X8N;S*6)&pMU6OicCO-mS4B z=WmWI-G^hfidTLZJ`*2ie?5Vz{)vPIRy=#Zp71k>IJCD(dnU#ICXAL^OmI#%>9Pp* zMCr0@&)%<0*6C2{RA4{T@bDH;aJxyD^mtpvzLVEew~2EY(4`{Odg{Ql8-eG%Be!U) z=0g*-EtyX#{467?XKz>~)1*n96zYJl{KegWsheHEG+oP_MDN*nu(pzN=Ea6E#RcF< zGbM7kwlkMa9-l6in*zbE0?w8AHncs?WVbqd(gu6hL!b zVWqaGUN#er1d^oO?sKWa;^Gjg9(+O0K(kJeey`hwOn`A5env~?Wq#NVy;<%X=(VJ8 z8~As?by|s!InzQev(U{LypwfV8*@ghlHQRv$OyB{utYyr z{|@aO<%9u$;k(1u@KSxGGvF;P@{Pvqf3ZTBfTE+8-ebcX;6_u+OxCtZD{lbs<4$wM zx9Y=ZFg@eHsx)n`q3zRW`EfyXOTn4__r34{lKKhI(q&gTL+-RV|D-Wg89wZ(5u5fN zKdEmax84~@GIz1VUR0+pg_<28TYNk>XsGS0LuFScg> zjb*peb2wFr=zG6m1KNeG`cDbiNk|BE9w*{hP!}Au-H^zQBy~}1fLvD-dp{By64{~| zpU&aX?*O54OS1zC0bAQj2vKmv-$@m}rqM=BGe_rd?lleqnbH{LZ&LRBYO$JuWmh$}Pc&8F4`M=@UiP>S*?{06!26lVs znkp6+d&xHNA6zG8%1Y0>gU0#j+qx)sCHrnkII$mxfQY^7{9$dsAYDoO37#$3AmH$9 z+*mvgGB5Sj9gV$OzT8at9whqv8iIFwJJG-%G?sO&J3xzDF4s7X$VU2FpVs(#Yf+bS zRA$~2q(cv6hY%T?Ej13WCq#q$9{YZi8p5#bJW`{Ry=nmV^wK+&iO1Hd8-UMFZ8d!{ zIy#fNbv?ykTjF}x;*fb%C4Xy12&N3)m~Du}@Tx=pInpyeUDD_w{aQA+yU`cNvytp> z-1v2^XYLdOAzS)(n4QSm;c8V_P`M$uldcu@^2f$iA!8NPI}f<(_~=em`2r@vCLy|s zmp-kuwnmK`T6$v$w!(0=CFmB6SLfBb;n@0@-nur6Hz@?t81v4e-5m52ddk1q#SYmnV-s-i=%1H9 zKT{pS)HP4nUKxm{E-#4B@2MO_8YiS%1^i`eBeHW9{Ro|_Tr>=)6TEm@si33C%CUw(zM$pjn+&gUxIEv!ND$Ebn9oipowjfn$ zX0}5qoESCbuAMX54}KHUywA?Wf9&E?unsRFA99sh%xeI%f*1K=W0Kd`ZPs3r3`|4~ zc*1NGRo}&S&}b>w-($$v<$2`2?ty*FBX>vQ!*(C$;BWi8K#w}EP8*Oz=EX0`lm*~I zt^w@~1+i5q!Wg`ODovQOx6QB}2__f1QHGB-W-AMKXSdnzKH)s5va2#PMKAia6u;UH zoO=AiX>_0Ic5~ANqSs%*d-vY&IRHJkb1QI*bbqhK{Gp5ESMDizomK4hQf@f($f^Iz zKSTE)?cR6b4E^Mjy{6{p<7oxfk}+5vSNqFfUXg3J|GgafDbD3e^yDZ4zt;GT3JTrg z{WF1EN;|0h`Ff^Yi(98Pq!1p2)&o!uAmVj(S;;pAz+6KHP#~DDiefb9*W*f^@x2?X ze88N;&_J~FPcefGcdOLSV=~sQUYq^m-{o=hE0=`ejBL+6qaQ0Qcc3)Mr(pV^ekiX* zRg=jWX}gGQMD5DCoK7@Yn>JWH$&}3`M`vrtbn~+0THFToBibqtpL0%@9J9frd1NP3 zVTy^$Ny*FFkMYtEO*XGAN%C#^>M`Krq^DD!vhiXZ)4}lxvpG`sVO7kl^*Z;aQt~^6>VsVv zS$sm4`j&AuD%X~~c|qg#o}okAGJqK2^N{RC%)+Pejxu^zRG|Ntl&j_aKNSs ze$_juQ?4l-3@CdaQhRHCgXvNRiH?41Gzl-mUK4y_^!Udqu^jc7>C3NW*7;wKT)ygA z+S$065IbPiI2QGNEK}Ee(+kK{EL>~qb89@xdq_>K86c`#@7)w1LKn5MFrVHlIdOkq z>O#hoD$i)S?)*tFCsiT$&fuS(=$4+kU%e^l0v!+MJm2G}UF#mx3k|_4U~xg)X_c(D zF-k3N;WxANO6ZEUft}^hhtTq=zGn+*gp!civkhZEdbz(Q%tz9cXiokRf|v6OhrgG3 z^yixkCCy)=`2ZM{<^1`2L&iI9Q)@OaB7d|Zs=rhb_p2mxGiGY z?3qZ#Jz{M0N7Cnq6W8N$M38))c<`SYKOLor7PJC#0g0T~nvp~1kQQu(YY@Th()`t4 zvaE9lL`@ohpL%DJEkZj{Z52gD2D{F7kj;LmGl!P6fFikXv`or_``b&yn0V2FWF_=M z27NZMlb0$OcJDYz`Cv59E=SL8_{}UQ(73xO@+LN)d!3K&x9Vl)bnaL`?CM6ayqO@c zzO~;B1l#t*OtblIX2%xjzq8EUPIt=#ndo-VUFQpXhHHw8>UI@^t>=wiSEbqS%s;yF z38^Hmke|@`2BxWN)pdn$&m@`0R)@VJ)2?*Ds~Ew}xj+2&c#es5C^DbvVn+V(>gp-3 zck4WZ=iQvQP;vWxmfShvt6`6Yo9Fn7g8yG;%l*=K+1f{fw@{Y-<5Za%m>61kclPs; zytuW&J#)||47(mw*PNJ;awY(E9zA?G*DiAsKipS_8%ii4b{1gczZ>S5eCM=-J(lf) z#|^6upJ<2FUAq>L&v>d`PA%_>K0WHOUU-!$sagy{98i6e8M%?|&*H2H+A){nq0bq>*!+d1obqTZU(|YJ3&Dg3|7q^#UOU~bgk1m2?G1$H z_SCR+?Q;~eW1!grENKhB()>4vlaXh~8R0aJbyh--Fc;=!qVuE0-!ZafYSxJA`<6+~ zTd>TJ26YAh;4q);%6d|AHJ&;Du`$Zq^`yN6{-U(<%gdFS{AYo#%K4C}pQln8=-$fL zZQB{wK#RTEI8N17&danMt8U4chu}1`es?*K@42?}Qf0DL`VIp7ORk31M^z1blO=;w zW5dFbBR<*)LzK#dyTH&J7jJws$JbWbXFks-G_FbyFWg>{(9}&?ynfAX>4;cdLUz^b zXdecbk7Q9B9&$9l49S+(M)tbEZY~2U-aZJA@@=|NKWDQ>^WLs1UV0_XL=m+sIIWw< z?KHdgS=76iScTk71^4qcZXi>g_2ToxR)MMRC+O9y0`j#j>s>pPA&*4v>e6A=rNfP# zU+^!&2Ju7w#rqdN?hXyS>_?Q zU2OJA-lF4V(B!N3K2aGG0>hc5fLqvV;gF6>{``E{s`~4(W($YvyF|D(g(td80hR6R%2F@Q|_DxTt z&CMX&j=+Zo`+B$~gMSc_IWScZ|SYSh)Ls?p_}^X-3I!Cc4j{_9ek#Q+A|Bc!43 zJpKvfvUmLQp6&P#Ua%pgJ+pW7Yy^%$1n5F^m(hv-{x;50!o)`}A2oOe?8I(2$HMZifgY z68UA63TknjIE9c&w9VSk3vw$Owe?Jnr$7h}6H^MHt{jc<8&ww#VIxP$y>2wyS~P4& z2X~8y(X5u`)w94Qz~(mv;djDAFe4TGYjBnYbpX!vg>Cj_YX5=My^)ir8BeMp4}xxd!ULEIKC|?Y*TWjqOX08uQ;e1}c%Rc12-7K(vizJ;^et zTHdbwJkYy-v%h!1Qr9nY{z{f~;jMXX4`btT!GW^FxWO3`|G^Mv|nLmzyx6gA2{{2i5J@mF_tWW}zzm&?3q z=i1SxSwPft6ML}%*%li$YLi3LqW)4@s}o;~#@Ov%J`o(+CRj-!k0X9Hq8)PM787r0 zMH_hquR9Py;@gEi429X0d)9>@`)o?ZZFVIV{o$nPsWcxL^-O@nJ7j74CWXGg z5w{^cNR2!aQdKuBCGPkhtoI82P&#-&{rY`eb5rYonH8?|4ji4Xy|;3k|VrLT%UPr zctbqZ!y6REg~eZDZ0q>`0oNnX2(7hPDqqDaCZX@sJ-w@%-WN^s!zg z-_(yMZL8sPVlvajRUwZWC)$a(8zU!TZ;l8j!?qA~EjM>XO8AKx*7Re6pF6VAvn+D( z4<0<-C%rw2f1t};07=5w!=GCu9;w`IqGKR@;P$J?q)RveXN-hU9^#LL%X)qVo^H#( z?=VBZXX6Lnp7QnoRo{KkX)85=8&;U5E}vL={fX=$`Sx3{Nso4Z>~oyFGR4+kn?9&# zNiR>p0qklnsfhmuwKWu(AQz5t?;A7AKu2XyQaS@(=^f}x@q6!jXl?vY!>krnjS%a* z67U6qC)6<1uJmFr*WFG4y1=l_U(4ta9*z1}+RM68Zj8)<2``%~+cuM=)@U2HiJM&S?RfyRq%XZupOM)x z@mG#XPBLk(koE0*H)n(nbRigmZt__Tu)v`%?_QrAPP3wRJ5LeP-S-;N=rdUXfbt}Z z-^KV%;i8yv*&%|imPtVciL{VJDz>2a6iFzsKDiivAvJ~f4*ZnH5bCX>tY<;n#)kjZz&av!PU zx?L?f!?qz2bADn4=9U>GSexaZ2vaO98G;MMOeV4|hePb0ZV)=ap2*SlRpc!|qcvsI zg!bz9ZjO^-Lk7!^hVvlg(T7k?prqHV(pHhGJPfF*JM|tCkAds=((mm|(Y10Fq?@z9 zFcdSOzN_kb?l<)G3H*&n<3pH)av@=rAj#Q zVhMDsPIuq+&W|xKJO>@Ow^N=q&Xnnw0|F=nL zqtvn1^Qo)jb%wKM+!&r3?!JqJG&JRXPN!IE*?^H&sFwf*Wk%e6;#q;NUMEK1I>?*Kh)V z(6u>31DuBpIssQGiQ)s$L{Kf9xgitHANs9rYu8(YB8Qvs(G2l`peyRRWyY(f^dM-` zn5bVz8~7%VYBnb{Hy(|TDoj%()%1nC2+$wbCV3Xlg#5-(W^e2lQ;lVPGN@luOb-R* z8+3^UeW1MM)f$BW;7a|S+^kA|u}PD?{SqVPMTQA8F};$1%J+n8)g6AGqjrC#q|=~U zIgqWiWaXwMFBFJ^rxex6m>ip_Q{`BhC%}VY8S+=kgW>i9(#8E z&0+s}LRJ_6&iqvKset)!O%*BVjHD}aZc_a-zENJX@=Ly){zOdS)`GkI9G-W+awi#537F=Qejm z1niz6Z`*mSVBegrJGY#~^s|Cj$U8TT>r;yudsdnJX_`HYwlPSW52WM(;u2TBEsD7(s^N{8=;4)<6>`}zdJk*C=a(uxGa zC2vM8@kB5tU!_ZPYAo#{nG{x6q9vau;eC`#*sq#y4b3DzCuxb};kPC^Ln< zlnaG+8$gw#Vd*rebygnu9ipPnerShae`G1bvJyZ6V!R z=dm_rsxXZi;$m9**GVHgM^Y7h@*(yHc1Yy|SqhLJOXTNXn9gAo3GzqqC8>Z(VJ7x^n^!0Z~xTksHpX#%-Hr>2e1^Y`LE8f&0Uz2aStq}KbiM5)y>5c@1 z4+dTV5ty>QM|7hb^F12JI1UX_e>2El_3c?ZpupDa2{mmb6sL&-D(#7NSp5c` zLKf3uuiuybI{_0ADvz%H5G^*z+!&dQF*=ZW748-Rf0LL;VcT;sP7!$LMVZPKgXNPB zd)t#|5+O|sQ<-XQMY`29t*1qey|3H-R=JX{$w}P) zhheyjA2J!S^Q;iut2V5|gr`l#u83jH(VjMIs19o47JhxYHn>pE;ku334t0k}!gcyB zy3nb>X88l8Qgs*Om~>}OWo@r8V4n%&i>G+Y=Fcy0X|PULI9Qv0EZzn2JQkT>m2tu* zBa!p`_rO|Z;jG^-);fPq*yCu^@D>^}*OI>Vv#tF8!q%2M@gE>cb%hn(n1Xs#NE9lE zpvBH&fhf{|61(pwQqnn?5e=VcTe=UQIr{PYo!+0DDo*13IAJn0?Shb#t^=AD6NC}- znClp(rj6rA#Gu7Kn748RdT6NS!ux z=SR@fR9OWNK2gP17kv?eaj9Ld;AUy6A0VH4Oh~5_HJZ!y%Y9-tEdCOW?t0ZzW4pO1 zv#X=bUj|_c)&PELn3>CoQBdjg37LjmW&?E_GuzYK_XRLhwRJOdD*|;7PCbJ>*mCb% zo-5eUUk@6OgMu?uf(`w)BTZt_2~il0S8nf4sG)$ulz$_QR};*tf7mVz5J9M^2ljc; zcqD6<swa>c>~?OyMtNyu9SYQ&h`RT>PibDvJ9`X-J@x* zz8cg$_mu2sqXQ}lE30f?-Ps@%9RKMYpsB~@Y-`V^v ztvY9>Vz&sc-J2(v^bfz``!q-|M*2xCDjNy6VD-{QCjMMz{faYMarL!prBh({7ueE< zJ^Eip*YyJ5jrWWZ-}6DDt~@yTyg&Z_UpUU)8M;@@(x;2a>Cbi>Z5ONVyGj_B?T0={ zBDsb8_aX%!)tAxOZy=-qc%ob91b$CrKugRI9xc*wb%1_DIi>o&`Hsdup z$p8I?Op~~$IUV=|{ee$GcNq}egT;~6|K#$fa=HAQ|CP&YcmF5y4=va{I3dfNV;6*y zeSi;D&V$+Nzk^pdn^z3shiw+tiL2AyYf?+VOo;z z@jK&?_nqZwBk?tqocWTmRV~~P)Se9It4&%ndE|eEH(;d)Z5~xH z&5%+1&_kAa&%k)@i$2@l%HYoEB#rr_@4zjyDUTv|WV@=3ULoaPE{6sLQ-mdJ*?%$f z{waqcT{>j-cF+7ben--zDQkqE_NC}j8=|&O)A{wE-ZUc~^_IMq>C5jJG5Oi3$YAd0 z8tNT9N=DBZpb))GS3S&KeO?owZx*Q?KA<5;uAEh2Um_Etu(@QMeJ+1DIoPVZ4MqWh z_)lp5je`la z8YIbiL@syXfoMdHys^}$n3_`-sXS|hxHBIOh%j9`jiiOW*1X<$cCp}-8vkf_)3ByN za-ZX|xTj-mkT7dbNH7vzb4!mF6$O-CxyE|~ak9O3C7Yk(Q}$_{ADcKH>xT|{BB9!-f{)-RNnF9uSk1E~Mjclzj%Fz@!{lJnq~8MA zN^A?`Te5;PUUmpP{~2oL+$3-7NenH@9*(@L0}Pnuua4z1V_sS!6Dmb&LXc2`$b)y* zSYq~At$l604%S!g%sK_i#L1gYvun7);IaB#xfHe~>l3yXQU)NT7l(=tD7D* z9{qK2xGF~%QrZ#QF8g&k-RRsEFtsPcB!;v9-GT*XYR9xQL+2_ks@=6?|7h@p%M0LY ztaFOp`ni&4C|8*$YjpNh<1;tgxJ9~>XCh{aiW`sah^FCuSQEj7{IACHaS;Z-oMzrJ z4R0t7t70zw(w@KIvfl4EjZJ#p{Lp060m`-uIk-{X{Ls}ndK~ANzu2{)xcZmPyqzUt zC=FfDG@aT|`AD^)Q$M#f%&P=U%-aog1Z8&~b|YFh&Y~~HEGt)iW#LUvU_Nz-^x-&7X}K(WVlt-dR9C6p1=l0aV38LCV+N4hC}(u29O0X-Zq3%X z%ZR@C|8a#FaazfhoEmND|E>ywP3ki*=bO~)GiD4Ryt~e4P}4dTZ$WvS9VH!pzntakxS245NSk=^HdBsKEu{x>7?t?@>{oOc-qm zy4A6b!sC}fIQ?@1`foSm!#d9yKVKH-;$PrS=&EsTK3vf(RznaTcsgZBrY)lWK|P4Y zByEaveP4`-F%nNJy|EjOyXdA;9!+W(t2OAU%|2QH!+n;o!L^&su~)@6Qa^*(F<6CI zUMF&1@U6};UKo*Hvig){8|1s=)>t)rtXkfoXJSOx1}gMS-!-$4=S#^csbOJ=up1Je zl+)WUdE1kS-(S;oh7*KxoTzW|gr>vxwy^NNR3>5hh4|C+1Rd73!=YQO+@Ex>elzH+ zl8<><)WwS8QEzGwww<3>uyZQF(2d)Z)BJG#CL8~Ku`o)#P4DAUI8f*!zv>o~gF+Ay zyb#e~RIy;lO}Bq_Nv$sabY&sFEyOYrMLigVq{r0XFMYRGl| zf=PdjgQHS6TvWcoQ{g^~!%+$sE`7p%S=zGKY;az)5SZ@Z4d090%*Zu?%!{vsS~y=$ zBF1}@G_Gx2+sO#K9Z0O43r~qmPWkt=?S(DErQv8@wqpoQ8W0t-Wwd5Mz|tUJ%A>7L zTlHZo4M>}96{mEN*UL?q9NX&eZYB^_yUH_?-8M>lr7MRk70^PKl^RN6lD+=)4s~7o z#kaxc7WII%@ICEM8Fb}{&9AkG0!YI7oZWY-(SWEnOT}?IZIJZ86yYqsyjx6g2k&a{iH1W2?xKE4FK^L-CF zeNo9h>dW+q^O!nm8odPC$FJ8 z+NaHIOe|uZenYJCm@qNtQFJV!~_}G6oWQbd!#U;$;dMh9@WDy4}k6dGjFrVnWQ2YR^pTA z0lBEh@);4P*N*{bp5Vt!B@viz{P(hO&&IyDY1$`cTXx-mM3;BLYIisWh2PP=QUm9_ z2{@mEpqMMoeahBCubAo`hS*pK5)&Lcnse=%7f4tt?fwXNKGh3^tOf}t+WI~nXxD4Y2lC&Ts zHF<;YEyH$+SE}EUxG&0OQmr;*BnRLW(Y>wEuzPb=Hvpn{{+3c3(Hy>`vn45JF2m-3 zv*;NXA~IQlGo>mwqQ{uK0-Pod??DT~h7_!HE@wwcDm_S+5rPC5AP=X{EHzpy^Uy`c z58g@rFJP}`duWsd;=IMBKwqG`Wvk|0a6QA=Jx&t&HNS4WFK|YocE0L>GErYYDNdDt z_|DpdM9h`FcYe`q9ep?JY|6d+5a!#h!ca@fa&6wz#$WYSP18@4o`7`1&JWD4agd-8 zh}ZnK%^rqsUqom_e0sZrD6(ul$0Sa^K>p=hF@+$=MtI>Oet^EN94_l!)uKud$?wdY zlpkMtU+ZXEeC+bo9+SA>29J$MF_X6Rbe9L=bO%dEVSNhsB|#?tz-!kI-tf)F%@O7p z<`QL7ZWqJ5pH^~Tps=xHfUsUsyL|61Y?Fj*sa|O|U>!zL(QV^FpqqiBc9o@96c;f- z`r-GsfbA`e=V^7I4C4FEh=H?AK^zx^Km@5{@z*;ap24{UOY; z!029FXn|nRkg5GSv10=S ze~qmrzz--48Im7IPN5#mAM8}!yP?b!K9x*U z9>=>CyfNbYHH@^`dq3{5IU>G*uG|WKwse@Yo%uPkFu{=K@3awVOj7u#PVg?J4xtnx zCJ%JDke+{EHAqj{=b{&^hdI)tGN`EJYC_u-H-%3+^E)?j`w#*|3|~T~9OVen-laJ20{L0YR4$dx>}_&={)=q_@Vzn=FqIl^QyWX}IKf zd@w$<1FL|L@uupdnwDEhLz7J#mups+K0f0HY@8tDF>ext8Y1`XsEG99@(NzcG2c~< znFQRm{-)U~Gfr1h-lvP6(U;Fi*cq2|`Fq}8ezVpnZ&{o)%>-d`&6#ftV4lub!5?FO zHKB`zw*%9CNc0A7jmGeZDxyw}x}z?vCgDh#3cJS7HgXIh>w5zP^ZLLDmR~q8dx5qg z_C1e*BmV0>N*4&>b75Z|LYWUHsFVj3yOP~`=MaqeWmCN=-g7JZLu397c{1a$mG!Ap zwJIW_y5z`m$wy>x#eqhP?{c*S%_~L6m*7~M6@|^@L=b(9#JA5H&|{wKu)l`sQ=R_~ zuC_O%uW;N8Cp3dnR{DAx zQf33b-+`gR`K{VJ9&78vOMj6GyMaHG+vT}T2)>Y$45`utQ+$%V0Z&tBf>Dc}n`6K{7;A zK!)!UQMv)ae<%GvGSZV5^WDXEMT z3BS}fs0}=G2-J1|m?7tWS_k@RF1+>ZZ~G5x=euaau~XXI@=`x3nj0*<4^ z(U{9b@+Y-BeM>$vusmP7JJeTgp`mEaaDU)twJKs*??6?ESI*>q z_A^o?st-nN>_^@r#%|6cxwbpSn!Z6CC3Lqw^Y_wiQ!J~E<$D(`y41+%&VBGMYQNBY zKc73|j@XO2QjNX|Tv3puMFu6oTG2DWhn1;Gd`&viO0buC6X4z94Ro=33vNA>C zU&yQ2^auz(zLJVo{h${LoN?BVu_EJRgbL-VX(nm4#)4{{JSHF?5}%gcvn>jDCS+$q zfQe(3+kw7DwHf!2=ax5ZEyct4aVzFg#v|=Mv}{SF4g^=~CR%@fUs8mS&Ctna83Egd zwk(AaCE?9z)&DzS$DpugZ4h{cydid+%&!{@{6=T)YIjHtgOZQ(eG3_grEh0N)6Mk? z)|Bh2S7OrvW7cvIj{R4K-nUA4xgWg>mN2zB*{Qef2T}dn)(bDP{^%{)odPpF^)-2r zeruLj{IWq< zW}mEvXM}TX1wsdTu&2`m!i)XAK*s8{0$w0=T_69$rp;{CuzxnByA(oz?cq9FN7)T( zXS2G1g6Y}Ukc7@e$k^)E3bCDlM?;W(bSVnh1>ZQBx44icGPUHI>U|dOw#KW-ZC=2= z;Fgju1l+%FSEejSX*AT!o~=jTQGfc(%?0jt0IP@$-K|1jVRZT1BUo_-R_Q}!gebZD znWGFID{;%G?FxpDI9j~Wn=kKb4U_P1jf3BnTJQmpLw4yCN^H#y^;rSLcPP&hoXI!P zZPc4f>saO}h#MxhG%`m|G)PBf>Jcw;PjX93-qw-fEhb=ldO=3IU%dOqo{hHr|BJ8p zj%qS{-+sX;83%z;W&|k#g^`(22uN=UhzgDZj((L+kVumzM36v2KooQ+0Z~9HK~b>) zkxnQ91QU8dN@!99l0ZO83M3)nJm2^Co^#eZ?^@??7Fm1ml|0YB@B6wwm-tvO@z&?h z4{ha1(iWk2-j^(497HDKhcJwu{#1cd)O*?{*Ra5zZ+m6{6@8j(e|uY7YL~n33|y09 z7Uh7u-*FO?_za|qAIj=*FW5E=`$1*LO&8|cpdA1FC|`PR<*pE!3%2w*H28j7$Bh^1_gtLFyJhXz zf)xY7p7ykuh6*De@v#Z}AFDLi_%}>>n-q=6F1f)7&LZ*e{E9f=EY9(@DX!9l&QyU5 zj9#T6KE%wzF7~79E)X`%!Mg=O*|;CK!)x8xtbu}&k*rgX?#(sZ%!^Is6=8H0{8aGp{`#?%f_%PxYAq3^EAmYuYKa@DE6<9iKT&dVADhDMOJn%XB z{ou!RA8r>N(um8Z_+JEd<=oMimW4PCx-JApnjdBL>##Zw;>JLjpm8bB-7jms3NhDH z4URt6r5BJskz`1aM0wozrEJwdmZTZK?wFYZIL~S*_HK=*QvbA(;M^VIiA&}G$RgVx zh72g9`i}Ce>yEchGXlyKBoLj@l^~l!PaE>f4A>dFF!8b_087%Y#LxIeq8T@PpT0k} z4egPf%clVmtNQRy1X`$#nt=m%l6!5Pc>hzxVW!1WyTYxWdz>E{hi9bv~!lWq-KfY7~siwd)oK#);D%z z{@*dm!}MHOy46YwQe<))%<_^#_Sq8FW~Sw#OcMwzSUwZ?Ir2xFnu975kmH|B!+pC6 zHd^lf7tdou!!u0n2YwI80Eruj2M!@whV@;u1kAW(c_ZnCk%rIZYCN0+%-LOHR65t{pVRxy2ld|L) z$uP^L%3?3vnF+0ak+fg$LAy=UIa=I=Z0{(%rE0CRS5^^`@_8)q6tVKQ$l}-Cv8lN~ z{hk3eOa08W8YK8>;oz4~K@vFW#b5 z8M>z{jG3yBb%N5=+w2HY;}s0dfOk`_fWvt9%mwjg`p#&S7JTP99Zwc_nD{fF{pRBJ zezlny7OIQ*wC)`mhVt(ZYkJY=8tp%^d7#NiRdggfCHwUn)|0LQ@eUDm$JI9$Wj9$D z&m*1vee0&tO;tR-sT_Ow&GJYA9vZBMS(2v)Gh>@~HlWnDme&)8lh~*46NT+RpxB#k zzF%LDpCT2V8tF8_P3~Bz^KbAEP~EfmUcs0_lAe^RMRAdV$1;}rN!0U&I_nW83EPwA ztOn!0@N}O2*$cf9FBm2Hl`}8vxnPrNeH7=r9t8ao&#m@}C9wUhM}-B_>3P&tlHU(& zv2!m8^17LHRJGXqB@p_vwyy>HpZkEyq*}f0e96G>_h(2O#>;RyA!v>AXZ7B>=qRg~ zpCD*;AS*JhSEzOhKBz+-WEtKQ{jHysh6p&|B07cKiZcDT!!@exl)iirE)V$+y_M`> z;}n0Oz%TAdSHr$m{@p8k88mhhrTHO}Gj2awFHhngV6Cc_T2p%yy^E$@zJn}!{*@$a znJsu~Y*DFKS=*?EsLMqKipl}7;(kxQdVqW+==*ZO9{h(8Pqy&!thiph$0kWc@wL&7 zXMjTJMKh4(DSg<~+c`r{0>rqyl@NK)Es;Em?&%=0;B#!g^K;~g_+rK0K+&7&1QiZ(W;vnnN@F2BQqxm(Zp;fjbJ+hq1w@-bZHz#uN%H)(xFZf$p!3-JiTof7|7mXesN-_Bn zdJh{d(zEt;GGo7HwDzS1l~~6N;aCONdS2iKO*!l7>*(O@)8nzcx4%`0<`s604;u!LUPIK@FypjsyiQHT3 z4+9GuL4JZLQR;6ECp&+^ePgc3&6F!VO`kba?&%pW+*Mn2Z*l_QT&=~sEBV`aUoqsu z_eEP@d!hz*&h?iRM|thd$oX(kuHFg zIJwpXbfhr)``|FZWhGPm^+KeuVVz&g9?GOCuALl&>(4PhH61T$2R(W@d;4QFX%O8p zc2_-$vsQHWL%3;-msdhF#U%bVt4Ky3r#roM7rUA!ZSew~9IF~tEpJ3|n42sHF(THM zwWPyyy!Qr@$d!MGo+Z>p7rs7dhLUTxr7G|3)c%FU<;f8w>0_?pMT^UwfsUWdp$SC{ zm3KPc@;(Jt4y!C)Z{@N0hySWMaPD{g#@P>S>+-;1iNRP7sZ8k}-=%){!?3UB4l>S{i0UI@OX&bq2Ny0uhB4ciz@mcpQ zy4_!9`ZFf$%-qQo=vC|OVZtf!s(6x;lrD~1ukh@u-divXH7NQDjAJJFij34k<|mhR zy(#0O`1Nn&!8`?c4uGqoj~T5Z^V4(hIK^7BNl~tAEyNON1HL?OX*33P=3tS%hr9VgL6ddU6~iWrBV{EEl0#K zZVvYtvil)~^(ofi8&ztL>gl2Ai_hzX-!daZED zg*iJ*iD-tLMup)QE)*DKta->f0&v>UV?yD+Id|dN-_yV&KyLZJ2C)dEhw&5-xUkQ* zBS+Pyr?f9>aNBW8`Su{V1$zs&9opue2~o|&&K;Og@}W@`TgW46PVWoZaQx%*v368B zrMW+4Hr{@U7*##9zygII%`g8OrV0Ok$)v3x(xs+Vqz5)w98s!4dWhXG-#g8+4EIPz z?rx&I9viywUqb8a)IKWo8*k_R93u@IS66tcD*{R&Dfr8QeA!!_BpI==OI;ZF(qkt` z!3R530vZ^7kx4Ow2v@=p+`4!@8w95@2PXKH0;0=hD!F=C+FPg((qh>51oOc0NRWfz zDM?VZAm5xFrTx>AcAVui&G!#n=-vOS6cuy_i)cj6>U&zgPwW<rUxWN700x;Yx+tG(Nt zK57>N@g@JTFusMOa_ikauPskjoE|HexjenpXOc<(Y3>qa@{|0WXWzj`FU|LEs#Chs zVIuz^0BIByDHW0yWG>$Ywa*z}P1^m>-|FH+f~PgB>kWdtrk;{7NdDoSL%cN^{ck%H z+uab-(z#dn%HSLQik4VGd9J~e+LU1nE3ooMRQal`dDa$MZxJKq@zHvsR$9m~AX>aI z2YN$9x&}5u1H1RZtipo?;$W zej95Epv`3~%*=`_bXykFvv-{Ls+_r7_sW>Ynm9hR3UY@-)m|v=sfHHXmpL1CkFJn*d$tOR@gFxk zXZo9RTTF0a0wI$YT&ejN3n3-2I?;NR@qSh$&kmm?eJamxTm~^ZiK!fmN3mSHXo(TC z*17y)tar^s*xJq!1#e-pxTjYhDC&(eDnbkP)KFl$uCqIiXy(#>t2t3xTK0)wPpAlNwL|g`H zL&Tmtw7LU!*?0luO+8j1M?fl&2@vIc(fCvEraQ|iu=)?jHeV>tZnEKwTVfNe?VbPG zPo>`EULTLvf3cR%F%^m@1Aa*zDEK>cB@*`g+I*A5((eEU;*sG9D~;Pz&iBwj$zx-x z^3aL3ODdJ~OjkYqe-H@mMzu?N?Pj8+oR4h0G&K+NtKs42iUS8zc6c=0=*%K|kNI95 zwrjB8d3@Y7uQYmAF!|7NecvYAkx#eYoW|F~#~PM%O>>}yn-3Y64w={-iaSbdl!;p} z(*KaO10@`jtomU92fK;*Hr}%ZYw}}!*eTHYXzSFH-_WC3_9*n2^`8qa*}E3`E!p@A zHLHguPLZEZc1md@+lX}&_Ib4Lz^qCnTQaOP81U>-H+#t)xehRFJ#=6lRE?zR=;89E z-hjfX+X3n^9}a?z(p|_-Z5?vQ2wAr@0>_qgl)OybH5lkV9jAA}TUkSuQPy~CUQ*~G zz1CjA$^fCt9cfk0y-2plS-I=K-k~jT{Es2%o>{lb(B{C$b4!C{#cVp2Wk< zPnw#ypF>7bL~m_0)XkScl<~lk*IxPqbodjK2dz%sRs&g{TQ#s!;Zqe6m zl~8FD#*|9yjgQ>NSlB$gIGPc@P-YtFNNp7|Od6km#754gIKsJWOu~SMMo6vjXlXcy z7|qTG%hMH%1}f(5hAZT|$6*}b0`slL1`{CS$4v)O*Lx5#Hca)0un$iz{z`dIYeher z7OO4VSWsq5@7FYt{#8zNo_?xdzll0=dqw6q63jdWU8`jc4z&KR{9jjRn9R}!*s0h# zqubF*f5^3P6PRicIK=)x2W%;euM{4MuOapXm&zU%{C9?1skf53HN4#*4Oke3KEn$7 zV{qa@n-s^E0wYY|c6rDaNAY^8#0{0U$DhuoxbR?jc>DOs_6k=>;N4t=e(FQYlL3OmWXrJUc@8zjNuT;u(#3t~1 zsClldV{e@hY(keFw0OOsW*G{O_Gww!GUz^nWsJ~WNnfsn_ZFbTdepMt+zHW5b8Fpe zl4xDnQCQF((FAS+(7B!P^;;}7pO~g1UZ|r<8N_7lWvnk}H0B0_5*VLRqMtyyYyYoPO z4vFn(tmf`?zb95kroNmRLw&xEigNBemLxITuB1p&$3E}8^xg|GrYc=xPTDS%U7bCy zfW&+sr^KDmZ;d}rrQ5<1*NAJv^^fbB>0Hzqr30EM!wWbH74v=PjNi)BtwgPiP-KD^ zE1X~!`Oc6~cL=-aml&v5AW{4x=fRH%xfak1zEB9Z$AwJbL67>~Q3zElspo46WFXj( zrV{wPweVIUflO|5_h5;r6M|#~Yc;7tlCPT1d!_1#i3~`dhsVfalikI$E5V534xLDT ztZ*f4O0KYS>@AFN4=tXPVks{yC?giqd!tdy zCFx{f@&D2l7);|K+AIJEP`65eS%kE)k67#OAj8Jy%)Ez%FXp9LiS)Z0+rh^oMl{$< z7+1TSEtT>SVf(Os%ezY_H6k%i8%zrkO1jN)_9R!UG}dfT>_*&+hVW~zbAA#|=?w6s z7{fU)@y%tR(1!5sa}gamSd4S^!;0-UCo`FsW>)dKB6PY(@Q>gmux7RTpi9brp&Lk- zbM0E)OT)3rk!u|foc9|JDr#y=Yx|d3U*biwW&d~r6V9KwUuHT0JHt6;7^!wfRD03o zIVs_*atN0c$O0i#0DoxmU{Rucyy$OEw(P;kG7DyjE=PKI=b7FtE)TtFN+E=C#+7`1 z^j=#a%A_O4d^8p@K7pzOj`5_YKCfVsEvYpY%4%V!1K*&WfVKkj&ilh~uM9KHIWg565m%beyre@H$@1{Vqz^T!$pJ%8Epp=T{!+N z=Brw9l84L#k!n|4zkI+1(p%ZB@7OpijmAFX2mC{KH>O z^P+(Kc$tkngiX{#NmImM#-X=<1b7u`BYottfm>QU#T};m0W8WKXi9FyMgH4IFt7HW z2`LG$cA`oxPyU2Sw)&grz_dS&_{(eJLVV8*&Qs$FdYiNT@auv$LFr+-(rL4P=%DTg z|Kb*!Da>B{spMYsyINa5x&66w3@6X-G1k>IQz2*|X5r2c@uuBAT6URfEB1BN{b^dQ z%7Pi{w*9|-B@hH~K~iH+pWNz44^EgSlVRrG#l4;hn|oe+3&9^0w&oio^S`8S(S)Z9 zTgea|fYUQe(4y?S3#73b*jR>>rLg>Ml?-~W#5nMu;3RHs7yS(V%vPF)%kTWnMiE;Y z_VtBfgQ(fubi?W~ePA$u7WUN`M4FxT$!N`(L&B-d#*_l7|8o)KsxPe{f`vl7xikf$ zWX`K5L^1ZI*)FmG2fTEdF=)^8V{v$evLd`FX*a@i>eF#fz(859=@e_KY}ml2(PSUt zIR2{jSAiSR^=Ye6a_H~2pN=J@Q7LV6)1~6!d2j~B!N&?|mIe}T`hIuq-k)}0r#rMa z!laleE2U7^m&K0k^V&Nlznil4RlKb#@YlHM&7%yTA#Ao`tO`ZUg^WN%Zb!u_;RaPP z9LD&>_ZwvOQ!Vn6-r{})D1$#`)0KYp&QunCe%fAuX@4oW_HJSKewQ-t)&|e~G3xT# z7?f3#eeVQ>msTQ~t9&`^Tzt*BV7KqOo_Klcfp~R${M*}{bbOw7j`!~a9_Htp+xNdq zwK~R1Hn*)XWZL;>obS&z06M3kU4|plqC0_h`$99MvB5Ea(Bb`+7_>Z2jt;*Hcjq5w zTn}%q%t!~P8Kw^WDBOwlolw7^QCvKyY}=QMU1C01vLpO!cX9`Gh-8s%_<09MqhExQSQ+!8Nh|2NK11Qo z3c)+3fzF(1Mm~rs`SzJXe%qAcBQ1?9+drz9UXA)A3C$LZIJP{m|-B4xp07t%l z!kbsGR z@S_}m?REE6C02n3>UJj*4@Gqaglv{QTs?W-J#*uh3`>0&*D)mz`AtumnG?$OGD7K_ zyAK3khUBZx2IHa~|Ev0Y;XSKnM^IG32^of9q!a)iH3{R6zxt7)gdt*EHDN}QJVsFy zZi@U#6?MZKy&6bYE^o4Ya3k>-}FCm!ukNAT(CK63D`s z$}}`%GIYoBb+1|iIepg+yaDb6-5xs0Ewz5io<;k+YDBu07)x<8mYd`^ex{K8RI%TO z@{?k%bViP4QyF6}VOZ25F`OZ!gK;*qmHe0KISaK(Wu*s2JB%27mScQH9EM8Vi}3zE zny!OV!18)ILt${yt%|vfC_MfHH@KJmL^5+)I_%X5dkSwpFa##o@l5ez&!=Od@x}cS zV@;5n2Fb$ou?q7951jYC(QH}ujam;Um3VZSJj`4Qt176LH#7Y%T^pz<9G0-yt>QPj zo`o+zt4P5zmf>o2IPUaWM~wHCLIZS27-ng%d1JcEfF;Qx?j6J#r?sE|1^thvlmmva zU1i-1Fpa#TG3}^Hx+Z`~vUJ_}H4Umj!K-VJBXfwhZV}I(^#GHw5q@L3HD*23nKF*c zgBBOv+nZKtS_#CvM^@e2xZn{sP0mvxzm4mb?KzU26BwslP1|&Ay%jz!dhxC0F;w#7 zd`ay46mi6aY#y=hCcz^FAld=CaG?5+>=>n+hS@ky{iw5>2xO;E(Z{cpdg>YJZohww z7B@`EDyw7S$dQCCMy|${iiVxiC7}h>xl`$eSQQ~metVBRx%Gm>GYyfhmyP>{29#Bz zFST&0`_;syb8lFk3W;a(VT-Xd`6Tz;xpdT z{MVn~Afs5=rSFPAPPGchRzGYzYG%A)_r-iEz5LfT7uRObJw$ac@}9>BPb@{O1p^e2 zTsu_HwuJZNZ2)opK=sl1o4uI7RqDuNQn9;+DNwWVEzA$+jOZEbn^o#r7!c>Ioy-K;7ch~twzHr;v7D~(F~2XXEDWS+7ftu>3On~4%_T>zBPqW1FE zO_O|M>)BSY(*MGZ#m3wqqL*7Y-^H)b@rpK|*42m21S@yn;{h^j`$!eQd2}H73H>3A z-F}Z#E`A!tcAUJu)VEHs{QjNZUN$tfC$?VFP_Qii5|N!$ROp;phHsW#XpdGDaUD%n z*4BERPD;*o-&-faFaer#GMwLuvqVaW>&(QOZ6CRH5eB3?{}D%C`BGy2=)6b$3hl?K zjUDRY=|lC_k7lDCCK%>Z^{P(ZYHsUI;jPsnjo)&X-r-wY1zXk+R#W=6!Bx18s#AJ! zcMZN~v?JegvDWd-%-gNjWmd=i)-_u->ZTnNW5n0=_vV>3nmA;9jQi!9td0iO`?a-c z(6t-?a>9kkqfnX!=6ThY@Y-Zv)W!i%T$_^p?7b<_((~{_?{KvMV{5+s`We!i@osAP zr@cF#PpiX^;iUCT9nV$7B%*ZR4I7Xhb~7h47khX^RDh)38x9u@+kfS5AN5u5CKRAS2BD_^-bO0SCh-MSN_Q@Fk3$C6T1QXZ%V|m8T)KF|^dHu^;*MluTWNbk zyuu_;hgr?+M)Fl)EuMhrzaP$Dv~E~?FvM4xiD2K5HT|b{ZtLMN+_LAAJpYHdCjd#j z8B?es;kItPr{#dQGxC*HA}W%=RQ0Pff@HhiERn|8SfY;q&K1jGZjK9Nn*297Go>y~cV&jVWooonPhLp}}^mxy_vfr+TVcKrfJOK}4bKmXMXO_ewM4eT9?3DV0sA6yNqY`IpC3S4L zfWlt?vsL21`uBbLK9W|(Ln`E=_v*kYplaX9wwp@{3#=|W|AhfSTTGz<$t$?iKZG%Q z0aeziz#^bjOZQjU4rGgiG)3%eal#QxeVL0H1*v4oKJ3^$62kGlw{~*HBmXNI$$0_x zl356Gac_-&Ee0B@k$w55#1^!2zImdWo4Zz~Y+(fVp}}NT=UZ#y%UxmP+m(3iAA)YYZSmmT&%#L+&cGh82Q3Dr(}_97Nt9|K631(D!zZ4Yx}< zYYNeab+xtd>7t>B@IPo1!Q1@1|B{4403JCKo+CxBP-iLZ`1*Z)eR1+PyX6xz_eyLo7P)3m-k+=5mfRXG9CH$R(f2axq`}4O#JzJchfHiOC{k(xMToh1s9#N(R3JN` zmM;>X1_WMrl02be&m;*6x)HTzgA>DFHAxmurKiyx7E&b%1H?~cC9txR1_vZlJ_ znrJFL@yzHCvZL|B%i^WN#L2+`hQ;{I(fCa)u49Ns%|X9MbS+FLFcW!;DBT93aS#!I zQ1BKX+i>%DjmjMv9jZBuu8j6|g2d4;4A$3`-CG-6lHt;IR(@bV0h5GXVR*~_r*=UE8>M{?hyEB$0&Q3?vlMCp^JnwqpHxX4=e%ZyG4ZadJ~FAqJl z_TC@-oh;(X_Lf;7wpZSK@$M_U)_)o9t*u4nGp`7RD73>s!*OP??qQ=TGxB z$<@ug>nTsSA;KaPIPP!o?rmiR^XIN5&*i3!>;HJb1763SxCRy}RO@UBqP)k%TOjXI z;1zt@dEtY;4t0~hYCN4j1a1BCI#M)>x&Z4?){d}IRT_#S^r zvVY+M95u{r%*?KgUAaLB_n#76{T(TOZ|j|?0dv5)|GIJ8G)(2Fpg|%+f(PRyECNZ|fSa|`b<=yT4Lwv74B~EXMtM8oTVm$~A=YQZkm|#w(xQxV z5S;z5WQXMVamEq66|rA9kZ&pxCuoWq-cB~~6N16|Sp>TMZq1PW>~@PJDXEh9W#ou( z6MC1Qr!T+P%3!w^4Sz$=%V`o6jpUzmQV`)Z3!#Hqg2@~6>R(9&(w4dJ|7Wc){WLPM znG@l89A~U}dqSqI{XqNS?nD!5{Xg62ueg31lXdhv2b?idB1U5hR3zQRBzkskJU8XD zmrxPAH_uL~ZmS05{FjDjeLhV#c(ZCd7%^F-qK;bGEZ0*(k7wtWCStTR3gq_%gwB-5KEp8!t1ppcgP4l_Pex6o2QGR9qu-yX(R^>8(3a=Idqg#F+(}73oWjkrzxD z74-sA1iU;)BDa*BgQxcX(P2y8)G(puuad!l*QyLG0(&s)C8^erTtW$P7otWnB2BZFJ|968iD)_EX5lk15So&qfKxlQB*G_JrSm9Xn;! z{a*|68WB^E*{g{ZEy?z*!5`BC9^lF<$piSP6AH*sfF6jDTaW+ovtPNF4nFd00@62u zd3kKeKKu|6yrFRZWdOUJ3_R{ zky2E~YiVX62A14bkYN~4SLq5a>@aAaAdsVP7MS>?>F3HF61Tkn4qi~RTs$!ovGH}C zZX#l*o}*!0E!l0!17@L-U5X3jXz%JcFPvlNaJxxJTZ+FL)(6HeUcwZ`L0p231~^G( z=2;WYh&8D_%n!}^S5U6~_e-c%QYW3dk=v2nF1xtDYxjR&@W&hTrB+4z8Rkr5zkaKnaZfv+ zcw|DnA`g|JGAh*M6b~yoc_)Yus_SR)9xo7Ev6-~PF@fH9q~P9CKtxEIoeC%t5-Ej^ zv|1>*MqZ^VLqb2R8ELjEPnIkCfX0*2tNG4e8Jpv0Oo=!S3%p3pg_-1=TLnm+;jpw? zYyFF<>%?uL22u7FjAN$IK5i~Amd1vfJH;{n1MUmZ=*pr$G}sjSa$NlpZLSwD`#}VW zH{r}H;4=yq*!e?y@#@DE=sFmofPvZ%QHf$UF94*pcdo(ZM2@@~PcL%<=^tOo4#qciMqHVBUl zRoZ{Dx;YObaSpc#`!e;$D@zNnq3A-cd z@~-TS2Z}pa@w-Np`!LvKg24%nTo(O`d~l+cds?WJy79wu`1qvl^f^Afu-&g>Y@OR? z-qqpgwUePi@K%ZyaO6%2-|1310gqR=vMba=*b&j!%6vIX4Bz?5H%-wRtaM%tg=yO` z+kBOgJ~^n^n@95-yywJdhvEjhjg8=uomcDT=d3M!GlJMvnWn(7IT7BXI~E1QAQo`$M}MftlOo?|kPP=$bl z`;+%wE>dlpOA0eo0CeFoHfa%e23a!pIK>2oE~`0wtAvU_Y$3dfzu@?{RB5onqxQXU zfPOeLO}Tr#!^fJ{CvBx9{lAZvwtY|q{7%*S)0ivX^&_VGUnsB38F`x36#X17dPn#P zEw{8W-ga~N0*LkQqDO`jNq&{ve}2~Bj=Ze(;exm&FRc?w?fVW!?;9VI4t3yC4D0aw zxrPc|SWTC)!}iwZV`NgM4ZOJDUrm{k`f`0xCh`zACZVA0xkV;`^SrMZ5wqZX=!u#4 z7_L{NpJRj~%Ab7TOQA zLs=cr0c!(qXWY!(sT9~TVY{EMLqUXs?p}Pyv@bn56Le93HodSe_lGW%74X%aZD(?YL{;?xk$4iFw3-0a%9abhaRob z2IWuMo;ju_w_p2!TW5&B?e0sM|P+aNp>-HjJD9qN}iD{B-&GMPZfPbLOhK4m|cXb}gY& zPy^E59A|wDC_wW{q`7V5YT&CJ9gq{&L$}Q^$rNNFXyhHPm@4 zA8W$m)zb#dhn3k%ELum5g2EwjU#?#=M~a(L>E@o=#RI;Nvxp<{dtbAF0Fh%l3FP6eXfCL>7 zCC4&bZV>l;i`b;BOrmTnq3@N?TR^xZeS}B)yZMChO^e<$*H_bFntfWX3)*4<7#` zpAL%_EWR45?>>)g31oD)xs01SIVC#%nM;ObTOD25av!frESM$3BC3^;hdDY&z2JK( z(c%*Os(3{Nvc^h5Qzw?LtjxB^$H$ILfwwG7iY{cdcCm3qbetE{Pqd)-l%b!Q z%`wY$DNrUPY93UEH|U2|)#DMjDwLWT_D?JcQ!KTlzDu(&h786kbVVSd2KU(F#uq4R zA9@H?R(8=9E+Iv~s08j&4pE&$_5s+m@&k|86j~%h`Ea{10L6z=_@9l62~6QS`+&Lp zt-Z&$2Hx!Fro>CZ^#3Wth6pg30Yh}$;@LAlhGINIYj5FwzIE)XqG}v{hQ5lC>jfCxQMRt0V_dtqH?1U2^hb|ZdE%C8`*Xc6jjQIuMB7`5 zH_4J)RCh(h=x0dNNbBO0OVMZ~bk=Qq%h)_BY;Rq#X35uEj=mus8a{h$xOV^=8zw#& z%GA+Ngn!Wfq5ttWoZjBh|K$v(Ljhzwbg0q5GeW_@aE67yX16=nSE z(D=T-$RDu!T=RQYu0_#pXO?tyC^tg)A=);_=Q4wqrmffi`d=J7P7k-K<)Rks$^ zeEzW#F6OP~1AOkqYGNVDPlHVln?=fu$gWa;jxxev6<-nPN|!qi3|i()8TSJJo(_4A z)VUvR3#Z{F=PDUrlL>+|k@5M>b{-jpUCxK107Yl$&d*UJj$#3$jdY0gh$^F|b$~1d z3}gT;Fx73~W*TN^!ez`mbO%q<=#nj)m^NYhL9kWpfWiR)Y7&L9*YoM27InQf zLq4=XOUBuRR)|c6+j@t2zro8fiRVD2qHR+#f&PuBet(h^focgnX5Q*J^HP`Uw5XG8 zA?i9hTys!4>PF;OOVYG$A&`Z~S*lqM4D_m2{%IBW5-U@lD%m)l0-EQ8-1! zO|^%HyM+~OAQh$y+3El2maCz+40KHmFza)}rhe;l%Ox#$+fAB65i@uDUTQ(Y9(2jg zaeRMU|4;yp|JJLzcgedoToh)ti$He;H_4jtJKkLQULO>9OykDP2H!L%^gSxy@x$zq za*5q|T>Wr(b3a3u|Df9GPv@yy9aWdTz+^a-(G-(U*Na=5iBw1TR9OAvTuE$N%4J}FMd~gY5;|Bky_@&e-3yyk%WT?^yXMUH47fLzSa3C-JL8rPHpMJ~D-IyF zb;r7t-b;LqoHOii_d*BVXyzqEW`(APg{Y@5sj$*yXXHJ2>ycWp6RNlusK3b$h^Muw zRvICb>9)STq#zrCr~+qxo{^}uT>BHgcIA>`tHs*$j`(Dha^#?Csq2W!{pO=P&%uSL z((twMp#asdd3}DfLN1-|smYlbl-})=jw~=>9Q$0GX?GDs(H|fsnjjz4%B%VmhEPD} zK=#F`0+V2VEEt&RfLag)9jX?OMzv&fcxQ$%g{iFvDrL|@(v{$X?Ul0{nf8mWsLyhP zORzS3#B1i8=qzTEW0QeHh`FiUAM={6CixOT7u4aXX_{meGtWC#^d)!a5(yATluvD* zgY5Pt5mBY<7D#(S=zr^sCMS5geg$~8Wd+K*$1YMOH zVR3WcY2IH#6v2C7dHCDDn+mf-kOo8;;#^-*T>y6R+S>cYK;LK3J#AYLTt{h+%j&0l z3-CJxdM)&y3kn+xC-G;84(}nDn99)bZJG#jWx#AHd#UkM#rt^K9v66=_iDuMzaNM^ z1WNF%c7W$mm?8ni@gRnE)J?}I@Aa4tkKS&3+`F~*UgBxNk${->iUqs9`Shg%JYfQ3 zIN3NV*fA^M9cS#+t1HFrr$^1)&Ru)4_6@8)G*(egbDF9lmDdg|^g6};xM4C8#;JQa zE$4!mjYi*GXVj&v&sV0b=U9f*BT1zj`G^^s(iIRwQ(Vp&AjW&g6gWgY0fkdeLRG0k z1De~1T}CNq%3R-1urq4dMu4&9$PpWbOLV0H-R<2-TatK7;MaXDqD;zo+4)*{naSWThnmPHht(FM&b)QY?h+qA1BYtf@e4EWw}Xr15S@vF(IsJ3Cv8_aWLk6* ze#BZIGN_a6k6j5B(0w*EQSxnhGAXb-XI!`d9d|CN6}@zIC8f};AtCl|2OD>ySVsnK z7RY*JU+O$|+?Mecn!@Ssil!GD%+<@=;S%Kah&bU`;;jPC@ufb@gp*b)=c%*PWM-0b zF)^N%HTfVm-*_K|+duCfxV4SIkw<^ZVdSRM5 z1&n8x-fKjEpWC-GB)&<%AYmWLnRgB_dr(P$`xJ50whE%#+88)|1w zpGdIC-l)}n2BQ?h)V^0t8JOCyLLw-Cme#lUd8x@N{z&X~I==eT85EjdkbbbOyZ^AM zbwK?8#npR9HI?>l+Z2V{8v&IW=>$bZ2PGmxs0j`u*Z`GLIzb~+LJd+v8dyMws;G2= z;D`zm0RgE2K|)RFp|^wt2t5T7+P8h4?|r|uzW-T^y;qXGuj~4q=W+1tXSHFqkD7_> zhM8P);e^=%#T$eZ5Hz)mxH(loE!$=El~bqKR$A*5e^Z4+$~Jr7189>;xTW|CRVm1` zwdjG28b-J~8b6d~S|xsa@`ar5T$5s_V}Mo7@cQwmfmOe!f*tmFUb8PaB$vP|?AK@P zKfE^3D1TUU54UJy=M5?8R|*~E7a3&4p-aN`Ic*bN#SH7Dtso@JYLayq`MYR+k39OY z4K+-r{i7Ee8Zx7{8gZI{8Gl^bk4id?^ecJbgiJl-8JGXoKXN9^w0_+?r^={P;-Ri1WhBId zL1V#XRom@ks*CN(ToAC_OIEF`en+6%L0j@UXzlT6ef6 zh8(;p4@TbGxwdr?*L|2hR??Q=Wh6rNNb}xQytCO}qr)gC{JuAnRQ6Uxfx&U}4)nL$ z(c?n~LLi17|MgwCP1FivZg%GTPGH^c)G)&!YR<=DenfI!j|SG&@yG4n z=A8onzSa3(B|v|cIMH?_)*X1`1Xk2Nf`1zh8QpCJPpqT;Nz-Ad@JG!<&41O7i3OLP z;)U1ffBn18MHJ4Px={?=p2Q}OG1GI*n4!o&b!ZTboV>(MCt^b9DaoYZCDVC$7;d>5=>-k)xbk!Z8S>yJhxHe+6U3TmJr+4`z5M|%w z+p?KYTVS{P4Jzi?ABweWITw~zM2acf65>;OZw*aOsVmhCZoZO{10NJ8x@KKx-2`I~ z??S zQ$iB~XkAQ+g7BD|DW_xS-8WAS-!Qo=??5G*l+!*#<+Jt3OZw0bEPj-3c&ko1ewLD2 z&jy)96J2wz8}fc|#aq*n-Kl012dnR{w@2>*>?}e(ogjnMj18N~jtzbc4GXb*v;!WT z{rAO-h_ZcEV6(f;tTb0iM8tq8JmevW!Sho8CW9`emaGXH&xaj{y+?ZCs$j2ooL+la z?>+rGUty{ zZ7@c{XJs4 z7ei#l$qmJ11M&Bv9a@SPLd4LhI!($*k-9ODro?Jc%)b47Ld@JaN;u^Z>7Lw)8&1Nkn=!x@o}|9h1Tpq4%-e!x(W@j&_&(?lny)79eP)cFHt{{YKsqB z?A~$P!y10Y{C5s>;K=0M22$dAiD3lOfxY%CBMW&R|3#L7gx`NLWN?c2PIAFpjF3?k z69xC6PiBZ+AX=w`(v73cs@#(ior#2-Vq$x|tAAbk+kftx?2dkn@#^IQSEhTDm^$tR zH79wle{`dv8}bR7uB})|6x;*Bqja^n;tR*g4OZM{LBaW*H>lHXiV#Jd*_dAVgwf1Y zZ&Kz7eB^%vqRjC&htNQi47}Z}6bpjfnmAzsf3z-X^pU}Uo93H0B8uEWQ%0N+kdG`g z4F&`!FY&;)hZto9hRKOmW1fPs9A@s%$g?q`PladQA5I=&I|Ri{gh(>eT&06LBVQ7Z z&t+ax<6f|1-8BjHzoHV-D0RV(nor(QvxDPUZ58*HUxctt&0OXRcJ42fCYUdUCLkypZ}ULh-dt4#lw!+7LX*hW4r? z7dh1*yBl}|Sb$JpR$WTWC&}G3Ray`So_&AATrE9|C5;U6$8WsXriMzTyUf>?AM??; zo{UCm>@2Y(L<{;ka2Y|Br4vzt2$ zT}OLKDW3*k63u{YpqN_>bV0c8E%@!|(Dwt6isg4i+8i7$R2+>UQxc6V(WBBGd5)^dTpixeYYOTk(e@35+x5O99*knvDw z`*Nu0yPn!cN{88>s=yiaal?f<Q}a%~B3ol4!RU{*JM@XyjVe%7@Kz z@zn^g*4gcHt-5HbvF;ysvNG%!&Wn-nO-&{qm% zSCD4RDe137w0^3rX)mz&Vs?Oi0h2;(`2)F#mx8W)z;9Mm`*2v=C`^{8cQ;py2Arg9 zARn4pTo?>c7pRY-u*+J}Cb|7|spL5yrdYZ{>$z`j?||+_ix0t@PFRtj8(lYHsx9=i zy+P)qbt7u^nW){7gpkhQ7!djLY>E6=r_63p8sz%Ywe`MAd{wML_wI)K9zTnd^Zgj3 zKg5rAzy5o4X1xW)p~(zOC&1&@#M+E#Wl2KSs@+&%_Ow#5E4iDcB-Nu?Qg!-> ztiSTn3nk@QZ8TUW}#61DfDzo4i&b zPj-A$PcZaYjgg^KMpe}1A67Ioc2DbYWX1oLN^?RyCc%j6nRc+y_%8A8s^S(gTDf2T zY>1>szNd$Smqx@K+gJ%Hw}{fGn(;!qu5n7*uBuXz-W>oWS4@d*jCA;Mc~aQJ)33w> zQ(C9TMSbv0%3nkvrn0d5d%XT?s{SZbnHqlF1GH{LHPMttaQZ%6v~^(x{lAyV1Eapn6l1wGEJ{gzvM5LAqbX8UvXL=u-co}uih72kRzZn}6@e4|slDQ#n3F0}( zVXF?dRD)GVLowBC6*$p9Kd3e|`!EYV$If^&h)78>%%XQ6je-aGe%!?-mS!FSMj*() z|My~5XP37(n{G7rSuoz@(uEqz{KrP85{l~8xOTpt;tcRj2siwi?si_8XdOzEf_-FaXpPQJCM975rRmP9J-Db z9%zVokHdcTG_Tdf`)X1ZQ(u7p!2dYZI81Pt4APn*rDlVpT;vW3cC}9%FS5(?PBFhg zCPpISOYXJ|iHCdxuXdofom;jz%NQ<-bXo1Go<6x>JB%vNi0Jvr2xIGrstAy{YE2DWHK;<}-@nYdY{0Z<^ zE99Sf_N09RHa(KB7m$`&zEAK{q=Gav^ayys`d9v&I67)=P7L861+7-o;u*Y!o?~xh zWj%KQ@fTun(bQ9|vuWk`)r9MMaz4-z;+{wwWKyiKxmD0(cDNa+Bp$w=A44AIkW;kM zEUYtLpfnHYyB^YJ=LhA=nc_*Ni%~C0uUaHn&~Dq^EJ;msvy0y`W zc5YHk!f*3FAW@#tGpWsTRBmQSKW`)|fJus?@6*oxFX-?^J#F?NQ7o%9p05>ih8cGm z&fv|m22_X4v{^IH#Iv+D4cGTO%!w2)K5Aw_dP>SPP=HHayx%H&7Nw*t?g{cnO3^`L>17K82eb7@2KU2y6Ghqi;zW* zHQYAp8&ovXGcUO=Jm@Mpv%2R-CyzPx?p`R~>z47G``QPQFK^~g!ogzjZ85#g8KWUZikN7e4zT8d0_LOOTOwpWfDUn_H@3PP zQ<7VG7y-f*g>SA?bW7egcBpjIkSFiEX(bs}O-WtbjuMKSaJuDNWmX5QCWWojKT}l= zITAodA;Lq0L)%4l$E&h>iBOLl`c~N%L~biMhE6v4*n#uV9qk5h_5LDXQg3CpuBG?Y zM~Z<=jNbhE9`xj0gntDkaqd>0lsJF(21S zF}c3Y3r&6G#UH;-%nAIc;I~)b!}Iw-E~vXjxJW`TAa}3`dCjkGwX3Z!p|7k zAzk!sRcl{-vYb@4t0;<}k_;c4l*p=WY&D}c??r4z``47VUANJt4Q;2-{u4*I9Z)kr z_^`6gS{zgBM-#Y(o7S%y&km{v25fCeY-maOlg5w%-X%3VWcJUA`a)8#;MndjI)R{J z{FOP@8lwO{T{+%KvSoNI?e;3ZmaW9z1zIRDje)i>t>%tX=0 zl(^G!6MzutcEuJ zP(3xaa}s@2t`nNYpPj zm5tQ)5a##Bhk1bLHyvQBOwx5(7(CyiYAy{^=z4PyH~$(nPN4dui;J-iMB~aa{Lk9b zA1T@f_|;9eozIpuTsZGE8v~9>tnC!n+7Hf~68u^>Xla=GqTeWt1|k z^MzbG4Hu=6&37z=HW`a?^SR$MA)ML2ScZp*=ZW1hi67L@C?+TA?U+#(W3ds%dlPR@ zhB11kGyN@y(@GEI7-htYqCSXZoypRkDZsrhGZIBo>9t)GO9q`=k7Rv=8xa2i){q!S zjJv|Ok?z^5%Gx{HiWV~nGEE&BOE#E&SbN?f#!>VmW@Ye`r%RC3;3k1b`dZq_1)F|1A? z)z@-=AR+a1(zw5GdNs=RYkhaOS+Mcl_?J;?{Ym`*!*qyu`IYIG*a^dqpH|TO068$Q zL-SNb-cgnARK2W0Pdu7QMSq!$KqRYyQM$JX9?4oHWs8+GML7#logPapM^ysOWyRRm zt+l+fUx-Tz`FiT4iHCVhmE5rON9pEPMEveTG-Iq%mh!FB;IMS{Smi0~Hy;}Rev@?W zM(u~d8?2V_h~g7m$!M#33p8%ZL5!LFLKZH%mg5N%?Y6+3{yC0)UWa|=?utm>eB>`R! z{n96OM@2)A$&uuyj8Q(Egfw2y5a%WCp#ZkaIsUh=0?l_jUA&}lN6|KBAK z-1?jRQ8|}}Lq5KqDR2cFV#P$i!nUyE>W`itls@q7Y7wZyln~-2{4r1T#|)Il{d5BD z@Ep~00};eAz`iq85q=({0NdCzCp2^NhA1HSfUI5N@6r|L=8J{%ce;pR5}v&q`zA>v z{Ql^Q(s-n**}uR!@^Ho8>YBBhOW=)_Ks&|R>A2iI^rU1*x=-K?GCX0Nph{mmFPo)u2a3KOQ#aXVGYc512&5PvsBPC8GN}2R-bdzV?5RN932~GTlmCz zI6G-C1tz>pk~^4WnOLTLeIm=n9U!4ABg>S%iaQJBO-@Eek)WECw%LU10b(F_I@+5h zvFTwc&7|vQrR36F2afTlKPfhQA)LnEqmx1LT%h=~2E@^Gmh-s8r!tAP=JqhY2 zmKbIRv)Zv*#FkgN_NUq!=jKLpwt4&xfKlc$DBRM1^NR(!(|(jmbc_%AA)yWlL4E27 z>bV~{Ib@$!_hS0DmWGl+1rR-;+6s7cL&}E5!q7veX_4?*o!sSf4Z! zhN|LCF00OJYwT!MI+eO^Un00o?D5uL({Jc(?4mAJx~UQVIzkCws(bqf*^CgtX%dHF z4#L;pVLCP@G}w=kBdEV4#BZO8 zef@`ej8k3ZO%OhV{%2*ki#c!*BE)>*DMzO>Fy6$YHcXTrn3uM=V%B(5VsTR|I}WYX zAs%m8&@Zowdo+?j`CtnoDXLU2YB2>_64yc`9-)jXG(ys15ucN6VE*YY?!p-MK9ebI zH$zMN=Hnv8_^$lFtn-PLKwLE$_tJ3boOStH=mpIHUPO}y&8C)rNZt%KU1})ml(`xY z9MVm3N-o%fTCVt^n5UlW9d#G6y3WV8W?5(;n-UWr`VFdHM;we8_p#d>;n>&hYNK~B z6G8DJV~PL&J%D#lpAda6BXjpz9{9>gdN0mB|5j2d*7g&~P&D^VHOVF$>JGm6XxO@S z$$0;3*1kDr(AegPx7b0G(aNi~pw%67tnG3EtiI^1LFhH%(m2^)?}XxS^jD!*xrPCY z(HII)W`joVjP!l~=Pe9xi%bSU+51fd+n#~<1wG@KIP(#WpKPKkW|x)LlG#$_9`J`z z@H;$3b;4N?(IV#wh$WS~)CnB!RXIpw_;|3F*$eDwaF>*wsgo7I;BVY zF0Tia^cm*MycYECz=tz}B7DLK$$bGhoC&(H$`!>8<&0+apM~WH+HMUic1t&Rv+0i#^%a%e z_tHaJNt0iXaxWMbAd(r+>QPD*M>m1OFc{S2Y6*pS3mto7EvZ>DiM4WKXCMFxlBkCj zW!f>b#Bvt%-E$$S_|=Ri)d&xD>a(|;M;d}y!}n^eU^z|BTBTi9a-XBh>i4ORKA0+_ zQ-1Xg1-)MX)1ftp8>?7<{cO+hf&s-w5)qYvEF^&+^f|a+Ls6+u9wszYGc9h*9Pw_l zGd-`nt~(=I@uTWVnuksy7SDTi9y1cdg^bYZqoA5GP*9%_0<{*|KhBG;=yDCWG-9f) z>$e0t#-Wun`}A7Z{)8LPlwag6loFFcIA~0j6iJ86LR$5`WN0YdGUblpKR=r!%q|H4{Y8!L!L0-f77gaKs$)i^JA5Y1YOotf#k&}S*l?Mm>DDevt25PHYZ5)v z^JU<3`!CActn!kLDm8c+rvkx+q3L`TjdFQ^9|B`%7))H?yW9 zx6Zk}bw{rW=#8V6}N`)3L|=^NO1|IvFqeo^#RSMsX72ft%>`ntrT>b$()e=NUMwi(3Fl zLvKNP_@uzZt}cUK82zA_;W} zvB3czBML45QDIPV_@E6dJ<@^hB$aiuo*tT+@^HY}3mh@V7$qjqUHd`Iu0=rONT$s8 z1c$set)C+`xEZG3wdTK|(lqiEytW6Njh7#IH28W;Iq}Q05(6Wvk)m@P@m~>(y^Upq z8~Toa%G`|YpLE1tNZJL+UXd*q|7n(!R`817Cn)KOcn5S0C4OPOQb2=}CVkJ76h<-) zk@nj16_DYq}%r$A~1qIgv|Iuz0X-@@RSl1=Um>D=yTFuZw;!59&@_$>UuMZ3WKx z@wZBf({T-JKW({ch7(Y5J(YsXFE59b%lVJZO7PZH@r1WfOE-6Y=VpP)``s2+q`tL= zYGICE7h|7v$VTL^ThN%`!2H(rP93c&|J0{Anzy(vA);Od5=b7>gN3^E?30m*eSiX| z?Xtc*tR-$CZW>$Gr4+gud6s$m@gkU1GS%XSZA#i( zmi|%{JE4}YM;)wi_*Ff1sa&6%Q!l39r26-M9ZtHRg5c2^cYYgBPA;#D?6G06Y|3 zYjZ~K?v8)Lw~AzCn^pMW`X8AMQ%;Z6TOQ*1gAZ+)f2kR=zntUdL7?pR-Yn67c`XvS zR)_pd-7ODECa7+z65jYVphQ>b+Nya}7rWnt{CqSx2bq(!c4h0=zI;uup7}3ug@S0# zyb&eeQUVbp>_4!zz;%{fN>_Aabwema+5vO&-SX_beZ2CvW8LP!P-bkO9C{xPrJ5-m zaLF`&sSvzLxAWfY{<)NjYbrvT1(qGHAV_U8ENn9)p-CMzkg``yKe^d``24`wLL9Y zX_pVdE-fhHz~Aaw(`KT2=~%TjiFsmK$K~QVYkvW*iG8YD`*CwmRvZNHq@AQRk_C)Y zYUe(Gn7`EAT-8khk)so7EG_>ddads$;Y^q|H$C5HcowE*+X6%MTe+nHPhcy|^Vz>eK|S*Pn5 z*|kc3ks(cDM+aZ5Vp2`e%>c6!zi>+Q<%wQ{QU>}`PR-bGq78^5h(`JZoLzGGuFeGf zboIajL7}D^IDIkuIRhVXsx&x=W9WGLj@O2T({EX+hVQOB6{z{UBY;Xf$s#*R4+!}P zfKrf1T;%j{^5Ev|4+o7#M@-^uc}yz8&tLZWr@iAElh2X@r4XS_YAyT2(4XOTS^7!Vb4A$~J?UvNBO#)`u!% z7Uh8hI|lGU;c@zt=fNfjrnP*s$a?mGimU}n;>ytD+l>q2kw-6##$r*W=jWyY7GHf( zch1%;cB+=0$%k5QbG~y?y~cS_lNt#&lY6Qx+X^&CJj~~5n><&@s-Dpl#te^6Cz{N6 zd?M5eLxPhg_wDoQKY1KFIIMV&(kvgi{Pc;N5Dhxh8x25T0d{@qHxzin>u~kB@WCvc6rlt z@*N1*fJ`7-ThZt(7cm8@>uvLVsY><<8@Q1-aBF-Kjac@V9nlEU-!mtZofBO@p`b@&E9|hTmIH884y!@Ph#!WgUdN(gQeJa9Cfa!k z3EOdRI7liI8IUUrWgX!z(Gyjo5Yt0h@m-fKDZ*!2)$KE$H7Ub^Xuu)EQ}*O{z4b#! zZJk(g^>@KVkzctNovmD+@f=P005RXX_$#)apsJhMifb?-mHd2P5mVdau|oFJN&Hl< z%0XYPV-~<^n=dDv&2?L}-u@C<&({=`qrZ`YBmU|nqz`=Fg%`YWgVy=QZA7G(31;@x z_cB~`hg(>;e|Un@T+YW>PWaJ3Yy)fSsR)097%d@$S23;8y~KYi9mMPOi_lERBK0~E{qQJ zglGBlE+>X`c{|xHHCJg!xVY{GyDDY69C)68!04+yiSUS*U;y*3ntx>2vKg%ZQxz&3 z^yEJ%{M7eZKiDCgpdGqui5bja6Yv0Yrj&|r+1#OkDy9$$OR--!=^E`^9shv%O%oNO z$nL)MJ61dbr~jeekhvH4eHR#{(>ob6YRN-<%g@?YSNme%RxD}38`OV7WMYb zd@xFluad(5A1l(AMblB@2{Cq-kzxxy&yP&8^# zZUy(<1NaQY(QSv~H9Guvh=$AJx6skR%^o|)!tKRZ9hu8-fzj8F+s1G{?!dPoiT<`W zCesH~%X{WeKP1rH9grpeQMQsfaDV6?Gp3Lf2xT4vtC@wmqSl$E?F)sk)pN*PZ}{}N zu(9g1`uX+3l`0oB0MYoRV&W&Meld5i_Ci0*rvIF*`?w}9_$%k4&+XBqh*-tN+X37A ztAvcq-F=$G&}t}c%r~V1y4h%#-RJcxoZcSH@CH9@&^@c_UllA|3)l6n9~&x3)dQbh zytTdPOvdPO)t~yCgEr<+!k;i7;r%_P<6hMU&4Mxc=irYzakDva7%+Ehdo9?BE3slIs)LXAH_Hw?*XTN(0@p-1@s+Q?)q(zAPO6`O z1+1Q1f3{~kw8(T^ z!S)Wt+@Y{GLrT>K^yb@QNO;m%VC!#DbWaN57Y^UBsM>tG8{vi-9J{+> zNCCS9eB`3)H%Gr>@HZit`{26Xnb}*T;5+QHT(f|UGqd#>m`k`9Q?bz}0TW<2q3+l= zx>oNH&1R1|f7l)#+Kw|wG}fP-ybD|JCUZn+e_LdLK~+&5`*vs|pM`mIG9!t7%yc72 zcMR`DVwm}GzBaz^S=+xV2WU6@r-Cin!S9KPgpzp@I6;BJ7}{!BD({2${eT2BlGo?s z`sGmY$y+;aW?Tz;K;o*`ALYOwUy8(9+f9B>l&ZCjpOx0zps0(u8?*AXz5iKDm!a!{Uqh>OUkC|ljgTcncWm_ObO-e zR)=_}e0N{opkwUw{K>6jYi(xtZ&e?pIN5=010;kU_l&w_RrwM4H0e6-^N~K`t(_7X zN`+bh@d7EmirIyzLYbpl<@-H7I$Q^1sf;TyiV6Z~%sBs@?s4phGIQUegL5n4t%cS*Ux;NmG~-s_nY~BNjs9?i zKq6-4%L>7IICRB)^1}KJ1-iC2J1brLd3eOVH*}|9fNwk> zN1VIRTmqXPvwNLFR-!!B3$cjAC)~ zLkZWpPx7+utFda(gB|RiTy9qOZ1agry_2K&sWZZ_Rxg=Qo^UF4i?HQ^W$SMmeWD zC3TEoD5=$DcaE3e#<+6UW~zT;3R1}k^#z-sZ$Z!1Bfoyx$k@D(U42cr@vpbPTLj~6 z?;P>$y~v#L?2X6U0(!c#`L{(tof@MX5I(~z?es0Vs|J76fILJ#_~>HbiK1w|R+C&9 zUz{^-Rh;-4N)1*u42dONeDpYjcc}%fVBDr(yIbOE8|4Q2HuQYf%7@2+$B%X1VXAZu zbU(&mYK9AQS5hv8W~Hp=b#Nel$CJt~%AHXI54-K<4s&3;rEj3z*$?t(tC;Uk8IxGF zqyn3S{6Z&!1t=SMGw}vaeZ}~h3B=$knlY+>Z*8_qGcOaja&dB1$KAol711MI;m`2b z7_nnlLWgZ(qqEkJ4VM@0q#|NoNyXsqzuYt?Ji4+zUnr+(?tYx4*9r}4JqJRFa$+?% zzI5;v=1^G%=cSyad6iJ)a}I1lgLX4IMb;}lPuMinlrl%-z^GrksS1{qS9@(Nl8C`RY+4 z8z));%w>;!@f7r9EqSyft-yLn48PP&db*jn2QUj=?>gZIR6;z2oo5Q(0B~aevbB8+ zZsog4Y8%rnR~J)q>hbASW2OG&nGN-@ztip6KT|AM2WWS5oFSOw9hL_nsNg?;zG!$> zhE{BnJ6@Dz#!9GrmE?m)_kQ1vvEvACLcd~j7o6;J`WuD6bHgyFQxt0p*C)_hZh+}) zG3zu|eA5LU+Bz3evKy7z$Vf6O4mOtRzYg$9D=HCoUW4(OuB$y8IsJZSUHn=Li6rS) z{^IE=HKff)ijy1leDhfy_FwL|nnrTE!gpDTs9&9Gz|ypHAvFD8PM5FSUL?28m?ysR zYT_8x;5#7ddd#iY`y9R95F%A)_-OHG?XFHi1-ScR{2rLBS2_OMY7Eu>8+PLG*85bO za}GrP8h+1{>00_osBd~G=W)fr#AWMAhvn+(z4%%Ar25J+0{zKsiwyhCJpY5#7~0q@ z>9h_MeY>tP@~`yjUafZj)RsY9%G*z4{GWV9c&1A|pB3@BRaF%pah+;JsU951Mw|30 z(Mz#C-l6vkvAd#Ed({V_s&<{apUZa_`;9$!alzSZCsHDE;&(q*pf}8ia&`|Ok1+Ry z4y?E7$aA-JH&Zd~zZZ1r0!a;+nvL@*-<_Xy)*G1#-sm8OJm8E(GEB4w71SyB7?EY$ zuN_Ll!^}SYlv2e1#tLpV5Zn1|Dg3!VqiSiL_Z2*_mrQ zR!X<~W;V+LVbp$#367gkA{S+}cyX)2IIklVAh<_Sp&p4NPqd2d4w3AFq1{T7w-+Rz z|9jU$cBCk!By@)2c$M*FOL_BlD(*1ZHUaU_45w0lY}EMno-+N>01fKR5Yadib%ykN z$J6y{cVET>O1X7D_1Lo&pCTz{vWYARLm&9x&RPHfIX{tByIDRT?jj;oV3p?kB zwy$}}c_iM`h_clfog4aKgiRi*QwFj6=+I>8@vpZ3=bmPjewOcPdvtrhQ$E6!+9V^6 zoU5E!x3NR%m0?8Eo8;|_Ie)M1dkHtFb|6(b+hh}{EAQtdw_YA=u(@&9gPkk3sp7k7 zGawHSh}RXm?{VDiye|ah!SLhdqc*?WaiPMlkoHpkhZBDNd<({Rp##J)=Q?>W|ESFG zoI^w!LzBnpV-3zaS1e@3mA(_uBWDmb=C5hG1$ahLnEoG~9l9sIb|?kT?m0j3c_P^j zs1)^TGh5C0=$*;gSszATgBo>vZvM+&wdF=2p;N(>)Lha=Ilx5xW_^Lht{q+b=w@a` zdH=^z%s$Eia%9F`t>q*a_JO4jxV*aejaPxPESC3OLABE0bcpSeV(okmYN9?o)vL~b zWbWtGjQqstL=oDuKv(y+?};2(?&cDWok}Deo9JFGc$fiw$%tmLu57Xz*j?AG>V(yK7z;{j6WAK!c4*;_+`n;?~AuGRz-5bjh- zjSvY}wO3Ue`}@d~iNTweJzh85!_2gybL;j>iICNYzY}W~x+d$$IS$2JV>?R^UzCfs zWtP2Nlmj-V=V#Mnb^F-+4Pt_ei~pInBm(69tX}OPz$ohgl88b>+F zi21%bN&g=RS)M1ZCuyKR8lU(sFsov_Iy*XnpW<+!Gd~g9O8Mx<`8_^?aX=Y2(Lb8f z@L8+Hn92EL+t>fF$;|KmkmN}BIi%VJcE22RRis_8+y9b8V9)gZwi6qw5-1l9H-#(! zx`y2b{Xq9Uhp$maq(J(?2kyRY)nm>%R4G(lv5uk9BBD&3uRPR!xlpjoe^&4$5wY`x z&V6pwf?}(5zOzY_NoOSZu&;!hMNu9e*N7hHKa~gg_QeY7H?7ZJsJxejK+IFN2!xcY zeGfr5e!C7g?>?0!-A(6r85|H9e;63xTQ{^lvF^F(A>pE{0m9G5QeUiFYix^B^{~7i z@gqnDvwPKrm}@^3z?XEz!LC{T3oloVd|HAS9cgv(E4Amsu3rkwf_{lH`Tb#vJgV3x zsOizP0~K8Mul^cn+ zBY*3LuYf+houxa~V%g7!o}f4Lri2cAZ?;yjUvV*skJJK*_%Ef?%(qDems7X57Q?8A zEbDb_v)%5ZTaGN1-8VC~T(KERO3HMj4$o3c1@87EnbK7;9OR*uZjND_wvUX% z7bNcQ!$&znuUqeg1j=hfWvjTzu_Oce{|4J1ORWmdqp#C#UFC0uXH8DC%`P~PXTO(a z%V^8yT)n=5UaJ#gxFcRtC@m0C?F$3a6#1p7m@pUu?Tw8!)(zfx`R4?RbP=9>8$NBHnU*! zCJSAU>W)!jth6+9IMpT&d}B!1l!+LxYF>Wx!{bfyGEt?$JWY89=<+cioP~ItJ=Lpl z{RwBIZjaO9s2idhE2|#n3C&s1XF?nVmVr;S*+1#fhFCPS#B3pXt_xwQ%{+Ou&X9*P zkz$Emsp{F#$(g#Er{B6yIeAq}+?Se7P<_K9G5k zG_622sTxMBw5pn|tAn7Q&F@K=p}AA8K)ZK|3&+}0M_!A~H&+cC0ot`x!q%d-i`(Q! zh;J0UKm#*!;EQdbYdR4l4&txLUxY=BwvAfpg$?$10Xr{QW=K59h|zpYeXCY5t4`a} z3C!AFI^(h*VyD*k*CWvn@5kHz5-NWusN5jnQwJM`srG3R)0nRsB<1+9wWr3gA*Kk^n z5BVoY6!f96?|t+7?FL?5%Hy@^G?V0S=Mw)RN3ah3hDvZY71?mIa_rd`xh2HMXfU;et0Jjjb~_4bG95nGQ=uI^<

opZ)^X`DqDke@-w@>jW0?0LLt@8CPpDt&C5FEa3&1d+_k@l$$I zIUR<6o1SpGnlaByjeeOhAwh4Yk0?pUn&pyrx6~}mg=_z|<--NiLlGHIau|vGYq(vd zKj|S25zKA$nh8tccY2T@2)5*oqT zVENv9VSI`fC9R``lE%Me4f9Q#5|JW9+VX!J+eDu|+P@{%>28k-V#GYS(NT4wpMflM zpZR!MF7yf_o}T2$krtf~N4AIEf4%9Qa=qb_7XEu;lo2vnfk4?b2EX)2NpQuC=0`7R z2gS<*H*>JkLONseFO2N<=aRVWCCNo&@noe;loAQHqvjPaO>-29B)PtpdHI1w*ehG< zT5MHoazxzY66hJm6TzT|%?_J$U!#ZpU`9KA_fM(82Wk-CF`!s?3s)?y(bDt%zzTUJ zxxJAJQP7p!h$LI6?{a)YSU+{ii&-1*W`?>G?y00sW zz!=#3-n%=nC^I)(u6ar+U`&XC4qpeq6!x6~7=DCaY4~{4yfpZyN%CdaTxsVFhc*uo z@oCz9UkNRd9xq=O?E7whjU>1lTWfltPZIO6zUImClf1!u%9ZHJf&C*Fc0}D>Z|8Rf z1z-JT=U92!)C3owt^vbE`UGw0gO{!i^ptP@Ug=d@+wODqy%Md1q>ff#jq06_;_LwdVRBuM*dEfwGsrc?y+Pt(c zbFEge;$MXSP|03sraY~vSg99ySRBXn(+2s+Ms_m8b)4 z4hAYPFFa_~rAjxX< zt7HSMq=*FmP+lK+{%xj05DNhHeAO%2aiEWCY3xugkTRy-x!ZGxk8!dP2zY|eEDhB* z$VQ6DLR4ZKdTjf1E6(mq#yq?#2;w;r58v6`?2*TvGsDht*o3+P*xt+6a2n!Jew2=B zoaz%KCGqR0GT*`m6%t*ABk^>(Tc%4LHiP~bkW6aOQSopx=t{={$mbts_e#%i&(Xj4 z{b4Oi)v)Wtesc>{?#k5R^^M!&yDyb{fZyfpyik{C6Dx{bcrv%9yq94?43qtG0fSqw z5AHsJ!$lKl$t@mrXoh)lyvsy{JGn}yOj-pt`~p2x=!G7BQSXZ65o|0^!4r>yzj4y>AB0@&PR<3GuQCLx*zJ;>iq3si-i7W8yradp~H~1?KqkXxOW7$x$AVf4rtsbDY z_tC;DdrNtPMOW9=esrt5GX4quAG~}gb|}dr!Y6j0KO;k($emZ=Jo}J4(0op`Je&as z;itTN=Yy4#2Ufu0PaW3cYXx3jP+cMTDL;e-8HPK?LSFQTv`xEp!zT?*f-W&VJ$f7u z3FI@+n}TNv|46pMggh+Vs1JO$zyIeQRm>)BLafeMulG+b>4{`g6tpEZ{R}{6PKz`Zx)4g5IOIqDD*Jz=fcO4Mfq(iKEv;}r+HhsxsF)sqP~3C# z$+tFQ4n3|Ce)($A{b9SpiEwIncZ$wRVs_9C^!n%cNiU1a}Chqs({v^ZKIo2@dj|}*P$*kA^&Gk7HZgJ zE9v9D-02-G39 zAey72(sqj;hmQD%XSW{GiPRf>M${SVFAmsZ6EzV#8T z*rAM^O-qEN`%&+u%ZeiY+oYOXnMyo3ekH$Ob|fmIv2%C2IC|#TQ@=$7++_2wfu!o? zi$ijK3hx!$qPq}(!A|!SHYVZe(|7UTI=Nt7Q&5iVI_rp)W#HjuZ|j*;XDT8n-}T{c zy0CdMRV05=lKj??G}4<*w36B`1Cb?ERmMPMx4rL&M)Pj{52!3*FNTjOSrex3N|5OW zXF>XrlN>>I?w$xoF0Z4p+8%+-*-IsOAM{|}fSdMR%z z`dt92VZO`q3&L6aef%4%xC?=*8b)iBM1V15AVp%C^Rt33{#zG@o)PO1W6wJPq2Zp+ z>EX3jWI`j(VW@lj(xa-aV&ll9RNW9ztvTE=(fmkT_YlO&7m4;Hc&qn1Bq#bBY_nQ> zM22_8B^R-@w-GsbRSmVQR9Y(GG>#hB6RB5$f4;_|%EEA?C&pIiu zJT2{&Dw7Tv1Vdts!=~~w{=u>mFyGcrPxrl1Bp8a6LZm4MJCt+970B%tKRMT;jwbQJ zt(aiWq42EP*rb}I`HbnYgF_Q1rP7z|^79Bi9DqG#khcE^u7Yg}j?92sNhizS(Zu{H z{8jtyvhSUUeXA@ul3e9y3w39UV}gckOoV1WMJ{>WR?!hRZz$V~5a}xt%4Me;|6e@y zyDuog8Ihr`A9D%)*@?bw;*YIY&Ne>-f;}512hnmaq^op0)}I|`2U2q=0}5@6BRb+_ z&AjBij_>+*@95^sylby^`e)iwNwJmOXWMC&lK%@R@7qlVtMgg1QpBX1ckIdK-D@=g zJ@rCdKn@O(niLcMvA~$paXVY$e}LrBqW*tCF7dssmkGLAEU7;%y;Rin4p$gzJDSV4 zG~Sofh}LV6>$827?g(?*BO&I@PHiX3cD24dDb0d|SQ!LpNui3SC%WB;FhG(57sHuOfcWj375U~QWXWTPB;g|&;L~YbzJ$b``*Is?9`*A{JV>YLyd5g9FUB6 zSJX9ds4@$aI{z@hp&YVSsR>=QFNG`k7RsKcDm0e9QnI zQHF#I9kZ%$m$wh;KtS=oVwO9`QFXWULD8X2*vg>!3qMtS7qs<|GaH|af8xb;meSQl zjN<$}#4Pi-DyYVPe4{kIYw2k5JebD zWa#_rPB{}B>UkzuK0S4WC?G>5w@cOW8y9K+ZAom4|LQQu)(Sc~an!i%u-U7#=zQaq zoxmpCe9cL>BQ;-4-pa0je4hTyDXlM#f^Jw_;Q~bXRACVT&nUK98YPJtMh@%CNnKSk zPQpF?y;*t0c_fc}UfmX91GzbNt%C5_taZ+E{lyQ8zFfrn+$6=&+Qst)NYlGqk~D2j z!p~5Fm$NK_VXjH#2`LeSlplEp(xx@+A?jtufV7_lX7C(YS}l*ys}+#%O6Oep`*a@g zo%J*45`JecE`bP`R$DC3mFE1i8>pQ6JP2}DM9E^Aof}F@pTHGiVqSP>Ymde(iJy4^ zf%%&rwKIgWJ!^pPl+B;p53Vd(@BWUMjsA~(Zr%O0b<_n#81*V{e6v|X!ldSvTF8+& zx!p0C@p-n~ExOWR)D!QVDQH_w288~-Gk)oq8BBkBGdI`V;ozlLh?~8T&#E~^7*p^U ztYAnYU(vHnQQPSLdgq-TiP-4)I1HS+i(I38W^gA?zm|zuwMDf7@cY3FVz9Xmb2u1Y z?nBh7ugZkgi)}qC#LUzh0E3_ni$*<=5Q)Y_W_gur=-w|5YpvO0{KsTDJpneep}*(K z&JoRYZdizeA#bVOJCkQUBTeXU2`BP0V>Yy>oL_u|A{UPKRB+?T99_*)LqH5v<~yfn zv=7%GlCHXh&>G%F%awAKuttXxET4G=*$aUtMslP%Y9)ubt(?~ zd>!@DKkw7H^<0uOy?zBguT?wyr3)^ks?5j-#X+nhE40`CB3Ei^i(T@j6$_1nmn&Wm zK>oGpcTzRge0Lu{t829I=VqL_uUB+}tJ8#3e5P(}jf*q>#RD_VcWKCCMbBp6yVQRJ z`IeB9ugF85+%gpama()#Wm(pI=y2C;a>(z05WnnYM7D?b6}FZcL{3yXDgzJhfPoor26|Mxru zP-w+Tzlv6-B|POC9^NG%Sm$4N5PGfY?yXGxxb2}Po|8Bswt62`9|sx)p+~PHzz;#H z&ACp4WT)z#Np*HkYl>M*N#b~PHDA{ju8KR<2vX(EF}E6cc>8IA9s@AVb@E%!nFnKd z0LF<)!8`rB^9IMfyA$=~n{NU^?B`~rK(1W)U^Mk4VP*mzW4sxLX5Qmf^kPnPj|Oj# z(xZ5l_7m(6WhO~s<+qtH_xff=X^+M$vgJ@G%k~$oa^!4 zVc6z~mT1J9Gt{CrODYKkz;4~yT~sm{Js;LAtDgXNR@rWgYw0;|>*#-fp5WWNWmBoV z<4WT_-@%Sb2CmVDyj%s?2%4q39!hp=X8Hbk8T$&X+-A<@;z=V82B^&mU`7L;Dz^f&#&ewmclkSv@;Q`>DsB z__-f{GV)+Ofl+nQV~;dR1GuGZ<6Rv_ZMN_dO(N7`)W}YoOgPJ)>p(ECjY-MP++2SJ zcTn#AS`#oTlNzT;4Oz=g!SARB+~aMaY$_%N^`{vq-)?^SPWaMqc1&)u=QNt}D!AuZ z!L>6gTM6|$VdaNVt3Kts+*0I3ng-pea`k5;)%?R`z`dGP^6nhjsnOVz_G9a^ExT$V z?YZ%FzqiPT;}N4qp+h$>?#Lxc*^uTE{gph+iw)@2>>)()GPRnB^BM@I@it%U@rVHr zR#lD1t*gkVEuFrgnHFy5|4(NZ8jpTF)H_Ot8lzr|QunlZk9Z7!JAy3*QQWxI_oBFs^O2eP(q zrSFWy-oF@pq#wNd`Sb{Rs&NEf?_?i#6?7S-7_B-3JV5G6^(hseVaVa8zBmq$n<0Mf zVXB7N%787dvo z(>8m>S2AnAE{E(3bGqP$Q{_L<V6;tH2+6k%5cpdLh@Qbw*uD@A( zQ7tP7u=(imUX|HP`UkC~6J#EH-Fdi+C@jyMI@}NEeT4Zj2Mf<WDCtm^KspQ34& ztqHjYkt_fSkHeUJp#77rSCNr{1?evgw_RP>2wlM?%~hS%jSc^&0`UI&puuXbi6%VPGpmAv^=DhR2Q9sBpS2# zOD~2>p9rjcy5+txVQP>%zy}hrJTLZzh^x#8U9}|~7cE++7NM5mFYs0sIuNwTowg*<1*bDYZP<+pO+d^**6<#ssXP8D` z%t54PXvC?ejV%M8e!2$i5wVDY2D0UdSky8chADv;n{dC!Rgz6sUX)}qRMGR^Tm5Ixnhyt|#UEwNx+9zc3QK^!B-ANp{*SFbi z%U;WKCp===7`xuCgNvcIm2K%g#9ysx_faMVZX`FiO6C+3K3AkOO79tCwfh1`SH5;e z#|P|qgoLH^6Q>W@mw(lFJgU_df})*?HYc8Kxj80-oVU%Y{Fb?uHX$GO3J3NN)6|BA&1By~E|5 zMvl-gJTWp3rH&dMo6jQfS-Haajo`y09~Hg#tByMgT%Xj;comGlA&yd(lXffqcnZc| zLY*!?1Y1>!4|k*eYCaKJgGR)Jk>Zl&00$Du4>MU8=b$!ub3%P-j1P$moCi2VqBJ3_0wK@zWRjm zxzN}dagF)XTM?$&apsi_hJb_~i9nlVaSo80o~eRaN9pl+>Q}a|oE%at+-vo(lwB(? z$yMtST)K#{qFP`)-14cf2;7}^dD9aos|`CGl<~)8rIt&}cUyt=Y2WCR+V5w^a4|Oe^6nwtiF(eMSw*~NRet71sU`WOT+bSsF6H;KDTSi*799WE7rjxSb7l{crDC?)S6_{Lt0RW-_W;k_ z(Q;jz*`nC?a{jgd^|VYXsdMOvvL70v2;C{|y>WLFkc6`J2bKHGG7g=Z>(ldt3|pK4haRm#k_yRib6Y;|5QU_<&?ih?vg%Dj{wIq^TNj7@1hM zs=6vAf&(9k*d=&Te%YTPw@$BVWlipoYP^qvgGf`2)0!y2&P_%y)IZ3GU%cs~)JEvu zYF9z`i-({mNQ^G1rVCmzRY5ETNk7e&gR*~&Ha?Gosnd(V!El(*&7;gYe~+IuH~YP9 zsxA4N0b7pgkdl!m;}>GNJBD?TM**m230?kz)|bEd(D-qj1+iM|l)g_TX7rW|T=)Yp zD$ZRjyt*Eo!P^}|4z-SuRcGOR`bYe1iGr|4*|t?s*M6nvwdk27ym;Q#qU-hFi|V~k zpQNCL)$HBe*t%%A-+dz@k}zIsVc)M(XKJ6%oW!EpLJy-QZe*Ue_)c8lt9>_I$ZJP8^? zWR0td3d;>%<2oX5l>t(ZfA8k;ZG8W@KHM}t&_XqTV|L%-Qm1cCfHl>ZLA~uipDpha=GMKz@t>lEzekwcMy>54ha& zanWc+TOH{)@xQRXQFBNDqgSP#6EEZopB)YcWJq0#%u5x5Jl|(sGQPu{$*@M`+BiYZW0+>?Ra5xG@D(RM|Y~rgt$!*MCyBh zmPv?MTu3(h?P(9H)$d0M?a)RwYz!bUzUDSd zR$L%)z5Vhd@&S{G4>OFLnmkjC5WYS8H|DA2r?sN0wUPm(2RVk?Fx4oDocThXIxJ(O z5Tz@(KKCCfRperh+o{TZo~3%V>T=7lQy%E4KOF6?1P*ixTw;~QOoj;g9qaf@*$_R_ADYYx~c+t9oRRfM11W4!NZXej*4W1>KJ1OKA}fE67qz+Wz&bp z$zkbaggoS)VN&bI_Cc%y4w>==TGhB~|WW@Px>oajdQi4tUlIZl~gB*(5 z*2D}4rD$ms&#t>XU{;T?m==dKqLsixX>3kbb%!`VCbX@zV>xwWLnSyOA8DK25uL5q z;zq2{1(-VGVp^dpn@eVngu=w)LOoMZ!$`tO=I7m&>4%TO@i3_7qkBp+m8q;3QHi<% z0ouU8KQ?1v{=de@sk;)_bT91R735I0V_U11hjpDy$0N|>DxOzwh&h$48?EvmYBk}2 zXJIBj5^sp?j>|X?uXr6z*=h~*2bH!?uh=<3TENR(Fm6ul=y7Y?f7Ns@J(U|Yaf?C8 zA^M4Z`M~%=62QQ zPAKP1yynZAx3nkTo}nv^BK=~k!R?DZ@2DO1%ftJ~T0MdX6E}@FOY)?$sZl9&jyI_@ z>c+$KnQ88a=5sn)=&+5kG5=CO@<6Di@#gn?wPKfU(eBev>379xqCcoH4FI~I0#rIlniGnX{27Xmj{u0$>U3UwHRz{r`O zu&S`078=jj=|~6&u{KjVKh@Yc8Q1IBvSTv;i=$MQ6s_n(X4X!IjZ!)BS{-X^0aqox ze`u-260Jd|(_RYWoxM&23dj$}iwZ1%$6%YyniNez(3%5I-H`AO%O5>I&I6-wk8hNi z=i-VXPt1hBFBc<4T!A6J7B@>{vqZJGpd?YKku2Y9T>A3TB3*m2DGuf;y^&BOuY7&| zQM>UA3Q3RlIQ05g=#ET*C>#P=Fl`G|%ju0c(r&iBJlHy_xOR1u4Q0nhTmTo-{c-U7 z>9*iFE9oD#PQt;ig>Acs1(g?p$eD?I^HydI{~Pp7#VKcclCKsAAUvEW0e9<)3bX2p zmnh2In?2a|@}t);Qm&{blBN~#DN(0flIE}*S-PkU2RW+*4f?f7<(KL!^xb+;Sn)MA zWmk;Lu}(N&qW;sq+9le%C)+DOJ2&Enw{mDopUx4PR7pdMHGwMKICf{x>dT6q_c!Ao z$6m-JSo0Zx-UdgiQhkz4Slw1!qLf|qad}h_cSz|o>Ektfgf&Xguh?-_RVIeoLwK}z z-11m{K-J*A=G#ZO|J5PG9!qi+AcHZO@`Hc9w0I+V`-hw#Al?Lx6Rz94u03SBmZmUY zg2U{O?i?p&HA%jO2W~2l9{{)4z1-cOy!O3rk);)H^sgA96w9S%x9pJDkF>Q%IV?-j zJ{_3;q>38M+Wb_t(z3HM>Y-S2_yjY4nzK22TGB7%ca1ZLpyAu`HZ!zG>Jo_rG~hs$ zr@i9qqIoLLtnPNu3A$#SJtCrlS~P z-Dh)`Ba4o<+^m9$-I{^7`Y&-SqrEJF#)9f_*>wGni!}>eWc|nmUr{>#WV}S{aaBR= znijOqFv7nxt3(mIMj6YzI3sdU$l#3)F)rEzs0>IShqx!wLJ2DFdrEzSn$a<@-PCIKAG@u5=822%KALrb4}&P z?WTU9n8b(^#8*SbfB5y35Y~;nD8-^PzQ7QahOF!AC_04 z((d86m|!Z;(6Ow2xKMRH*4-q}ogwb)(L1sC&#i>-iZdDi78!?_8*O3E&)NN~U8kHa z&}>@?!zqo>kYTvS$zcXtB&@tvWtvdo_d9qm5)PVPYFDQ3JcMn#{0 z6Ok0C@2=Fm03+zl?-=>Vb0W^c%6DgtY(#g2mi-ia$#Cjuice+L+UAK}kkh+XTIK zbFe30?9w*zWt#rXM>^aO7#|UJcW?!4Wk2&YW4j<*Tk$F!9m`L^c zbG-xi0C)KtL~P!4x4byvS9SK~jTN>lS;Du&9c%C3##o{pDf9WHsX*hO;mVQnz_&jF_@x<7(=j*E<@^}`Y?Xi)x%lL}K z<2x5t3xL7f{X9S|$9$w-CBVq`gC_#yq<9qlm!jV03ZUHHuh`|pCyPJC0fof}_AgNW z(;RaJ}C95#ID_@aGxfDsR<~9@ETZ2~(u0Vfw_YlT?CcrYdmifgQ9g!Q}(LINQ zdt{~^-(*8qFO)b~1uYmB3H>!otf5G%{`;to=)3j?1tvMLOfWJ(Dx5rf(h{^9k++g< zRIkhSqj#u?;Ya_&ayiP@L{Bp?D5$B_Dss>D2hJE^@l-4`xI+wI-^sE}zmzEZ?q12) zUWdoPZ{dMAhAYaH26eHtV45vcF1Dz$R3>|tWoF^l1l85h-dlda88Rcg)f(=syb9x zy(!F|JwmR*K%|+Qy}1~hLHK3vly=7{nUW6B4HkTTo)wXWUHqM-k`aG1K6F_S`ma%5 z`NCK8eiFXVM%8o;{@7IWlY@np>jJ3+ShZ65*jiNQx#XP|=h>|DcUTsDqb)9}!{vfo z(9fe$NkqCV(v7WJuu)i$iCoSQt`2vbZ5x z+#7Mn1Sz>!_aV`Rq13Gko?314$Zvh8?>Si47u$@pxNPGa64Z4s^l6f&2jGCqU1v>@ zujyT6*D_;`=oz16jQ|9x%NL`m{m`eK&xAcccHBEm;mHi z&ZW|fE{kg>4NI3T?1qNW@5HzK8zsKQYf{i|%Vk`Vkj@IVKUes#3ej!Io_a=0! z%n~U#l>HH!EGe3m$O(|dv}_mqcw)}KQ6G0w-aQjlPo1f5N2n*ecv!HbE|FccXpb#S z33^A-SRM-oq6#T2n3hbE%LMV>hCj&J$Ov71kHX4W7uSXJB+>}?lu;iQD+mR)ny@}# zzGTEM$eGH*oeq9)x#;C{a!ytz_Bb#{q$QV=t@qw~`Y%aq2=Z0H!5lbU0>%HWiTe~z zzKRua!C~`9t+8Hiq}i(cT-Z&LQeXidWF0j4T5<#yGA~Vl{D)O|wjHIiE*`k=z4D@Z zxw(lkq|!PxP8)eklk&eivNhbJlDuK|c+gRgYCS!E4Tfwg;t7hKgpP8LC3#trq>~zG zG5+!E@W=!rk(5QdiDWLn?*wj3x+oVuJ3is8^zYMe-%^#dueN(Bj~1bau#TA7ndEjy zR(Utjek->RFi7wzDb z*1@dOF|v(C!^S6EB3%x%x`ZH4ENQLg=5Z9uOGB-t${i0MvsWusbNSk@k21-53T_I>=l+%X@MSu3x z02tT$y~J_%#aCf9wK%>73mGGf$F;T1WVD+)(o%Fs7jRBh5Hn#BBfskEEQE-L)| zM6>CKCTtcT8}U@t;;0nD(*=Gq#|h29VuKG_>N;#56E6re?&&^-s4*_@HgoTzq-Or-t0g zy{gMtgaqu3c-s#X6WH_ ze*@<^$5b+wDy!-tWx`9w%zl;N>$2Z;q8$8`YiM^iG(o}J-P8Y`fQ49>40(8h^)gdF ztJo*Q9=4S(%goE!3uGruMf^s!Ad=XoC-7&~mV^7BoV3c?!DX%xh0X8{OvQG0IrP0Q z4zy%=oyLeN0p3sYx_xT|X7-37y`YM?+@!|Ty4OJ=*Dbz>h)G?FK>nQgX#Dfsd}Pw4 z1s!_AY#8YNV21<1Szo;z-Gk8S z2Bzjx*A12ceWD%Q6~H#1JuyijzCKa%NjC0)(OJsODmV)=?xl1L>wbSxU4Oi6qX4nxCf@G) z2VbL?du`9~JzO8Q64RR=AJh~#O}WG5MrEvXa;UO*)ZQv5$kZeN(QoMuWzG_WoDRZA z36vU+p8#{ph@8B&>eYMg9R`EFw0f>fxiDm{Z=g4PTYUFc1~o6yvg3DLFmZ7qtLaG` z1_WOnBXcxh27#m}KBUiLtnHP(bJ-o6qkdEK@nX}mUwS{d?!caOvLh?Cyy7DKIyn{E zklE(q8)KHK{OGWE3C{iOnH}#x>(^^}uhY9*t9SbEP%eTE1b+>oXIm^DFeE{-U3RaB zL_YQgUh!Fa`1jG_tYviD6(liUp`NI`S2`K)!9MOZ1sWu?`Udc?;!JY$)@7FJ;2(I0 z`B1j$VB1mBg#3a6#_gLC>}+e8my>YG z8afTDTwI`QhAs23I5$YJo!%ibbyDd%jbS{N2~^<9?6u1{>kaA1MS?NT7u+kfW^Q}~ z8oJTGT@0s;+Q@n0IpyXckfd5Ad%OR^JFjT1prg#TQnf8$k`qtWEmAf@H^j@W43OU5##u z&nA0+{&4cM3T^4g-7zdTVSKXm1VC439#|NEd$ju@y|TNKa&oh|7-Tx*D074w-eX;Z z?2(r_6D&;_m<;j3p@!d%oBR5g&Gdrx9j3|KZETJQ>}%&{9B};-JYj9sNo z46lxFY@SsMzP1s{*vXOf2)yP1{=)Dd3mY*a` zDquZTbZnXLZRs9#ONjZs! z_-FKe7{kCR1E$Tzx^ue;*n69=7X+RQ=8dborOkS|%u4=8w(sEpSQ&Ji-U9 zKC5EpBN%k5agER1)EpZ&!U20p>|r1!pAo7wUbIlFHXRYVcv(e<=40tn>=HaYiq2zE zEaH6sz;!OoIfZ0Fi!$Y=FI0Y1?m5A!9c~C!vBd*f{+I=KTfD09O7_TY!peXi(qoVD zCnFkH`vt>FJ%8;(gcn@sZEogr*ZWgQ95gnO=YOpi;Srj2%Gqb0u5(GhdSEWN#?041 zAJ`_&PoL1h8Idz|Cb=_C;oZy=V#=-)ufkBP-^yxdP6&{|$qSs6$qT!ItF=YzAGI|V z?Dlc@ZYVxqJj=P4Vbp6@uP9~QLjr7Ho(gsJ^w11Qk7GyTrwRZ1LI=Q~_ftjlSl!FB zMfr&D+?ZnFM4`0P!GPs9m#Q;fKOa8FxVpwe_#d&$q?>>02Dn0|n;>GF?Kh|Q60X7x zq_??|23gm$KW-hx@@Svy4c)gdr$q2~M&#Tlx^t5(k4b}}%d9v{ZsSWJGOCDl(u{F# zX_}r_Zx-P2gbGas5)#SJC{#I5V|S{~KM|(s#^tTO#iq`=b>ZW*B9*}vcx&iSBwrZl0SnqL|i@$Ccn7&2cb7w3~FQ3*gQY5)zq_ z;$pW;=@(FkwtgD3t0#YH9V+*ze4)D5<mNXYZlHHeeuEBcu#Xct zZ}2>ER3&waO(`kfXiFqQY$m-Mn$s=2)5eeAJ=u^Hb3o>f7=R~+Wh7{k%jCdeEr{!} znW9kgC^5-H$atEPiMYzj(!!jbuT3q9TT{;t2(_<9KS4D=@s)$jKv1Ic;IFS68CQj# zuS{a#>=0^J6ORGfE8W>Rozgl*CKFH7qrw9JM>{*zj#FCVW;x4)&Nr~<$FiCrme}5` zCS3Ub+m(u7?A?Uu420z@alLN2qk!_`&-3HAi$kw-#P_O7>XfTwQO9;BUUnv(S^Y3q zTQZ~W%f9p|VitQN8^%8RDCGmzcy<)uoK)#$X}H-Ny`!s<-Nz)1)KT8J-B2OcN-}ULb>%@NAN^99-GC4XI8-%=I^ZOgCwUdM_FuM4v zF1GZ9T*yHzYiMX=Ro~mJXTxwt>guuHI7IO*k~yY$)o31GyWUq%d$lr--+3^|4j=oq z-s*u%xp2TFFtE}CsX#vyAPQi=9Kjy+Y1Y`PuaWSxh50PEdb!qXYj#A{aZsq(J+n9Z zR@2J^t5%uO44Q#^O<66t-KkTRTb5}rqO4>Gn8`mi&i3mZ*J8?iXHib9_146fOo|4b zp@a}7QmpqP8$Q8gg``)YK!l%+^_;|Ub7oq|78}d|HF`a*F9dT2`0pc7)5T<&>zmck ztb$b3*|@(#)AY0Y<63D(7kqZ0;ZIZ)XKTZ~AD8J)CSi1{89vH*6Q|m8WZ1aF(a-b~ z6Z&g}UnM_Bgj4^+Lhu(l^f7oJ{c$tZBicxB{jqBBbd9EHt$Zg|5-ZzwXGYiWwkuD& zM~iwwEQ&Z;3kYpcoiO)(gG@4N0936@w#;gtFg%EKiyS>_ZNDG}3Ge;-uuD<-Un_R!L zvtP_lK*NlDq8yZ+RT>;&h7?lvu2pupa-Q6r8yVPt&@Fsbj1pkEErFmEtW1i&*t$C-t77j7dS`At zCz!Mj@LlxzBeYuv-cL@JanUlRWtqgZXYbA+_~t3|Sxu{jd-|5>U=&LxDL!n*M|;ck zE;_VoXM6AS=p%nmaJ`X<%RuljFYxtKL5fW!GI&y30gc|Psnr^^aYzQ2Wdw4U@dGaD z<$yh&Lg`2ewRY@(TK|^B>PffCRz@)9>MY!!W_rl`^~T0V2YhFX54SBZ2BYrRZ2#ON z%EkzWQXIe`^w6p+fg3Bn?oJbhuF8g@8+68=@Hnt|7LN8bU)8;1Nj@D7(*5tp*464k_bq&-)EzC;j~3H;JY9-g>DpOP6(X6X zkMV#j`)pm@_YpGTc(gTgltZoUKy{1*I!~Ex9HtKS8tOGsHyxC zI@77Sg_N`#4bP6RM%4Cv6XWK}RA_ALBRzjWLAMe9_>9>q^} zk-3|x*`~Jc+fsW&DH)N068TFg3s+ws%Ft&g7?*TI57r@K@tlNx)h08VllI(`jL7St!yyM1pGj^!dmZoUVEPa3=GTmvb{C%UPZM-y z^f=8Pc??z}Ci*G!*e}%O;zy09!t$U!8KF86(@R`p>ewX;v{$YqZd1uf!)fAC-ZTvg)q-`6~CIaPMtIk=v|QXK!Gn$bv(I1@-8y*9Aq`M{-9ka<_UN;*99qN zs>i^xWqE$1!4{Tko6k~+(@}SY^RqW~6gvsd`xd?Pf|?+6E<;_-MqFdRj5Gjr?h^YY znFwVc{pJhGNgAS>c8B0Kc}vTqX%dqiGDW`GyXl=&X7_2B(|}Dz2y%6`(d?r=vnn4m zb0nqQ8c6(ttY3@WsJnL1E_g+jauGOsmR-G|Zc=q=*g%ugrnx2~TP*V}{Uh$?E_1ef zr?W0r)yQz?IB~LBFHvvivtUMD#88YKdr5_w`HyJV`!0>18$BYgHof~jeVenYi|+Q0 z=(CpZB!>KZmiEsPVxRc(s8{IY^JX7l(8aArg5q!V5j^Gr{7a#MuzGYLZSuCk8E{0G zJAuqp9`g#l?Vz5avF@jMVJ+fFyx04QUBM%!EQZY+V=Qp(tcq9TH5L4)v7J9AB)M4x z?Vwr~cP;U;8S`l0!l(F0P5?11@*J_@_i&cpmd(9hsm>3TV`mkbSM37&jP!idC#wR1 zdU+m+x^ls}q0a;DMDqb;uiM)x$fU~$d9sbB-|uZ83<8o?`Oj25hWLL`vQ zcl?W@pdz<&{p%E+ET11H&Ku&}qH4-rYJa74z%1RrL=X7%NKFo{!OMzh(FFN$rMNw!$RB_D2^%eWF{(Gn_Z zIF#p6pUTaD)z-u0Z@e{wnA!x&cjWcegEZzkU*3fXXg`QVVQxzAv$c0P_QN!#{eS!| zdvNert(;qKA{i5NY+p#_J8|ekV;;|=hs(SdZ}M`ZbltrN=$rk>@qa1^K!gl+|0;gS~ zCD$J%u9BzuSLc~hrZvoSs~KPRy4VEEj4af_HOymCM;Z81^%gXUqR|8mVB$%ir!Ybj z#G$Tc7)-cuBE-8P%sLilXo_|d=~WNvsnGYf6&cjLh$@qvQcECeDmAS1j!+w?rHQsYR$*&-F1!T52b!8XC0hLF+jn?7tNnv z;P_R_RDu{eX4+{Iirs$CP~iCHHP>h+;T=|3A8UNq+_flUJDdNK zl`3*&nVX7tD2dFfv&_3Mm*VBsG`Fs*`b*1sHk9TdBO(h2Cd`!VDQ#^o{onX1O6ai= zB{&!4;eCTtN5n8v&ySx2zz2PVskQ9HKZ%o5&{DguK$ZGE;Q8xG-2{(qslZ~0;KGMd zN$#(*E!mdR!IgR$4@1hvQ1S_dOI(OiTJ*;E%BuHv-VH$BpQJd2ck!rGGjbPrbaDPq2QT zaQp!}&og;^7-&)v15qmqON|C!|IwUO8wokNme!MadY-T3Ss;fc?|&@0O=Z=yD=ZtO zRbztd1bL?Lz(Uq&50P-c;Q>9G>TVCA*P^$r^*|n`*?4G@a$BBn#Q-)zH|e#%xc572 za*)BqZaiUa_nu_E{tH#z{WYItQ!uUparacMJZcT);30oQU;#bo^7jKoL@pcMcdO=m z-R{r|91=XpX+yx1J{na7+Kr1D9gLK0E2s~M%ph*OyT3b_(qu3w?zP&bTo)8`2_fdW zbp`0TfM-b#x`68>WY67|YxlgM_S8yjvWmWHKi2~csT{4*i%8_Xt|Xb2P79Xx0k{bS zyCQFXsztxLeYng7E1Z?p^3@7&?wq^%3jCMSNL?&^XX@=|pvvJGbUuvLh^y?>tS+yk z-^r_ZTfg^-6S}<(#9Vsn@4>vB7h8lPJLaQS3HGRw4PP&f?Cl=T=vy3uAP><0+s9(l zcvndhb+&9ro44|tMzvmjaNz`XL{!-41!qex7g( z(dEKQ)#* z4CBy3#+$R&^Ep0XLQ^w`6LUG7kzt*rPj$}rAd&sA+U{I>WI3B)lyyCd2_(nR;o9kO zDfPQUe1j|{&(*#WlbEGEv|#%NDYJGI6_PGHr`WW5?k7;@jGH3H*Ze|P2~0#lpi(Iq zc-;l|ewr-*=T70PnwZt=U8?x|icTXodt3@f@ClI@I;$367aPZav=cV;dyJez$1Z)u z@7cr$6wfMZo$lnERZ^Y4?+|!jk%jnMIft4wmL)7d#RfdGbh@e%sYU&?-p}Y+{e-5n zs3VQ52fUs9)I@K;^tHFsOIy{gu@ZAyb^;brD|~(Hh-egMx_Il~$7MOBB;3ojW~b)W zx^eQ#`36nPcHGp?;)b{}x)QfWDz()j&-}Cwgn6(OO8HaD^r=3K!wz=*cW}MD{@TAZ zE`=R$={O16F1k2ARqSw_y!mzBFm|GAJ7I+VH_* zJX@$Bk9c-QLY9)FZ`FuG4zeG;Q~_7qe4M^BMSfSGNgnoR6A>5EP>{})57wE8GIYe#Xj+YVlB$t_KVBv zAx_38kuIz`}L<#2A;ZTG85B(R2mqfOVAb>_D-Faf3i_9An(rH8NZN zXsCx0uVeFSELLhFUPVhO3A_~YLsc`WYWGawjA(lMHVfJ7FU;=Dgp041;>7(+XGKuEFeEJtG|-B^d4>?i=sg_Za6dT>VKZ+z8ITk^ z<`NUcY!EzSt&C+cosOOHs4JH}&g^2zk?)OB=g=cL_iINK5ZN z2^83fGx8uvuHb(#uW5*P2CGMh)PbtLWn_O&qP+4+hDKeuYwIjI8!a2jcTl>ImY2;E za2A`#y|Mp)xO8Nk()W)M!#7(Zy88fGcBhj)Bi8weSZ)i1n|)>WZ-!{)!TzPA&F$^3 z#sOJtb`I;dR9^rRik-K#ClG!?dfKe+?)hQjfsI^L`teEI?9{>Fr88Z9qF#wdTVUO1 z1uyubwbdzDILuY22GC`Kr8_F6e((xn?7}_h*w#Zuwq&Ku1}2aFoOFpKj2U^4T0hq`i-vXk0&$<3}Y4d7e* zGXLaL^*gFAzg?nQYHWvqR}YW3A?yQhnlcq;STR@6NRf2~(OAPb-Rz*R%AD9d<&w4d zkf8-zl!9E3{|!jD;YVRPxkCbh(si+_pegF#lTLFR_hcGJPpYMP*p*1Ou4=l=`nKuoceEvTN@$*A#bHHsaLMV-*g%)3 z8XdSiURThFh7SM4$>3E1@4~4g_u>+(g`2_?cWVeZp0&!Ryn^0>70Zxg2uz`U(KrHn z*Nf4gd3%7T2-KPdvh10vfU%<0Ti({!)HQD$9FZc<4uPB*^L_Fm*u%)-%{)z4x(p~> zqNhlLS+uSVaZ#rq&eNf4p;t7WviRA|Q z0}~B~e{VOmaMt23grVLqjHwj*sqf7YFlLBGQ7k=p3Gei{T`*cP**gizS`n-}MU#Cf z(Cq+;<#(4sh{Rz}$%p-rtrO&TD9m|+{^M)2LkEI9jC{=+!5`b>$Xka-xWCysMY`M2 zg&Ox%aw0Rm@*y~>{IQ*8iPbg>d{>)=PE7w_tznW5&Bk+(zoTkt2SSV?tY0?Bh;uH# z&i^T~fd3Hb%9fPJEMD*#Kkl+RF3!Ar_`t|$e3+>Mv1mXq|? zmIJRXZBXiSeYTM3+-h18P~*dp0$>Ue^+&8`(5MjnbIa72cx;?On45a9R9DS0w2GPA zC_71bS0j2L>-^v2A!}X;bJGK~BBHjIS#288ix>X~9AGu;LX)e_B5o8upq8fp=`=DY zgr-7qNhBzUDXvpjzzL1EX{n>gmjdU`fzZ(2vbC$ISDz|evPcE|-ok)-7NXF#tnNzA)3Sm}YuFU>2p=v=G|iqE8xQs%rdT^Y0L{E8=duiN?|Eo~>;u1`H+5FnMP<_qPK< zE>Xq+_T5mItk+7^fSb&5aV?Dw;TqQq%eB2Vh_sUdem&YfmN{;vCQEDcxRzhr zG8Y}jpI_+q`(}BxHI3*!2`PB>kkL?Bh>x z&lP*bC;$8ShXzr3zcsA3ixn6o?8cIc<~Ov1-&`m~^7mX0poHx^H2>j`bPtEsotAxy ze=MDHDQZWW&$`7atE(1T$gVGd_`MwkL1sHe2CUpOXo;5rP;WPu1LaE2-3X6;`Vc;~ zPq2GAUj1GV+NV9b71ut=WafXEjNI#olpGik4&u4xW;lqxP>c4u)Oz7M_s{jAh>HyI zBr~j3ghjZPfwtHOpUU07jUS#w*;G^Z{_B(&#f5~u9l6E zc+o3#`f0MO+5XQCCjAQ5^z;+4zqBzIuU*9cY9a}-?0jbE0y77R{LKQoi1%rig8F=3 z|70w+(?%onlH?kb_$YGMJf#9^=h?g30kG7oNsJq{HJ$%HXba`xqRhWMcNwtG6R%pG z0z?R}21G6-F?PR1Q;idb7|S)6n|i((_*^0O`F|4DaU&|eHTawWJNAfc&mM@hTtw*oNbjALgbkH8)c&!v`#Mqm*V4(5l%G zHqsdF!WX7XLj!gNY$=U<1GQ1J-lZ@hB`Mdb3`^%yRym2W6pK(qi74QJ=4r-IB}m6yL@fz@V^bp@0r465%OoUwy-b$d_Yy+ zzS$wDm2>4wBTvEB&4=L!8I*eLx7euJqDwaW(b=T`1r-ASS_!Ky$DXSFUm)%F+`P2{ zRq`E(1Y$4lN~{@@o+Qi8pmQuWmY!_6(tnAAj29o`aBS}3-Ho!C=eiuEwZ*Ge*gTYT z(;8x2Q#ev7DRTy?Jhb_v@LJxGbYrbBxvnzl=qHQkR?m=?E<@XE52zNu&Aj!QF<%Z@ z6&8H;_~+KhH`^4-yQ!Qcy~WVMZd}I3iJ$psUJS-ie}c~^E~H&yI@LfTIy!ZELBDLh zBgRgzzSo8I^V{?U+H#Uk-t+p&^BHxvaPHbRNzujkQ{a|B3Yui#gBpCWP)}%He-X4K z-}rcJ{q#b8lZnqaVl%f!G#mNj`{R0eNa6Mg7Brt!jM>x6=!f$?v>WsI zPFuggk2GqXOp<$#ET57{TmJi@=DVooww{}zKn?GPm{6OI?nABJBS0?z_{wbCYaW*$ z+&el7;%a$oe?il3R55S)T2nC9ax;2-Fi zlfZ$*IJ~zT-Tr)etK6j*NAnHcT8JRTD2OIyrGbj}uNb@*vkMB^+aj`yNfuEYs|`v$ zdYDLj94+zsf^*Q5TBFzMx4(|;8U{j3NggeJ^T2O&bt`=y*8W@#H%C(A&9O*wr zwg@%+B>ewg)qfe^6 z&NbS^OzrOx%Jn`ie+t`{Qc~>y&n{WERfZV7{Bu=#p|5@nM)VKwzw8HkbR=AOG9W*^ z-fuHvu3ejaO-oH#v#nPJm3g4YArU6t3i8>UwyfHxHc2lu%lgoB^Qvwy_Vw&8Z@ruS6jex# zVtx4u*n|h&-kD=+`kmMOs3DU!8OjW?sc4+%6W3V^wH3?F4Y>#LyYZUH0QFiE=$6rg z+dEzPZgfZ22n_rCdrgCCk{YE&nb)~RtG_DX)LezH8HjeJPLv|o^;h>Wtd*i}JNpmTY3ENyws#MF z`XYHgV|V3aP@yqupg%p0UGI7@w|0%BK@K_o&hMDOo+|1uiLV~bp*9Nb22zVAwD5pj znyFcye*pEV=7*a$3SOYz3cCHb#KOEB>A>!bvqP`pdSJ9TUr#Bh+l%|#(fU7csF}L4 z;$6JjL)v;tJ!d1Hu-+!ao6$5Py!#A18+aqi9UR>|CiL;FT3r$STORAG`K7CYLu*2) zLwoOJ`PcS*BJMeu?qC^_>9$;LN%6zpFVKP8!rbHZkx+q2w6LDi!P{|y=?jPifUa?L zR(j2@7~gxP&*y1#J0X8(L(R6(i#$4hYEKCf)G5_H4&S z{PvA~Q}RM9>tCBlcek#1{e_SF3y}NkKZ=sy1OAAQj*YwgwEfsc`FOb7Ki>5MwnUx4 zBSC#$&a;xwx^>fl0&6u{h>seU4C&enaIP~~3g02EG^%)dh>iZ7#s=SCp5h3UIn55i zu1$U`;Nf2^!0M7E%;sdFZRCVlKh9#I*>}JVz3b0eDKS;yFV>4gh<*pX;S9y4W{0LP zn+!oW5Ff7L5TXIuS(@-XXql!pZQG|Vf22G@eP6rJc?#EX#~b8rvO*G6R$-$o3l+a3 z+jCNy&#iLWmh=;SPxfDAE*%eAS-WboHs)P2mJU#=UW*-x^bgYr*}kix6}25IXp+id zhxwcb;eO!$UgnR!dPDcZ(bLJsetNA}A|p@?Z%RbW8$%*};t?*wPPcLV?tw&{=T3{k zbL);Lg~WBog}R+)_lJv+qbo5vciIALNOIFl4_1!yR+?L`J;Jk37$+_6f4*OR0>65e zs-i>HBeyG>(VKriE~bc7wIxUN01Uh{a_dgR`KM0@3vFb)sffrzAAdjy9(K~1V zr)3%>iZQg&Sv@bLnb)LM`5o4`^Z6{n5Y^m@*&qvR9iyFn&( znS7zevt69RExh!)Px5?Rvf&y%PbOj@E5{5N)gsx;Ag;c0%G9+w1DN-2jYV31qIBL? zBxrdqnkkA0kuSc6sI-6Q++O$J1A5{h!Aeb0%S;E#-el`OoAT!`b@|{;#=LFXWVP`8 zuk(QRRyFt-wzpv2M0NstoiEqBwa}}({p!$}0G(IYP(#%et#DxeYV|iyam6+b)v4NG z62W9^r8Rjon8dFb4bL?3Kj=T+pOk2<(0?bDNo|^dF8y0=t7)9}{!Zh$CHUPffvv$` z)78e5CfkVcox$L!W7Xer1~a+&CfI)d1TJ85lKKTs(G0a&dfvPR*yJExhCN~ZdvGvh8{3}4|+dd~IDX1>H_fcCzb zKFrvx{$Q(Rw50SofE_-eM?@r5voEX)GXPa1S0A)xTWXi`ud@u&Vmy})c_NMnC+KE&>?JtL)547YB)4}g5|Y7b{#$+V^3WKtpQ%Au zIP-#aRBHGk!V6>!reDDANxjyt1cX)v=Yf+Nug;SeAHlLuwlB2&oF?8su$;2?Yc*nS{4W0DcOZ1El_%iD#~XPw@=Vw30`V4##M?OS zs)~rsve{xzHMcAXf+D@7`B<@`-cwaW}Yvg8(!YKx_08z_YI*&ez&~7rHe|&GsE$O*hkqV z0T-{CFDsOZw%CcmUQ3&)+aZ5LI;aZhZj^tB@X?3jr6oG_$J=+_OK7P@kKu=MuI#CT zyCh~D$e%$S{tFaW2t>Huu(p2F1>d<4Kjsa-A8DX7#`wn@ z`Bqp?BylzKG2R@n@Wpxm{|gi_Xuh^Yxu!y~)c;)ym>BhKLvvlYi?Vf48!S0fmHSmh zs=o5esh6qnz|^Z<)r>F(iq5bxE#gFV?J<`ehfRM9C)O49WOORF$hPd?*M%5{-v39T zKs+>2$JZ}_!stAel4~)V6U?nZgAmam@$*L@PBmQ@6HGsFBmEy4&t6;hp5)Q%@8-L^ zAFb*faSq&3A{?~u#|HG{;(rQ`SBhLYamL>NHe&R6d;F<@;6epIMb7t-u&iaZ;x{($os}?QClnb~`Vv1^_-X`DS)o@5nqoVs&sJwU)Ij!E} zHpWtv{$qLJEr#7DvUb3wnS%U)tJ*)@fqv@0zcp|RZws2y9krKo&KgSx%`HG3Vh)BT z1Zfu)0WTz>n?r#vLQxDe4fnjE?VHXE-niu0-rdr=HlF#f8!N848gXvQi{reTZv#*I?T4p&0 zzOoq8DABIWL1F${K5wG@6d|cKLru@QeO3D}$iv{ol{dbj6f4eJezNTHcz)Br9D34J zc*M$MgJUhcL$;J;war>ZMDvf)jnFHFoW?IW8{(M%-YCh&xB=bFd(aN@e)gr|*1sr$ z1i#w4YBSm6r2+xMoDOx}U71mX+&ZC&$F@=drKspUk%N?=J43iD8Vx2Cx&D@e$jj2` z&or3kek7@l3y`{ZcL$^IYZ|h!>;Lw`)FqO@YH<0GH*mcKCsCD0_Q#%Y)!*)NzJBMJ z-s^qo)O}`>a?pI5{eUWNA*za&K-`y}>^NU5$`VdKn~xG-p=O66W2+S0?k{ZjO4)sT zu@H5uE#7yk?1R4g(VyacYE(gvz~V%CzAm!+EY&q0!zqiQWc%M}4TE{-OykSjtxef7 zxgUpCj5HeS?aaXg7Y#>VHG~`N zR?F|@G1U*uC1>n`$-uj?agv5QuqK3aow@~>9frWyL`S|EQpW|ZGKX&k-1$uahMe{- z^j*NSmenT8~ouqDu3Z;+$GGc(b;OZ8Oy$x%-lMt={wiAHYaUG%+z0GV-lr zBPYeFdpA4OUN_pswZiyaK?KawH|hd-^q}*N?GeTB!+zDnG91&^?Tzhcj_dRTAFZv-WgDg{ILh z6uPwW^*-u*g-j=@Dngc{KyV$56)`Z%t){=H){^Bz>`Eok1p*nSo`>7?N! z=nlC*`JoWET$u~d4E>+%kEd{Jp)A32Z68I&FaU^Urb~u zlvZ{`Sl|x1bp{7B45~p$m@?ObW4*r$>j-j*t9!%!SvI^x&}bALZy6$uotO z=FJUrIjM04ZDlT!(GvAEl=xyQ_iu%U^2yo@=az>?T;{kU78>hkBW$bk=JK|O+;+Qv z)`a}~+NledJK3m;t!~L-SzUC7uoGgB%2DnZbB86NnVTt`kV9yt(}Eagm*11jAu5*O zNE9CK6OdiVd-kyTme((zO0th*2k7iTd*Qf6*EZA^D?g;4nrH!2CNy@7lA(Wx(}!&# z{kE8gKA_}s>`8gf&&F$t0TTzqvfUa>e6LE;J(_4^U!qStxc50sNaqEL;OTqrm2(8Q z4E-ag^3)S3wRd4Fcn^m=H0Vc{Ne}k+(O7@@QXKPwd4g}3Q-kIYx3b=YI(Y+b&Zye@ zeuc0Jj66kV-&MnQbR(>S>9F0F9QDi|l$tods-eRN#F~;H-~HWJ{E2^>RKi4D9<;=n z){%_SZ~dJUA^22wMA{Xya2YdAjn)~wqM-z*-*nnbL1@qGy2XDSc5;QZPMB;Z4-eAZ z1}H@01@~kVQsz)L@6ENqvQcB4pHFh{lYJz-kg^=A$5n5cjrn9?@^RR%!DxAn zX%g;*&eMvpy{8|`Qc!QMp`6V+9z042n!RqF(`rg zfY4~jwHvo*OO7?o|0sX_dhm9*0hCXZkZC!xk5>DBQm()G{GtzmfLR}y2|v8Y(?$kZ zx*oV{H%%}H|I@M`waH&j^?VaDKU*ip|E^yQ6D)_-|33CVc9*>XK-&t%s)~t3dsWXV zX}S=cZj*rCJ9`?NeBCeZvlYa6Z>CTp*`C)2+?JL8kbHc4%8aTAYdfr=L*2fsn&JK_ zc1-kciiBDLf}y;}0?B|iqF)_%n&=IOLFY$P*#x|apdP}zP#v)Gp{`LOTC1fQpqy2w z4z8L)DewHZ40xyYyBkrcr(r)vzj{X4f1>IrweD78+28-7bSEhdL2D}6$Mn!X44DG( zW1GR#0xGQu<)s?#LSSv80q@~aAN#<-UbFBQ(J!aLBAjH;vdGPHn{apEEti{*ocETu z_z=iWL4HJSjP|)!UUVJdU_B1dNU?*K`ky0c72}7+6a@=6Gxaw88X);r=^n4VkIFcZ zk2`7CBfF*toqWZwep_8FjO}c~b(hVyCoIQy-bLQ}R|Ms=-@RUeKVDMbXRh$ZEi+(4 z`*mk%!OX%9H)nc}Q>gAE{)6z|qCCr?t_qar;g?z9nGMs(Ns0Zi$`$$x0h#F4YFY_b zpT5B~7>YjV|Jj{sDR8C=uMu?zQl3qNW2+Xx$NjdE7Fkt@Ko(FZXpQx`9|`TQZh1pE z=xp8E`hUR)q{iqyju<`p3qax+@3oV0W0mkiv+A=L;Xi)=M~MDSXxI_z!oL}X%uGG( zkg9#m8(LPkVKxfvN`7v$_ZRDiBdO)lT`b4BcfC_5;KE?NxGBgU>Io*O!%jq&(9;o&2*PUz|N7KDn>? zWDnv`;Lujo9l^Bq^2d4Y#Q|NN5KS&EYTnWy+5AQeCOVlI=FO%y4ppwv;8hPE6Rjn= zkFkSD>t2D`R>uN;T~BisdOG0RJ(SJ-`Jw08kN{cEr)2}zgOIaH_D5mLGp=%!Dw@Dt z;;*h#^%}a?-q`$rLsKum=^ObX{h?2Lz#m@H4%WlI=iFV0{Zd^nptnAzWLKEkBdoFgr$<=9`TOdr(UFLioW~29)`TM3}5(CFP zpPxN;@>oH8!t|H-np$47%47pt!Hn?df`m3G5hYW_*a*zH+iQfL%zw#sWJ-lnOv*B z29nlDYr@5i;Oa7jhEM>$YrPLro=iFE?zHf(9+mI!@D2y{u$&z27|w{iu=b<;sF$D$ z(R_zPc~6clwtFgs;Li;hLs*q2+JnOPq!)GjBi|>sPSM`y9jqq%r=X5+rd&y>7;uCK zu6ZnP`Kr^Wz8QO1-rnZ3GpM2a=cLd#;fuX>)MaV@U4bvh)kZiPz#tFg=^Nc0Y0CKC zAA8kUT)@W7t^u3LhoSmBylwLZxnpbB0Re+iN7l(=^bvhMeQE01ow?dQ4lOFLMv%)G z0{c57wB$MRsfm?b`^R~dAbTuuskHB~0-t=TQgiRlj4tBHz-xYR(>`~Hy_s_PzYsE5 zm3zAzrXhdegQ^(POBO6^K_nkw9 z>!jjLzQpG5uDn09=25Q^byv>XBr^JBpy!)YB@rx1 zm#!O8J~NRsFBDrpnh2bU>*6LGt!k@(2zP+OXs^d#@6u|4oBAMavE&n}#w(|!HD*$8 zLRaT<>Y2s*YJ1Pp#Hp*N08m<}h*K773ant8i#lTDttrMyyC2d29B&;ULr+?l*OXzb zFhQwl&RCBjTl>(};mJ)4%n_&%6~HYI?L#juX|U4l0Z*iP(WLG<%^`ha#H%BySB!cg zp8^!UNWDLFnuXto6QWcgK?`eY3I0P&U>DB-aS$3AGdU|52Iu3~e(_Zrj~2sN7ws>h z-e@M`=FKFhjl&gZB)!3Q?6=)1RuWa!Si|a*vzT=8lR3%9xE-6e9@gm*eA-)J9G&P?DvrGvvpCJQemSbnAY-g zg7#d09aO(X&Ujnww&mrx>o8=~*GjQxsyr=uO_w{4X{`1sjJjkH+ z;o_@LTuz8@a`eI*T=>PYFXe4P8Q~Lku{QVsp#mNZ4wZsgLnirptR}Zq&V*Fhj+rXgo1)Y){8kvTT(6NpyE7(YVE5(x+(kF z96}rinxdZw&nf7L8{SLqVID@O^?+xR-aYnZe%9Pr%T{n{bXR2GwzP9w5B;{8+13w$(P+i|Et$mU+MeIqi9s^<3* ztG2;Za7d9D&~{{3&PRt92IMV@2Y%Lv8moyoW75i}!Kt3zdVPo8lbV%E<}=2ATBlG) zyHO6s5rVktJQ_MQSIaG0LMtlC4vVNOx+YN!r=R8GOZ5s;QuGGMauYoN7#6{zuZR2D z|1clz@YEk>IxH9nA<2?=JA)4;y2Rl1qPSW_wr9#^#x1j)BbC=eW@(A1@KQ0<=JJ+K z*h7FD(kunJ{~2y&V>T;yzBn{HoT}+hu2$Ani^hu#C8dJ!LW;=1rDQd9%t%0`I1fz& z4OAlABvW4ooT?f&pd9au+@Ga^rhaI=$)pxOgMAbL$p#qhl@7`~LxaU`AN`uYRv}LJ zR+Git4FOjPv;2;Cua*;Q%RUWR8{f~9suQcNt`?)qwUcxxNVhy$?3ICxoKvYOo>M}X z%>&bH))#vEpe+>k@e%tgRj*QbnL-^^MlKR#&i|iZ}CTXE0H1`-g!7| z$Ooa5w3;kCQ?u!{jP7shko?n@R~{j$;;thYD{B85D{4nTwtCgJL}&GnXLuf;z~I8k zaFSZYOoaz-Ec^K>S#SR0qqUO$i0h9{m*jazFSb#Y>RY*36ocb;vS0d-(|)H2;men` zi+>RkV8+L%u8f5*1ul>7WbQ=^`=6mi%~j~iYu~QrC3N7KxaK9-o+WTbO)w{K_x@K+ z!EoQT7g>K_SQwaem@TRp`cW%zthTNkT>zHX1J|Yj0$+bj{X?=e=`Y*1+CC{7_dg0T zk~bJ~lgdmvVYawp(9DCQ7z+Mtf(1h)xUL>`^@SY>2A5VzG;%-6OZ`?{=`ZN}Q>>;8 z)#yIX=B+YF2WN017VezupUe98LPWEu7XfDxxdy01Ms}##i_drSTHbF+! zFfJ=8G#W7*baY*n;E}mzo7AQKdpN${&@@ca4!N*en1YE9xCjo=P9WCC=x;XamfCI< zaqtXa-R9VvV%r@599*?|AHWT#&?Z2$k7(R)A~f20E6pcAhZIz}rUPbt^5YfduDz^x zRlA)faKYYog?L#jZPu=^sV70m{hgBio8f)pSRW@scT4mq%H&SkEwj}r))syn8#Dr< z`cCq@4L-939_JOPfNwb+fVZu@*@L5%PKtq7cP?%T2Sx`k5p6@K@`+Noa15-Omtkt` zNd)?LV1AsxOPIh&lKhU!*fFp8|Bl2>?LbB*)?XMr$t&r6jotw_M~&8)YK058*ZB1x zq_#swG+O5V8CBgb>c@Eangc<>h8cd1R*Qbg8jHr(^t6N}s6mkKc4=Rsj~P zuO#7O1)W%IVEb(EK_Ke8WYV{mtT|=XZw5w8Ih0jLfoVhG6w=%?MZzj-rhp9Tf#FEs4Ok&d|6=kop1sr5 zBJrM%;loU}dYj!AkbSL&a1&aU0zFXpH*c7hqO2Jkc9>C!p@mZ=2;XWx;^UGt=uvr^-0oKoKZIGzl772e%kd18XW=fe^6Vw<~q5+y%V$YlQiZ zUN{tT%+Rc!<1hG3jv>)%X$^T*E`O;h?GUQ1ACvK>-xogJ8*G0znzU((2!~#l0MjT- z%D+6aH$Pdsz!=rB1`k4R$z`c2KOkqDt|%j3t#$gq2G{;@5Y(@)s*Bt-NJC9$1|09f z3ne2_XUGEy`gIh?@U^R?RSUq}`?Gw9l?wdaj}!d2z)fKiDRb^Tt`xIgJ9}4S1F&-K zO$s-K;Qt`%%U0;62cIUi2ew4bBiG3lL0#ukW0FnzA{3!lUmju|LUwC`YeqIlbPQ(z zU0x3BZz|!$7+xs$hJqOfqHER?Nk*&R{%`@vdGU}MdE+Oz9fz$xJsIK~&CgB>GK+i? zt-qfxtH4<|P`f{&_)6Bx@>8)$E=gVMnNxrkRy(BKnyh$wx&xvP@Jmrm4S%E@43j~6 zsp14c?yU*${1?V-prw2mPIkb_W=CjplEd$Bw7}U^!q~H5oR1Yf`4^B^!-Cn!=g!!Y zh15{&!~WIh5j!Higu@+>SM3%Tw0h37{aIH&D`JJ8CLc`wk*GpB`z(F=Po^P8f~!$i zJ(UVlF1)5KJ3o(9$b@jG@C|1UtuOe$wlqaTU*AbKZ@Qb!g>W_|lW5q1gjkYb{p6hb zIjytih^&~SLh{io0&|9UCX0E%PFLMFx3=?+?|pF-3j>>@9;Q>@OxM3?e|n@li`fz= z?}8`yl>8I1`pt8t;qx92YT5C$5ynIa`EUc5?AB6!@K_T!zV+ic?TePDcjGNXwCwN7 zp4Z3YM*Y9Sx#6adWcT==gLYhl@O?@8h(&QH^3EtmiLO+~wtNtNh@I2NUu`ibS!P8t ztwg#cps=OG;Xi`8J7J3{J^L+KP{^s%)_LxsG+$V?i?0a3%_TW$EHq~FpFP;8TTfTT zdd7SBvKiG@o0L-q5u0^6A_@T|nQ@tXEytz($GhugOrfq`2V>T?@FVb1yOo*|nH!1& zeso8~n|veynFlq9?6`*AkW7Zpm0l2OY!q2cm$y{T`MfI36!H;VDA$(=QV@(HWoiaw82VBR9sy9=f6&Fg4rWQ~{N<+kOfi*6O z)^V^A;M->EJ!s!0q2SFw719JU;-&*KGm=bX*h*VJUE7o%dZj#$5OSk_}$tqP`UtAgr0V2jK&D0167sWTM7adgR)>070uHvwiGR>s5vww_OEZ#UJyr5 z4Kj%hXZSFjZB2_XKVIgGn*{g4gVr8$IQh^z#hur*j&Y0V1COZH?OPE)3X?x8TEK%^ z!e)nm_#NHdh{55)s-t>*CZ#8Pn8x9Ld+T3T70nIdVcm(RGLVyedLBao*@hNY>jvzz zXnE4GQ4(j}f#JyTRfOC;n97+%sYPs~>?5};mg|=zISh^iWH)5yQg0M=9c1((VGlt5L$Si zfR(i}Q(8mY&s*ol%i>qVqojS$Zoj}2R-YB3dmKG4tLy*S^Nhx}t)b(XHtdT`@Zs0T)*< zO+eXf4=@1yja0|8dpCABvVd-1UOrZv?(mQ5ESg0~pp2fqg6&QOcRAQ2Z^*Ulhan!< zCAN}NEnAJK=U$%YSVJ0`^JW~}aBt9d6qLj}w_KjQv(oI4TX4Fy!p2bZ4^__?v1d}j zVu=PGN2;!+F-Z9BBeG%i55GOt?LL++=4^kV^GyI!Lm_=eQ{s6j57 zX`p^g@LbMR)k;_$8s@znFXH)iUCW8MMnxt?4f#*pQ@8==zA6#PDiSe9rI@trWA;zo znj6#!#NRxfu_Pg-W-Da^?wACmsJt#T@jX*a)DWdzu`8?u*1EDte)6ToKVav`gl6f!EO2D zFPUAkADq0dstw(^{mj|~?b9d}(dIv3o1Z2-U;rtIntf-Nw-FMlg0#uZIj0H_-s?@P z)-oNMtI~E-uBVtO%}R5knIiPjOV*Rn0ZHX8LvQC$v-E2ys3Wa&%<~cUVNf$)+`z8^ zZMQ??c4<@7(e9jELd5@SAnzWfW1E8Cex4XbzQ2)E-^JZYXx_J06auI9S)%Jw$ z3+g2jcmHMv|KeH-nrn9Y)nTSQq-B2tCLfT+wkvkaWyj&WWvA^4rgbQHb&5Ua%>2d) zzEkCklYZVk4T^C((_FC<5QdEv2sopIx(0d*@oyC$yO=33=H}W9uPPHLFHB=E<(0A; ztQirUe}4%$i$i_dm!Q>z%>ipSc6U>BG)-da)G_yk(L%W81!P0M2c$ZYcHw^M zLf+3QdSvgdRQ^dwWUj0YqphK9=Fk^s!oh0TJKpxH7K(jZYxIVf6FcjdgfnaR#7(D- zwX-Ff_5UN`EH7^^K%a3SP`TzdvjT}KEk9f5fr(I2X+r8Kk&t3WK73Qn(%2g+q(|cC z)NUTFlsq(7D1o^@Tq&aHLKne!GvK9|iG~eT$P1&1j$z@M^$Qx!Ln#5;k^jc@^1hCA zW^D?*vF8?F=HtwctAT}V*V zX{%go9H@Y=oda~?RqdJAy#RE1)%!#Ie?Y;&;>bR>bpm(iQ?7P#+iT~^~t9x;uSzIzJK_G|c05e(C3$4;h-lBTB2CPWN7R z3k(H+u>B;N^YBsk1tHVW3-j*>rP}pN{m;yoDkQ1UI2W&(I3N_M9n>Uzt_a=m~4eB3dZV7cK?nwmg1xGGxeFf#H=)2o@ZT+n% zHGnlT{HR%wFd4FaVp8!Ijsye33<0j|x7SCwHH+rJUyg@EumML(-q5jP;| zr-w~$u%50UgByJk0o4<9$n(wIa7_&!l?Qm;UufFFoHy zurVd8vLE+b6mFqP_T~YlKUEFtj|4j8l$oG>XNn0&hd#0ZGag6h>$V!~o;?&^Lq-V( zxjr1d2#ysm_pcXU?s}zM6)C8si$Bpj9^OdYe7o&3hRDmn3BwqxmyVD7>0) z!vOk6M&oex5tOhV)cxfu+C^pxCc>NPNFaVRl4M`}{?{^|z54G1@aIvwlW8={B=}sa zy&zHJ8cI>h%t_OYDYWxy#v;>5*)KUDRaJqK>;KL*{lY5<%GdisZKrKznO~n%R^UWY z(j(=YKMPyhCS1-Zdn}D~)!fV5I9Xh2wkep1I-FM1mqu4WzXNN3JR!Z0+3z;*t7oZf z-4L58Wq(*LX`^U6<~#(uSFZa^qyq#QkfDp!gCp9)f+g>dDhIpBxL;My$Bzy;I#KNR zVn{-{__;J1^qbSpJg{mn-}NBS=6XiN%w6yim+vKAH&y(ws@W<5W9m=LMgyH%fpR)B zh{v0qh_Nh%(&|9ce6uhm79ucmcIDoDptvg6ewBRi4{hO`)E7f0EJZ89Wu)uEx`_eD zNf}AyJu|#M7ihInVa93@TrrDEJ++-^eLOWoZvX);<&D5*^17qJ8!r0$(%Xh)Z`~9? zZ+c{3I9Bx!(c!}Y<+E!>0}spm655Cu&SJY2M7dD2b+r~Von|ZGf-VB+=x)_kjM?O> zT^wDkWBAgIyk5`U1sg^yEG%MWqaj2dbT36Bq*|2TmPMjMf^U*r-#?W4hO<6zusRj> zfB1S6wF|G`>Z7hm|Ub)KJ-?`VB>3I(XW zu?_NU@wHTtR)xLFK(?{OTUnRbA><)4GR9ymH_rgy-Y-g_h#*9j2<7X&hYe5atFYhf zR%xEgwJYsBu6eQ%x(mMus1ly&s36V1uoW%xCie4*GYxP66dE_s{|0F7qbuGuSdyX z8&dvBxEq0Ro;;zLG%7SuiO4bYW&vFwKLx;I8_D(>K5*)3wWtKKrU>B2?6s_mIER1B zm6zlEkST&dL=i+}sAJQbngO&0U&Vg;#kr#Fq|8VTzRHBl`GkNl`Di3^zr<*1tTEz3 zg03ILyhpT`XW%{pLbrQ~N6Ni1>t*Wg_>bVb7R{6uBO(eB;$)Ge_htoql*cBsvMi5T zYpaNHxqC{m7MPug2CV%e@O(bWF2}ANH<(YGg5<7-%oQTc-4IviEv#{{&zePTz~ zxh7!PsB7n?mpd{+I4M|BL4{WLD5(09PWPFJl2A(2?Q%<%FPqn~CNnSYfD%sAk`29N z6WAZ5byKspJLh!M=l;s1{e|_{AWS~W3z|NVMUHGwK;7#Ks%RufU{-e+HkLsEp9-Vr z2CzR0CRW=n&PI<(Ho`)eb06$6)IQ^2DY)D%yg~!OI zs_@>B3D6v5ByOpT@{9h%rLFFjDen|qrqr4VA9Xju!pCUfV?0z|pIOvvC7$*sL7!Tx z3`9)>pH1Xb*U;ftKgS)*^8Cb3_W>$K>5#0X1 z%{6-bHuemdgRY zoO}_n*B7Ug2gD_ncq)|R)WUp5iL{h(z;(_g4-M(voh8$-wurqYTgk+ zpyHIONcv{w(V(nKYfVrPWzjXXvO*8cY0&fn!4?vUe@MC;>&s9UMchPw4#_BV@$$@u zMKOcRyJn?Q%RfGEI9x!gEF^Zi!jb7Tz!d1NmCok4d%!yLlY{PcUc*rcO6Hlw%^v@v zViQZ^qOS!>L6|x!Y`A58=E&K(#Fzsa3Vq%6KTCX72z}uTQ&!SsxV<5SyW>tk{q*UB zqE-c|f~qD{dI7f^WQtezYu}|duGU)%iy!QAcSaiwcBZe8`-aP>c-Y_r#@rJUV}}KR zn0A9Z)`YSIRdVx@;nD!Xx18~d;JeHd{98p5&sUP;s>=XpE08Jtv-Q)|Ugj1-c{L!P zFu~PFtnz*&SdzZ)QJn02Z2r}F$q@VMvS0mh=R>7|umC45|!>lTEA)o=kz2z6?chbBoO_kyR;eRm?&BIj6+3bOY^GeD<7 zE*?Ona%!KcD(LYp`jj|zg?R26GW^VHxdDCWn=ka}o)0FNXHP!*j@^lrGL3V~R$KM> z-R8LYV`)sEsCY`gyyl;zyhGC$5(1FspOazuaek2w+Gf6A(h$mj>_&;sp7M}I&xqGp z%>N^vQ`;`8pq9}I$K6edn>)rlADR@>0vkx>%_*n)Yk+38JgM!R8JE<{IpppqCTGpj zxlNaDzhxL2({E_uT1~bpa~`2G|4gavKw!VYL@Lv%Cywto^(}2*pe5QG12QkL`Bjwn z!=xNBCR}n(8_MeTE%Fp)y4@~4;bb%{BjRKpekIoJ6O&MC~Bf+gnT@aFR;{!US#w6<9y1^aW(|$?6m{CD(775j_Q^I$f zk#^K2Q9)cvL_BmOJMXkU7fhF7d;&p#cm@&A*r13-q(X_oponFkPl=02No_xA!dmb^vAqgYHWO(Fk6kfh6LBU7tVvslb(mKW0 zob9A#`G4rd2c!m)3JAyMpsb!FR0Y@C#5kQY+=v#)%02ykp}vQaepa( z%26-49fkV2`8?PtvG!$=xD*3d8{@s2J)l>*UZ9-5|6GNAgFWx%Bo?kjBV(} z_8uo?1Z!T0Bu5HNS*F1hhad>^6hgh#XdmWf3^oQwBwT=&TzI?(%yib%;22}|y>9Eq zld>ewq-n+3JaPUod;pef+CRy@a;|Un54ym7vZTA-Rm_-II8&%q=;;=#3#6@!(y{8Lv zIW-siA2~_8-H-S2Goy`LZ8bIt4J$kWw+~AJoyiIg<>vv6XmYz+(?Sj_3%b|$7c&vJ zhYFvD$>gwf)w9jD2XOoiqKGy)(SIt4f1cHYLj||7-mRUAKYB>%sELzLZQzQodPZ*v zf#`@SkA%L+N&hCAw4@i@uLhxVyFRG9-&!Q$=0@Ty4Iq;aweC!YGX43})BeDeX=hmm}SOh%c=({D4pg2wAn@AnrXP#wrH z)Oy}I9sMZV$WUh2#eBoz#A5z|T24zm=ybWmA=W<4kErjWYw1ng04H{Oo~B<)p*+pY ztYm3i1m_r!sXNGOxXo0CA-g{$Y(73#G%lDjY<6&j*n{ zG?p%zv0i$1KS!O6Fx(>RUvOj>MqqLRIe7>b!hAo0-!I|!i1>05W`Q@0(~HyUmt4#g zhZW$--`GDNpmwWt)EBKEGacWq&4{IqoF?orw4yi!YJ(tc)F>$Ymb494>C>Z8l30BfOH{T`!F z{FRB+v0PK2SW{CorPo}icFE08L*wQ>`P}l7|8Jr6lSP>CO02=pmn8V+rbzSfmgATF zPrgj4dQl2M%E3fx3t~!g1q@_sV#D`TNRZa>d14c8w>|#{UPxY>mTNj>+Y-kb_kP*N^rE+aa)Z=OP+tx)*#mzBpRXN! zX}aTcCKxz%0LD0THYmY(_0M*^v?3O_ReQf-Sqn7=XsvQW9eIy|2)>v zCWV!&ZM?<_7z2;*zwiLa*?N$j!w-vdm18(}Xl1J>n4Fas(_)N+<8D4SMq~c;4Ku#O=8G)k9QHTz!BGbp%I&{q{!3UPRDs zOrHIo;NFu@A=OS$8*(>5ghUHgbfl9EKbImpM|XV0?dU3ZdZ4qVP3nXXjGQ*OYL0e@ z$X-2R-`HOr;3{r=A)mNCOpERfaf&>sP4y7I#iY)?^r+pbObaYFG&JF>+GJ@#bobju zlxcwlF*|USH+9>oUwk*&MoR)nrp1)!kD7g_T~VQN%u-$g+=Xl#&JcfK#BS{D?cvdK z8YYQAzGD1$Pkq42Q9MQLAr`!GV@cc_;fnV5*oq4v$(HH+&N|HDc{g3DPtv9C0_T=* zrv>*;qKnP`Hujc!!b=k<-Y`KVXZ`bz z+(Uw?=LIl=VaeN6_<36fv)5jf{C}&vBPYoF;D4|qXT=K6w{I(?8%L8HIaTFTt01$? z;El+LNj$~c9&+&^5LC3qE%QuWR%}2(QMIFG(;ByybsH8JCn3S|j12vzI%RI<=8PTK zEH`SY2X9!|$T#&(TK#s))A2V+|Ah)`E&m=xuv*7U@nzlaEy4B*IJoa=!$fjIV|Er)=)W&E{L8nG!ii>0I-=iYvN|0d%VD0M+JTg()E zS%*HFjj~iX|IT0Xf1idllP_2A)ha*yA8Rh^Y<1t}e(2mFBii^4nHXo9j>LP;0^%99 zw%M(k>bWhcSpz-sn z-+Xko-tfd6=NCWk9(;z?XD(1BHjnE^EEgol*@e?KKwpU|l77S?twsI$RK@<=P*%zL zwy(dRNR@1lJCwRLrotW~rjW-o@#o9*^TUXDl3*<(yst@wOvzl? zO;J*L3H0Ak#m+bN&X;o-c(=-VCtpRwuv`=%-~C4HJ&FjK+fOKr;|(eJi3+g#y0|CF zlNp;AMKamq-9MKArmvPvs(Am^d=C`|GUiJ!81Yc*SaeCPcwgfm&cIAAx0r1`rI))} z)6?a`tkhqrD-}L9)xWx0`Q7?kWxbS9Z8W)@RHz&0A|IXYG9p(~nK`l{;(c&b^~H{l ztZt$u%agXCL|^eQX`akZa+KP*+pQRBQ*~@J8q#b);8dK`A9+(h!kqg6WYSaH2gK){ za`ol8fmp9rRn4;N7rXOGQBq@D4O+M=AO(Ogng0BPomgF*_x*3}ha93KazrSUf#8^P zy73MYU(%lBd6@CwwhjWjZj;q^HMMr*(9pDV;+4r~QjhoP>4IMPUW$SQ4{U2mtR>?q zHw1ry%)dM_ncf)=aXQ)8q{r42VR=h?G1jxuHGlf`Hs6Fsc&S#jo02-q?I-eUb;#Pz@kp&4-N;Fz2Thc7(hSo!n zblS|T)IglkRd)U_FxCT#o*n6W_-_6sXCE)?rnTX_HTSHqKD{OBEkmfv^M%kqx}6ih z!>Flr#N&2!&lW^HhzXtC$Dgwe-zl^I>1Ca@`uFcP8J7`G&W5>tP+E3{$i&dUbpfvv zV8woWMN@L^oKGXABT;&&LF54g&wE99NM+icR8d4>ho~{YvXoYrlWn&sk>&_5j+&vL zA^K?}{sP(sO6QQ&qrfD(eR!CyPgiUXmv4W+bgchhPgWgLrghdh2K7&L%6P-mD?Kei zlr!nPjMoA054osHh58DHV*5FS|Ecu6W`@74_D&gI+nnkmmbvcpt4bmH*)E>5ouS** zYpnbB5G>kFEHUEfhudd;oHN~I#BxVJ%gBsa6oICu3kZ>f1QNNFh4Eui<@2YN|wNYjCoSp73l+Y5b%Vh^1h)sQmu+<6C|7b6tg zYOqB*GW9xH)X(aF(iQjkxW3j5%8vvo+gkG;|AUC6m#j)z{lH|kUj-*!yYtu6i;STZ z?xu;VEHyVkG>|_E(Q`sa?NmdB2QbG_F_H7PWbsB+sbhfwzl&!^?1*YdW#5R1BPgKi8Cp3@2T~lYllH77%nrT3p0wb9gt;!dILE*4r^H{9EW&F?nXu{_7;=&8l0Hp) zs-rvWzuAidafhH;ZP_Rf#d$8m>9L_~z(HiIohqjRh>*+0A8O3KxFxsrPL1yueIC>w zdFp>Y=R&wiv~5b~Bil~P0JtHd50|Dqe1~TA#OU&i?7KM#Z<&Lst%L~F+gl<1-i6ux zQ=ov6?aqQs2g=aqdGp5Xm^eu#`DR6rxPa8eVlC%XfA)vuM3}*S(mN}U-eRdgqQ6WY z_|ni}h`l$o;ZS+TjKb|OW1P~wotwkH3{GNKt|e9x=KgZMQzD8W+fe@@hN{2Bm6K>< zWtXi>+X~qdbMGZoWMM<=OH$sh#v!Rrb90)yRC=5TWW(9I!;PV-?Tr^_>pzoR`*O!JZSg4>pZ5Wk~+1WBI}^)Ir-$Z;-f%eS0yFNNQU*+X}X7|znEmjs+liC zOu_A-(c=pLrs?3I5~)&#aMYur?gI!0Mr^3-e1O~F5;{rpjW~rlFHZV&b=AL6H-K}j zJ=@G7bpB7Ucjy}@d*la_b9inJ5HP3!5R)`2t*rmsO^uK1W*|2C7VTa_N=%8#TiI~$ z>5L?cDFP&yP!%g_Xw^F<ss5gK?TM=8DF{RQbx{RypN-X^(9{Z}=? zmo#+4Fg7J=#dvdisQ4fFZ2IMkn1ID6c0=3VvXz&K)8e0^dyRhnn=zaFxxY8|RS81! zn|ZS6XN0T_BH}YbD)P-cTon%v2YcBcsd9ImZ{XEldR_s)ylS1N3jux&2FE!zt^t`_ z`}v+tV+|ndl{oOFAglFDI#-H9c9BF{dh*KHvAQlO*RG*pODFB ziIR#QawO=ysNov)H)hAFP#x0HZQ(n~Tzka`mXmmB5%ED${s_s4N6LuYj42sSEI^p! zPUHReeJxT0(?3u;?$>XO{hI*D0s2c-e5t()!eu@f`Dxm^kas7miNKBK$~jUG@L^BQ z%|z6uYlhcH-o@A}lbQM+7Y6T|5|43XUPAEO@W60?&2xhYxk-gEn~=;^siJV(sTGdC$tW zhfm{-kiS;mc9!9mrMVS zqJe#Yx0Ktn{)7v(dHJV>V0-n{h9~*~Yu~;0KG+&R_%yL|z#gHpal=QPLp1Lw#u9es z%&A0^p#TS`sBC5&L|z0(92u4Y?%pArRl}2GA{x;U=x<05bAAe=VoLVrYVb90w?xBR zCr3xM7Nk&@=Z%hTmJ|ysM|vao8_gamrku*Vy|Uxrt-j0@`nwA=>kCjKIgH0~kRjcF z5f9G?!mxAA0zp# z6|mKN?~`}NhPXO>v4nT0y%gb;d|S2RPK2tOnj->;yK?kdk}Vioa7OGmlGktk{*X|7 zo%GN`AFc0G87RZ(q=w>Jxg$3-658*4Q+;T@u^w29-9XA|pQskH2u`bkmqP zLs69rNTwtJL1==pLwZl@$*F)V7&hrul0r6{<#XLYi~A!GkCiHn_tBK{irvNzJR2dvRT?sW1WnGF zTjNedw5jYAh$0R`IvcQ20fr*MVo9F>qBZVxaGc&o9v-o@Xiaq)gnUPV{-IvAv-?0f z0k*|E??yu!b=k!Pu^h&kjliG3F%I6O8YR$sO~g0bdvZ?XgzfI*(xsf|N3Cr+NuT)6 z9u&&xho_5hqPgos$`7tvk^ko4zcCZfunRz_w`iC-`n`#|xgx*HT`&ZUQr9+(YYvuS z@aVP1IwJG6>QJm5(Xg~dBI808Vw1nShZmw)8>X*qbBM zf7W_3Z)^n2gef+8U+BNyXG68Ln|6!#c4hRBXL?4d)YdxXIpJ~55TDNgXf^!)3J5;E z=yh1?TG?yK@M)E9Y*mv%wdwLpjCYd}qk%BnS^Pjv3P9Hnvx2;)1bwT|WyekS;u>R} zOWckLnBQ!Eu0~6??KS$Xg9h=Dp^+x^x#r8V-m+oc@7FK&C{8`g;#TOOjk?ZniS;%< zo4>D?Ht*^)DHAyqD`w)#RW3hXwuQ-D~w*KC%zaB28urUy`#76VGEELz)tll|sJ?Iy#GQ$IGa2 z#fbVm^!iduIftOXLW?j5uU@7C+nEJq`0I?k?A5tEggPqZc^}S%r?uYCtY3}n3tDVy ztY5+>malA0i&HQ91}}xk+4X&)a(Sq8Y+ip*kFK+|(9@H?*W;&+^Wl+IdfLR9pR2wf zwL3`_jLoxDF+kqY>Yft!L@)RxYiqHGY7eRVIP^E3xh12}V|s!{0Ew_b#y@pkZ7A5?HZ6{k%oX=g+TJ04u`$WUTI<}9Ax@z!eZ=R@}47C=#Yn9uG>WovzlTl7c6y+cvKoMy3>OOA` zHc>jCpdHOp+GrVG#VW_^I^k5q;Sq(Qja#LQz9m>n!w_KlEP_-)IfIl3sB#V0C`1HO zVhG@j|IBA88OcQCTy~t#rQBG8l3$i=#5rJa>rCU7cj8|Svt||dT4zi7_VZHT^F-z> zGy6dWs#iImnqRtUZ0dq84Li#S4)4hA@+1Rrc73$rDvc%8A&!#Lip0CBsfx>0$S%F84tt2W)>A)A);D zdB*DM^&6P5#Tk}=A1Z(v*f;UOIgPp;QqKk0MQ2bejY90Y2;Fq0I@ovxA=I{sYK;B4 z%6-Au4c)xHxeDcc;5J)>f1fhlCLhH}{Y02P@Zi{t8(~Y!%p$QU94=ev}=)9hNU^N?XTknPc_q=edU}cR5``$U}8zw^;~e z6L{$~Z0&HF~) zN&-cyP4C*KA2dX}cR5WREN)V7^>>#AIpYy5$>J#c^t->2OFuAr+h4#DWzJas8!S-mYHk^oyRyB$#ej#U zW-8II(&>ia${WN#hO)Z*m&2r->Cc;Q% zUr%dN(_SsU@=Vvi&r>F@jwx;>VX!K)u@YkyTNecr2Vs7Ul{0;Yb&UXsE@>CpQr*Pw z;Rf4>diaQwA;i@PcKEk{O<&fE(>>~nZ_jx&=Wa}sn>*4Qqg8R39F^d2sqYn8Q;eaR|2cK&jqG`aK$2f@1p@OQU!8WhPg4;x@A~it?B>MX^bZ_M>g0mnCJIa@NvG8by5dy_T_;u`Vp23 zUi`c{^Fy{h**4ryZAF5pxjI{`w((yiBr}}%t!98uv$E_lUn|i%2Si{3sgj431A3u{ zAxF2BPd=kKYtTef&Z8f(&&G^{K%q-k7+WkwlKybzR(y`;gGKZC4}@K6DLSB&eZ)|! zTzP7Fy<;`(Gv4sFLf%H=AJx|jVfzE0dMjRfj2uY^ESQbxvHg5I%#gTn8ecoAZ$_8ACs{TOl`*FpenCE0 zQP%d}Y(DYDCSEp9@4H*v_+oOgw9$J_;9tpSUnQ1Lp0zc#c6u;hA<)nbIf~}}W*{Hc z*fwGAQ-|@N`Sf^lbAPX@`D42(+3t?<;zRX{n|#j!P-r0U@SxSD=6pILo4 zJU3YEj*71OPjlGrOsT^tmwo(a*t-9@`fw$`c5zB+_@qu{z`K2yjz9YgxJA>&x)Xpr zD_`NE@CEERVaz-6DNfRjx@Zj<%ak3AE73c-ae@-{{RXL9U;AMAHeE(7|LUnyC!AiW zc~5M1iUD)22F|P7!UBXO5-hA6&ftoDp7ZEdDU19)es!m%XMO&_J3`xCGx_O4aE0f4 z!H7NX2iLP9d>o$oju!HD8Z(6upho=5$L3FW8P*YUhCm&^%w)0X$Y;iMs}x#8>^OY; z?|lQ3{z*0|xm-qIPK6MR_1%R(bxb(ad>Lh7YY$LUDOKYO=M}5F(1fs{eA$$_sj>)$ zbYz1`cESWCY(hk%??|sP(I$k~H&R)_kNMqr(?gLi5)xf~@3JWIx2|i%j#$j7!Xwno zSCVt&!+YI(Z(MT6Vocyo_SRn%d`3m#A8Rsq|hM zNFJQ$4m;cKin5+G1sr(To6q)&lw<50QlMY9@L(gyk5!o=x>Sc+X@(+Yr)2nn?!vJw zvjU#+Q@*ZsZK^10PW%r0-o3e2j@dXbtA6j!rgXXdMU_&ahUEIK)a`xu_E4V;f=AFO zK!+&Nf6M)`X#hj_c85u%5X$TF?Cd%GM>-0Yd!kohiRv&!GLk zEq$L8DKK?dydn$QHQ08y%_`~CNUjg*gX2vWGgP!<<4u)*Gx{Ta;RrC1nA&~TLpF_@ zu+QKFHkvE+0S;emXFFsFwa4R`;w+wic^9kYQh=!6yOcG{XgjhNbjc)N)+B2EAkwv- zsIjvB3$=J!zJbpoq9YIOp;HXBSL6?ZBFD5;3<}7m?~wR8GRdRE5Eq3J;6mnbacK8_ zVib>U)WfA;d4!*rzI(KeT}t4$6dxMjt+k<)Hj2!7HVGFA9RSf*s;Ri9ngy6wn>mPvLbeCJi;I#H3$eKyMJ_pM;Td{y-HqEIBNP%wb=lCir!*W>~ z2jnBpH4|xRT`p~S7$@W8;Ag(5;LV~<2`&zjTS^wa2Zi;Mu0o@5S`CxY{$LysQ0cq5QZ?$7hQ%QqKq-6)^y_Ca=ATug!$Ah%mTkp{h))3jn85G z!<|a;*~L5Th?X{t!uI5}8P?BjY)#oX1iDT@zif=X_JbTyW%*szfst|f)qo@xK3 z#3I(mPwi*y6-6w+k&QDGDCHsl>4?cTjZS5kf9CBBz9d_9>QAnm1!RA0ayn>Rzlq*9 z)|9?Mw0z zJHke`3Y9HPcd|cd*8DA@9_7cLXvi8@XY}m2?TfaLT%*OZuHEko7M8(UI^A2+mC!zN z<{BDfYoR?Iz>3abL;P4IldZ*#hwKiGWo2YrXvpJz!8Y3*xzcdXhf1hPOrkH zDj^1X&m~o8UYE8^4_hr^<#eIw^h<0{fsV|E3WCk>Mr#-3;#9|EZJoXkjfkzCcYN`tjUn}rCc>GI@ph*DeL?NZG+{c$5RxsxEHSHN6yc`p5Ry-25~3tiF|1ClMY0R&tmZPEtZSw(M{OqPk+k%A(G45@)$Pu#!j5ao z4tN}4>~Pj;v+u}#Ar0%U6Cho&`p!%@Lk*aNc&R(<&azcKRSfRaU+=YV?8wyVsk&So z&EEr_oE)@qXNi$vQI&sHQ@@IwbYq6o8!Qn`+qZW3C~z<>dLxpA9h@oS77G(hiT_13 zpb%HWK$t?mQFMUV&L{;QGQ6cJ^J!muU{O`s>b`z8QHg>tltDdznHOpiro0&uid`rZ zmS<D8{=n&g>60K>vwmrAx$kCE$|CzAH@powbg4YQ*^QE#7NTy@CC;}*y#)yHZgD4zgJPL+y)f!4Cm5kkj0at0fW1&Y_j~h={j?`42q|CFtX|l7sA`ngyPNo4nxD}hSih($X(-CRb(>wP8xXM% zfEaXG4M2_gQdJgJx15)r9ue{&&AORphdXGbiI(kB_9d_w6f-EjzSn2nn&zB7XuaYj zQ<*Niy?3U6;?k%vWMW{%TCga!X|;*<9B~*wHxLDu2l#3NB$aKq< z{r>Rz>sv?PCf3Qkc;Gs%ljBG0a7Gpx!5oH$Lyp0>tkF>0v|AM?puzzaq5obt{2)rS zZZ4Cd$UrE$dSuX0hG%#G(V;%MoK?<{k_*@Vs{Ri!ldaW!>C%Kh6`~iA>w8c213TDka@XKv-#Ka#IV;BYWK)W^Oe7m zikhj#@(1sTB?WZd~Bh_PK_etE*f4AQ9DEW|Z=W@W@ zEoa&-^&x$0!;8Qo$b;1*buP#CiSOzqO!>va3`)<>*?s${#q_ydgZ z!8;hDQ5HICpke$*$aO;uKNko>@0Y06^Qv?o#|z;J>!U7m4xxX{vC`@<@{$;E zuJ4N_GqO)1>|gR-u(yCy^D2%`0(v;-gyw|0V;I(e)#2%c3979!2L-IuAbQ$9NkVA- zo>RPnaYUtf8>x3&#Fa88zS~wum$(UqIi?P~%@>5-v%TLG@QZ6DZ#GPv{fvQp585$i+ob^pOJF0HlP_PhH!@u4t%fH z_drp>J7RJB!4cyYOC(GY{YZ{sRZuOjd-hUwr`l)4!JsA~AUj)hJoMMqk_v4l?|W3s z8x~F2+^Bs%d3my5R14orC*69~JoaW0?$N9l_N;S%7~E&b*_g8T_P~ZJ&i}}K+_bXp zy<~OJbwiK2wFS7HoKFv!NxLSJH1qAof2R1Recxjt$QdWWN;Jt08_%a4lFs16_=FsCnr~7b%W{vqo@i~csfT`YVQc$+x>OD# zt(=S$*)qc}fvKsze|yy5VHjrfy{(P$#g+3%PI+9GpIh^+-%Hy zzHU|Rpo9QzRAX@DS9fc*Hv`^xS*>JfGVbj5YU$B1Q$JEd=v#t@z2mirO}a-kV142Y zr*Hx5_1=4nDX}E!qAwe#^Gk3*<<2q@Ch1XO0!s+{&(8s`P{1Do#&P4%7AKpJOI|B0 zyf%98KjQs^o+pRSTDNcy^o9N%4xqm>IE8WAsBUX0m8rZh7jYN)(S((JdfcOwJ08Op8eA0+61_k^lq*m;xeM-^Ek=RGTqm2?@xR7-629dr##5*s5{b2*EJ^EW^9cn@iyJHXPXx z7Pjxmg-PF8MERji`U-|Sq+=>TQR*QHTDOcNqPdo?_gD(c#>Qj+=!7B3@x=0iCl9(F z?5k#MNjUYFV4`TVQ& zj$|1ZMO<96CU&guu-MS{*>p9lMRt7v&E!;ZqP#&5^q#7I!!pR$InzXL^=c}(p$%Ui zL}ftUOOBmJMwXc_3Cx~CdCQ>LG#$!%>x{l#O{M5qYL{i|Ya@ogl3K3) zPuiI-%Hjn)9E76P5jy^*@xBVo)B$pNCAV1EKtMF?CzFmwq8$IholXr!y}clgs+B)E zNYcw5yUsgD80av|QJosE)IY2FYNJT!>KcbOw=L43D`^fzvjBEN*4;Ow+1^bl7J||w zE})GzCThu(pS)iJGo9zxe&jcQ>V0Z0Ks7kg;Y3-flCPksEfxKiExLNGZ$MD{P1AA`md5d>HI@Nv+0l8=7 zt4kQ)EYHJ4o;qH&M-gES-8#N4{3(!)T6(pJ0;?=E#@{VopW4j*46dt3?QWWh@!avFOh!G}&rf4#~VQgS~V)JyFMI&IT@G~{s}b~XpEw3JvzIky@`vXkx~>& zF~Ac`Fsf?D8x9AtV)^X_ueXMR>GZ&Zzthr?hZ-Z@6>KJVWbF61PL+l3Bk9RBYa(9J zqHVo>a;5FVF3iE85hCZd&eKm={0ZsC)wFSsa3bUT4F|`A{$EXYT zW^y}AdA<2Xmz6WB;ZE+9Te5ZS!TVMl{=m>Ij|_dxZ#kE}*3y?{;*Xn{y_pyx6A~u) zX=Mi2cMFclo>BA^K)f1*dV~88LjNP~Tcvy3SAQY|R?kcbP0@fD!ZW}gk+V+0zQJ73 z_1>L%HP7uM%!#depK({38q_2_edD7i>!>w3hgap>vonqUe(SbRy-6Tu4f*{{x+D(u zVm(T-MA1_^d|>v=j7somXyX~?~=%DP{?%COVJvynmZFrG<#;a^b?u+vbAPrDPhXEnl(UXx6!6RVYP*` zl<@)VPIi73`I#_DE#lk1Q#Vi>NGy;g7g1%YQ3HLKbzn*=v%>_A3ZPW#E46Cb_0PE(VD72b> zU?Jhg>`0al>RI_GyZ0Wa>?h8zslIVGTU*uvpmmve!hnYUwaG%UIrf0diY zOQq;&6?5`>p!$2J>e2Qm&NvYwF$(4oxT&fOqUe@xY^Kwivu|h$4EfV}aB5VYmHNu) zv3S&4Y<9+%qe3yqsUc-q(I#$w%9$_zfJ^e2!|_$Qd)H63-(0#Z#^dz96JB} z*TMHQ)oN&$CKX7d&G=35T1j`C8nBM|e&6H^b8(2(^o%9KRPUIH657n{f57Eef>^Cdv`I{6hFII;nUxrP7%GdKJq%Xl9?ab(H7F zT^Vlja$T+o%+^hUX!o9=C&9vaeA?ttAlq_p!gw;nQ#zRH*|^!f-Dujp%JIJ|>5qZ% zp0Bh@(M0+%!&EbFuL-<{c1*aYKZE;rha_lRGc13MU7uxiM~?b^8os^2TRuj>M|Lf> z%0T=VG_xK>3NiV9YrGz_UdhODLRMeOMk^s@RkV?KIFts>qqA>+E1Cs?%=JLTy1 zo^8_QqR0;)&z}N$9v%!D7eW4ZZ}n`_)G@cf*fW%XEw?YG3v=s-=E=%+mOH&ukMVc3 z>{dkDLU!(7kP!MOlpHprXKT?x%0!mx{&V>~fqu~<8^s%oHo1A4i-G87OX+}qPOyaq7y&k;*5<(wKC_Ca-1(q2euchuFYiNBgN^gfE!89JN(kIDrk`LEa ziNG>sYmAq0nCCred_9w&S^VGAsHsv}`)OhYQ-YFpfVcPpAy@%s$aU}4-iXr{>Ip*U zQS@dL=FZNJ9mUC$P44TcIq;`iLEx-of%xvIf|IgOkNqoK!+zOkN#EanzK+|GJ3IQ1 zUfcWK`a8lxsi9j_dX*GQj^rO!V4&0stul)D4sn1;frtK$3EV@vTILhi#6L-Ui)Ekb zK29`27||;6)$`77r14Ol5GE2^kNVa=4r-@#w38xs>~nB+ViKP8Tr*P%uYIYW7oqV{B(OL zS-AFUR05}i&aBDyw{^2S7`ik?Jl|_TUwE9Yi{j||Pk!~3el2CywjK0NDk|$i)17Bm z8%dauZZKIZ7+ov0*yYcK1jKJl_Jw(8KiZ*p+#!uc4GLVeu_i~J< z#ZVqY>m$4?;kop_E<418@zoBY_{0! zblWkaP^#?hjc#XLC)^~$DM2>35@21_b%%1ypB`L)ZA6ciMm;GpK3lo|GTG?Z@YMom zM4?ks@_6L6=-nSGE_m9N0U1LCV&MLsBc3Q~a?l(+aY8a;{)XPc4ftNhjQDX>2!*M` zupbc(+;w0AD`<`*vPA|Mv)`8-O8Z8}hiw$LLeKr%+@zIM2+8%BcQQrRu~xna??WEQ zPG{=xU;9u0b*ZKcE@U88K5%1M@a)Tw7U-S^Q+!d*2LU7x;`x=s(fMCK@NaWKK=h?(nx>BYP%I5uwdeEsc-#$!3|Dz2O{76H#HQ3m zt#8^|q(8k(H`#O)Bc_be`4fJhOwww!?G%84e22x6jO>LX~9rAnw=hnNn{`~Ai z1uzl0#}Jg-2&i(?0?Z$3FIj}y8@^{>R{51I7ewj9%Hm2)ed#Kq#873SQTa8v+TdB)#qKb`s0Rf0FhRy#d%Sn%3Is26hgPVfUi$F4k{sE%D&TB|0^UNrcw(%d2(!DR7%R3+=z zh+B95@zjeJx_>83n;fi%7#zW!L*cU(?{I?d3L-iZF=KF+WFlil`gc2 zUwkRHgGr$p**7%{CBjY>w5EX?;0)*N^iJ}|)?@UWWf0l6uj9l3y~P`bEFgAVfhB*g zy?i37`eYP5>{MdkA-iddd>r56MU;z2m>hdD);}0|49TDZwuf_HwG}dYoWXzJ8CyTv z)_4Q?2ZAwi*0DtB`NyJjY0F!js1%Fpf0AR6;J$CLj@k-C=8v`xZY+kOPuP@OE!*s8 zMzWQ8(G<`pyRZ|^>KGd=92H=%r9-|!jIvYj3COK#ZJGl-gge(R0zX@vwU3#j=p?OK z2xOe-C8oTD&jKe1`S5}tFHX1L3_M^W@+!xmq=Ysv;w;f>=~2lee_FwH9LB+XW9*%~ zR%`X0{br_UOJnS&^fAi=w{`Aww~#&%r?RH!aojhjk(jl#2>BKc7T~_A++`9Q5(|34DNr zGd+OSh4^;&F0-lg+<-)00frC+kdIxP#c z@@SuKZ9T?-m5$1bsXvi6i;6r$%sORpWsopY#j?tkzcf*Hs^trO^J(JaQ|fO+zM3Ts zTITnTX5@hMEIN!|1wRk@>--wixu`mzqRxM_{bjcU?wjA2P!YSzJKCmW(HQB_Oc=?< z1mrFR1TsdvvkVV~^jK7b#pOa<4eySBH+sxp)PU zhF7o9%B<#{rJ5T0Q(iQnnmSXQtq^gBgnsP&rBtZzAjz%fa3%%Xe|}> zw-uqvEH#a3ce7i{^8;D{&>XGTj-6qN$p$90ST`c<=Z=w z0Hdw7i}qgdxbTi*vJWHtVw>E7kzP}Q6H_g4<`xvfD=g1ZLCjeJrNviq&3la@Rw_=iy-3cc9n_@->|>faHa5F>`Lx9B-+!8?!2;$Ue1Oo;vR;A=B?gs(Iz~t z(o9r+VxxN&6v@DS$l072Rs^ZJDvv!(qiuyCBbJ+ewl8cC?11gSJTZ=f3fT|NvqR!t zQ}-#fT|T&4`O6Av-?Y^el8T2Z4jOLziHDVe<5Q?zFipHpI4b&auCI?dZL&lG&(l=vkD&vA~Cb_np%ov}!V1ksKL zBS_@l{YaT5f1PABIY+6rg6I@?AJ^>Yu+|eByOw^L$;=+Bb!?m3K1R=M zS}oL1YA6(kT;f^bGimnHq#Y%=kZOmVD{if3Bc)}Z)aHgv*Zd9}3GN!3vb1c1FoBI~ z28Ku_IE4P%%u68_>NevFwz!oP92jr5sG(y1#uciW9$b<|`X|#gTCk%!KYXs`Q~g@0HnJ<>A~E8$%E(Ky*2)JI#^jQ`Ei0Q7JYYGU%V4BYgcF(#I6t5MkYJZ^nxVLC3_? zoJt!G9bdqA#(AqSB_)-MFD^^tRz$0nhFSdm-c6N9lvG_H+Y*3Hr(0r?OH~o3SqECi z9w*1GNPn@oP5a^$bPK{RqWzomway)nMEwS2Ex4S5nqRZknbB|oE{Ym>J~Y6B+PVpm z*D$OJSu#-mMz8Pk744>3$cm~H7%f+A@+Llp?aVUH>Rbqn{y+J2PQdK4c;WyiY%vVEX(A7w znLm0Fs4riwA9!)QZZzi(>7rJ;-x*xY>oHSE!KqlsFm1DczG;W42o6J>{D$4$<+PGo4^hy$;a{#F(O;6=qN6>;Ic9&k$o2HmnVzMGQ(X*{^@i_AAH7D(wp&Rm;z z@AqFArPOaql}S~Ze>B%iFYzl-483%|p3oV1xU3kQKd6n` zYZF|Z2UNcaA!jA6pG#(9Jgu@Jel``^hNmlt`J-0eKP^*jV)XNa+R_lxhJp#ym=e|J zbNo7iR(KMzx!orJN(N$flq>SfFhkzf6td8ju*2={50l1f&MW=j4A9yDZhosg)zJv- z1>_wYWR{@j#=G8)SaB1ez_mi3{8KKdd`KiiOW_8K!hI`+c4;6IU9zD&%7VAv`P`h$ zVmvLm%<`xykm70UNfrUO>udZq;3L!T7IBw!6ySUOuFg@9SEWeK*|EI~k#0=PW6;)h zziTMI6pl8u|K_3N!~eS6l00l(w319I1G3eur>3oc4JGbEyc(&q5tF14pC!)#_smkO zH~eR}H4$Mi09bTnf%bMo$bg&<|0~+5V@z?#rEhaA;^<6WY%*Ls-={zqt^eCl-730c z##PH^T=p`WWUKCi5_S}NFC=^knIQcrPx%|~MmJD)Y3`IywYE7=bTU1%X`H#1$6ts{ zHPoQ|y3+rhwCzu{wSInD&ZPwbmf*pswIHT9SFyp}Euyd1JcXyhO0|>W9;2Foylykz zaonSdkaX94JihnPymPge+>3Q{@yYaL*s6lq4JL9Juu zDc4%Hd1r|o*J1Tt`B0ndH6ciYCHaJ0eTCneKyWC7lj7wQ$upq%89!APMk%gkn-+R` z4}O9L(UOi88?7BqYY>%n69?Y-A2zWs2JPYL?!UortyF$^UG(^0A2G`LPl)uO*@5b@ z&1_8a!e{=6bcLqTzt<~gH{^Tpbc1d@{ZAt~BASV;KA^X7ZWuG-3jSYO5fZD?faAD7 zQChPH%4~dm7yxcIqcErPNoC5`J|SVn8k}Q5pZGlXk>#UiWfmKf;^kLTh)m8w9%~ZB z6d{^k|8KoKk~sQMFQiOpfz(3&7k}F3wNd3=7S3uvjlsw{%DmRNxlN0$^^(4TyZ>=u ze;(kXM*ama%8p-F|7u6t(^?SYh#vs4leRW7^efO!N8 zIFSU3o!+lNRJB>XkLyv-x6knfKh+4ndFrYS2z8oHEiGKpZmAwJ12GQ?|7sys3divn z?|hA<5J#EWD>Ir}E_qaYDM<$Uz_5YLktddv26$kRge5s$Ek9`KB%g%`Gql|dM=-tn zIMVcYKx%3UQGyQQ=dVZI?BU7gJ1l7@HCBnZvhp)3T1zh^q@#hOcc{{lkIY{+wutOK z_N)i~b$6A_+tJ4Z0vFzxJiDB$Y`y(LhLzteh58L;-zJj2bO7eA`?Y1t90RY21kjlO z6S}*E|58gU%9ZJB=!f#80|#qMAw#!L%$fv@PDoReCr^X}gMa0CM3Ur8o(R7fuD3VT z>&sK3WR_|w#lvuW@DVkT5i4i?<_&p<6nB6uo)SR4S(5X@lBHU!`ZWk3TNx zOPmceibEq8U92~M!djN<;o?m3*a98p_|oNuMYb(B{$r|VWmPCSWPI6vuTs3 z+B84CdQ*u3V325cuX9a+$IgWQ(0dqV_pc7uVVWNAostQ@dj6J*=_Kgt=D{VQvZ(55 zQnRIv_0dy^8T&pHU8fOrtaeu*Y>M`zE9A+cME`hY+7Q9$vEhx)n$wPf#g#@7aw;&- z^vy^KgOa5>uIbnGB)?a)K&hHa8%MkNRO@%_2o3uOib6Dpe3kF`DEj~<=`d5?>E=6v z?$G^$IQIdpp}~lhTcQJ;RAymrWh+*%-|tk%d$xw3Uq}4M7KT+=0TxX1j6<$9sY&S? zF>3w}b`Urm7*y_;V<2D3ggF77%yfxs!Koc{Dt$<{$5sJ!d~qmJ;1r?VHK$LO1BWsv z+jDVz9&RJiQ|#yCY=$>b&3E>@QoFLQ@caagu8|@C<$lhiidejl0&ULyO02{M8uBRj z_nPUtl*M;~(cMMYtpaN&`5UZf!H`lzs_Jc-dW&~O#0KhD`RXFsoA^|4z8X&o!PEbL z@`>x#coBh9p8#ZO1#W)bm__AwskkpaQrdVN(%ZXHkQ$FzD`rYM>uJ~#nbyPSo8Qpk z13-zdZN8#vi_Na?vnZR%$jzTE7KbvRAa00Kdr|rS&8jx_&TBsaupUvM%f!s7xg@GO z1*>uNxZb|tt$~;yBE8qI_K93PYi#YrWJrE3+owC|e@rJ8Xk(+K z*L-awbTGrRy6Ag_N!`e^HNYsE;zdjE2V2aZM>}(JPP5WX)1hcru2$BWn+88wGqu3II?~i*Wx=)qm@-pLaL)FKe|La zw|0t&<0nj*^6*X10IB)BG~u2_r&wf3)E|s*0Mg@y!9V=I7J^SwpIIuG_+CT3qAe4MWsTX_ zPiBhHLcz+&#|6a)FQD6@%a5nn^fzh0gtXjU!rA|-A~<~x1yGaf2nM{lDb@2I|Tnj(5-u=40jOIC*Iyts=I=ohg z3WR?SvRde_x*OlQQ^x>L@E?!Dd0DNvv0matO>bBh1i#H+w_kwg_WI#r%PRH_ zs14@yP9Sfxk~MLO-bY_rd#^_z2h~P3ZjvEsXsgs*o$b0_@wyvvFZ^Ky@=ut-iez@P z_Zq#(J9cEp?ItT)V&iJF2N1}^fRdGkH}0gkQd6v_()z?#Mni3P!hpu4?c3crZT8w? zFc#C~z7}AK{q{p$;5id?{)e6!ek>SIdn5krn=2Pe9}fyt$IQP;zd``{&aY>~yvBo? zIK70`HiPOF5mWJ2)zAxrTBz{135yWLX@i+4lm4!2T5rjJ<4fc)V^{(m~v+G|bBfsOREVDV2Z@R~u z9NF*py)JUJ-37#5uf+|e!Eb+4spgW*hzG7sUMw#w1dEoRs-qafyI*4S`XkC?p1=f` zG`a5uGjGqHG^wrbsw}t+?oT)X^m39Eoj>d8=9hPewA-fuT)o52s3A%~#b~&5kqekd z-RQ)Bw}5M9sh^%wWnWF4Ac0#4)o#at7cTPP&Fd(%urJLZn*Q&VyJvg1b5rA7Ft$4V z)_<|0Ta8Fh(&XBqfwmWyz;c(`(s=}}z0|Ek&-=Mrw?}h-&@4D*tCAIQfE_%XwG%lz?f27PW`TQ0eM241XWH zG!;DaL!R*ZGh+W~$6}p&fci0h{-K7 ze92G=gJAd5HiVp|nSHcw@1>DtEw5gq-m2HY5wq@q^I)mYC*7A1JY;Q6lvzurabSZ4 z!P}@Oh7HQ&n|tAj*0@m#n@YWx^Sr8Hizj(Wv-skJR}}CBRiA&=YFHqSkR|i!U7jm@ zVaK_R@oPx|Y2w^|+U*Y~YQu4QUYHN^Cv;)5_*FLYUG&Py%v9QJP~H1rO1OK2aCUoq zyqVyB#`Gq8EO0V->%$|APP%+ zD$k8*P|v7w{L#ZaznqZwO3VI21&GX1L!(YEOO|37cwp=XqBfJm_T^<0{~DTll5w)npQn!h1hpRd5D6OHfBVvk^8)z@0*92 zN#L5(5mMjPunAj^bQ84Uh)l9;mgKr*b{HRqL)=C7?FWmBK{=zBbzq7>_BT{~-}P3>bVw9Pdj9vXCCLa$ zW)U`ZZ?U@k=MsP(W`@SfM}={_vcDT_Y_GOkv`N0h8C1DFW!5sj_3*-6n`W1uu9%2E z8y1#6ouXxy)om_2hpdJhx_U;x<*h4fCTRVuHdPDM)%`a0c#*X6i z9=AU1qn=NTa?v&*|1c0gT>Mp4l~Z|8ZDA*FeayKq?K7Wu@O+3lp7eakhG zje@4}aYFF*4P-L$Hl=W0y0pBUTCB{-~D`5au%RVIxCccy|Et#`{hs zVXd^JWlFcJ+MosFF%diiYav_M!veWWnAhhc~I`IYNVErLrIzHL=1R|eaG_n0LYQNiJ zyN2Mv^l?Bn(>$N%nc!Ol?5tL-KB8>K7prfa`ZcMM_L2&Ir@dw z!mHmIGN08ME|Tx0##zdJWAE=QGb+|fvJ|}Iy#7_l`R)>QA|Jen71X^9#@Vm_lcN0@ z=B@bfLR-oqB3s!6BDjs@ljInK=QE>q-nV8Gb?v^y1PwUmZr^3 z2SKn9`Tr7o;I03^#Ox|l^U%izP5a+~l5h348UYsn(WHhIr|O&cKkIJ;U6r3S8M$uY zs5o}3FK@O)U7vAyi9UHpZ+8FPrd=wv#-sR+86NF+x(bn9VD9z!vMUyqMW~WyAdUfz z3TtWJQR^W}*Cl@L#m=MuJlb|wg`Dg)zpKK>j$LmrTmO+4b*1UwYnZK-?KJ{&I&k$i z8(|OBoSNz)7*a+N}4_;WiO!?r`SX0hlyfur^ zlE}VRe1Z=l7Z;Lt0_#r=5w{G@-Y{SCIcs}_%gwc<`YW`?2kGzoUY*VKYMvgAnKS}8 zl!Gu~F2KBPQ8%7yc&e^B_{2(}I(qw!xpYFv<~Oig?UBqD`|;JR*W)xLuY=zPJ;k8g4NK$_2_%ivW1_2!8$5+YB3J zZ2uc{2{g_g(sVSRe$Z9!zl-&y8&RF`r@Vi+WGZPvWe@k!+caU~-G8HGMJJ~4CGnol zw9U4W%&0>dr2tY^b`H`s_HO!g8LM)uiCdy_b1*KMH0`o@uPG+0>pjQrbs< zXL#(Kgxs`P)|o*3M1y+qSS@!3csPN0l867Kwp4oZ0M7Esr2l$`bE^E&$)?O@$g=!F z-Q{4e=;P|~S<()e-7*O9ps7a(uLJ;%TI4w=_@J~=RBky?ax=avSNu1 z2>|6n4-RNGy0a_ zH#rFsFC&}^YtfKQo~Riv2uay3ILjjs*$Gp&Gyg7Rn4x^f?~bqzk$j^wVZ|7)!&x{p-8$^cmAn_ysefKC(=0ohb&}Tu8K^ zq1m^L@01loPFGEM8#yRdWAVy6!@SuvTTi+>$5^k|+}oGG`Y}Q5BRZx|eVLbLje4y7 zrG=I&MJhmYpEAeo!QiUbH7APpzKCr9cFj2(SS1$NO!n$YOYMuj_-G!4p48sJIcP*?o8}o2_WmC0;LM7 zrA6mPAENv$m0B&&EX9RTuKyvhCvTSolzrlSvLfY^R0T3W-xd+O>lqZZiw-y8>e|6T z=ckYaQ1Qr7Z@l2mBMg-!Swp%Mr&-sdv9fBL%b8CZ1*KnrOe)Jvt zQMUX}DZQWOMEZ49VbSGOK+_8d{dCaVUwSLzp8^~(fYE!9;YX2qWm4LD;YR!kU9*Ic z2U1!lqV!)iVvh2vmz9l{b#Ke$2EXrl%J3F(?FE5%YW#zj7^7C0xnE*AVBsKH=GAuK z`?>5Ey&ALT4ftwxN*m9YRz!a&SRksdZYs?%(=5(xZof#f+!r+v9J~@WZZ)0*1sx?? zk*~KSfh!z`Qvo>sX_z+V{eP`o(uOQ|axJob?VXe_{d#-wvm&^U@az4(+?P0S5I6or z-*(>mMjk6mqOe5n0n8;4)ls>x7P)zLL~HMYp~ah9DJtfLk(x&jWE?gx4cJ@8EpWYg^^% zE_~HLpq&#O;I-#1L16J=zP;-X&^WvU$} z1DzB1D|nG{HJKafOKw92;1rxG4UzqhT82jr74>G=wBGpj+4A4F4`trERBD({grjT&yl|8sZ59!3=kg`WC*(bz2Y(;+5`WZu ziZC!xbUKj{<0+=5`t4kFPPHf0`$!{c_PEU|vD6Kkvlu@Nf$oSp^T$21QQT&};W?<) z^VNS~=Zw@P_$eAy!VCNVrSnZP^Pa}PAr+k@8E+fB?sjt46Q-mD2edh-S^gN2;>4n3 zE%P}A9f5AgsvO&fr3W3Y=T$@F+_>?|{SFt;28%u(Q68^s`PQufN(h&V;>BO?QMv8S zA3V(%neg`*{piDO(6ocx^mkbPcGY{!^9stvhY|q%xX$hm>xReAeb|i^y>eFP3>D0| zpPb^@CvlH1HRV$G6n6T9IZ~k8&RDP%;-*#$CB-Dq&EyF|N*4}K(TP&bX{8)KPcH@W z@8efKYcV=)dgMEM8U&wvdwwo`E+?K{iP?q}ZYC}mwjAbg;v3U%;8Rf&c2kTN_h!-sp-r-gBuHfpNugwUt7QA{BX zIGkDaLL4qiCx4nMKmN!xI<+2t0H5mf`oHLZi@(XG^-RFq)6}Z&&MH!Fy1~<}U}t;m zbx-5;p}<(n&nZ3((%as${dOKwX#@fZOP4i?nCI}6s{#MT9__~Tk(d?n6uVWh{Qf7< z5@wu0qjsS=(p$@v7E5{96A)W$R4_WC{rC)1HSpQ9Fc!tR_h`D_6ZXfEo%wnn-qxRd zt3nu?ZaO;3EVQ+XZ4x{~Uc~0pKM>JFIiyOsZa(8`aeT>1Q@T{XMVZ2d3yG?E*T{~g z0@N9COCz7~OylPq z=`g3c|FPEXkzR#5e>aF;qUeNe8aVGiMbYU?2rc7gn=d-jj^RPErx0Os!viC3HRUts zI*I&djj#l_;7`53C%$b&nK#u9ZC00zL<%HWD(SUu40RZMJD#|0>Fo-&$np_;=d7(_ zFv11Tqfep*6-NGEEwPs2CUS^kpw~!btGi6zjcT%^E@Ej1s6bJ~EAwLXFdbh+ClS@$ zk0%?;MoUy@*S&7j?_#M^^I=W5xUC9}=wB9C6SdZg^*Hm?TPcN29H|CMfcR4(9`ElV zJxweLs9>vki^o=uml>6G$^W0Q*394mKD=@$zCPM@W4T!rF^)9_?kseW?r*z&N z9mqM8I2ZReg6A>a<9aiZDB6*8UEm%SOIUrSX>~_a%R>-IT#MQ^?=ZToV^$~tPA%*B41ZNmdB+10#;N%%2tUQz#bG(q`akp{~B!!2hR`JGEueB1lZlA3t~Re?bd zfK*>Eb}WgyS9Yl$)1wLPjrnzj;DXWzCri)NE6tAssnp?+^Vi5%ydLH%t4cx?s4|k( zZ6pEapNhQ(`DWX~IM%)ZTo$ZYd;{4kd$2TXyZ2uBp#oWNA<1#nyXz_KWSjdjN=69e z%Ua?bl$om2&>I%Uy#3KmE6Z6DY5Tn`i89ytM%%+L!_w)7bIi!Hyjn$YxEesq$^V@| zzWQWq+?Q0y0ol0#B+UhrPj^Nf8&c}0pVRPS{diI2O(^JKet+jU_9ZP2T)>cudNX&& z=T&xM?1IS^IaeIWob{dxBhnhB)n@DB6o)U#of~NY7aSNLi-?MCGF~?S__cDN7Oc;a z4B0LSQ^PL1=+-X+B85e?rKX=|uL$2gKihqTa3!R+c_Fm63P8< zJ1Zeq$C}!kxC`YAxEieOF@66lK!I1#DGhgEK~oa)XzpCKA5bfnxE-*)V(6i_$&RjXG%`W9+Bck$#|uk zfZY2htvBEwV9bHT8XMQ9cw0X1jLu>@WYe6TzCiu~q@KO}Xl@6R zwd(38!)ILa*Fw?00yyOWu3h5Qd4X*aCl>QmsxL+9!j$<=UZzMr37AVK=kTpgZ~ZP0G{UmuKX@{Yxa&N6lK&8?~Hxocl0(2C8?~p1Alt zlenIqPyeKxk6q`K00L(QFu_vZhY|nq5>i%YMlMJ30Hs9Q30HFc?SUtcPN_P{cNVBd z-Sh{%T0JDYy;FfzcJeg-BGbeb>OocW9og)MP!T`YH|^Z+b>Z{EQXfI@rCgToj3wS> zmUqo$=bYJ|YudH0-9J#o7f#<0(*{o~6o{8 zQum&Tq<`EEp<5(`J8`)&k7D`ntcm`Y4ghtdUs2Cb*Rf-fr?=wY9fU|qGxKLznV_4F z>=XGUS-~KNcW~cgXO6%~-icKV9pBfPqF|CLJL8k>=gIR$%hlTWsk)l(k+pXW+*P+B zTp7g1bSO~Uwwh0i-nwZWkY$fG&)VTO^Dlp){`TLTO3E-?B?Vzu6k_=Of%-OFEpDG$ftJ!EvrxDJ~?v0-%m)nTdb5Y(~ z^!q-+%GAY!Ri2Rt3Es52-+=YQw0U0{LnJTKv~s)q;MVe{4DVP@kZ{wHi@Y3rvSX89 zp)i)D)U~>Udi8NwtI_ES%k?{f+~tSb>aizf^O7Mg2hxY?af3CFhhjZF1M`jqltexa?YPhiVIP2MpM~QXh^qqG3eyq%* z{5g+1$qRL&u+)&|vT{?KT{Gf>3Jgj^B7AO{|=VKT-dLF1B11 zjsu-&HuC{6&^YO%^;QRheR5yjot~l~fyD7nF*catvgND6j zWXCB9y>cfO?L=`UMKkQ+c>DJ5 zoYqaiicONU zw_Scf4Yxz8d2RL0>ew)J?xYq>1ZGRKmR7b8+#Ut-$DnYBQ}wq4-yih$`l?}O*hPM@!x2eMo}GOR(|R>vgiY~ z%nITB3DW;mEc~rJ@%FVfrsVz(fT6Zx;C&EOXs+(ptl1Gzl<#I8i}2JqX%)BqojTmS zGQL(x|E;R!ijIbnLrsm~y$9vK6$EQ;B+vZHVOI7@L(_mPI=KzPsYu4}$TcKHEChpA%Gd-HID9y=yv`GRqT1wNyYY9!%%wqPm^wudlIk z-k`$MjEKJ)v<@lV!Na!y&E*AR+1RyDsJq<6D!d_a5f;*W22GeU!EZ%PL(DifiN<-& z%elyQ^M3W-4$%);^#mUVHnDl53iqekmzu4t6bmn)X~%3b9gp2BENxZOwRopctY?YY zbPwn*-i(-E-Xg8DFirJ&TWvYi6t{`7puTxxxd8xQTv>L)=~2MU$fQtCTVWu#&C?>ziT z7agetpAuy3Nef@t?tD)SCoUv*`}fg({li$IP0e7DCH~||( z8UCY^Aja#g(#*leBD z(@}vs|Nee37&+7}-|}p8vB&Jb!KZ59{{)#zLQ9LfUxJ4xgliy+!*$HC^Pi(6@=K-Q zEgmyg2_o0?F-^tCG_~qkW~!)Scq?gTDLAcbjJ$Wl`j;KpkG)A8xLw%ong5`j~ruD;Tu+_n~xSZ#Tfr1k?DvIncRx}^o3OVD;^vo zXDU3Z<`W^c`Kv)Zzc-OINYhzI+HN#Pb%^HuR=PtxqCRxU-|Ul1BP`r(4_l>KokAKm z{p%iHemcOw`evnhVN^}xT!t~09dflxF>_*X(I?NCHXW8|{DeC3*jLFP?jE_|!Im3D z)IzzLY+599c^Hm)7}K~}JwBVTV#9AF!LVHzDaUL%k3h}@&LrZ`s+Xp9 zW~3SJp$$s+)jvrlh-%~+4g*C&Cs>bp`#pAjRJ{~6XQEZsHe4y?3asY?sH4u+Bl58~ z3tyWp-Mk2mw0O%QtcNvDZu8X+L3Qf9PF!+r!NJ5Ekz+b=p-ThDmwLo z)mA`-jaBjIUTPs2ZoIJyZ5Ff{7IV+*I{7@ut`EQ1NnHn^Yr;S~{O)^LQQ2^ZRodM* zht&MFoMWOYFbDcpKLlyVrPe#mmG}__PIp@-%%xk5H4ssGS3kF_7t?-u=B(Srw5qgT z93aa#*jU|aCcSy2FYBxuWpRxv(I+tun_+CUVxF%Hq@0*iIMO?Be5UX{MMF{nsNi*W zUBSi9NhzJsIH|fr^rh>h7R9lEtgMO`_sbK!umt<21Ng>Y0@gb&T9q>rMqinCtHC3e z9pHIe9KRpg6ANHL$>@b`p0r`Gq#G#;7b&APRvpFLnX?jw(hfRpVBa-QaG<{t^x@Mk zm4l{8N|dce2yKa0CXtV%Mzn845ZBAs-K?h!D@5mVEja@!jtpU4vo)tui)<8tkDfZn z!g*WgHgA1nz3an?M`4HhS|-H#;jzJ>D<01AU z2dl;3eG;7r#GKYRX$CX%(J}&aDwNM*LD}tnKFi`SPh+}zYQGJh#{T`~KBg;RiZb

YnjHh?&y{x{HpEaisykACIDPiUQVstcEwIN|apC9t>hhP=cU74GnHufOVmY>+o0ac>3-?rG2;^!xgzBaQ_=d@Y-UIS?HNKcbe-k2}k{hQ^se?qAeQ-_;iv zD>u30^>d&W+F;5G3gYt+xV@*BE}!l~L2P*`SMZa;iz~p0vmRAZlA4CK=9K!mo0$eG zr^!?vK^ZuMCHzJFG%NE#nP)U~zhyptzgEJ=NI7@eF1rSWzX01-6oehYY0~-)XX=W` zCAXSH0Q@qaL@qH(F*Ofm)kQ-ArToSWh&gT%vOM)n4f%mEcIrcFh|Xqlsu|hLTM(W4 zZ!Qy$ans+dB>z2w!dmGbeR-TeK{e}gt}%O1be7)ujOC0m3Eoh34IRAE9*){+dbBha zGLzLxn)K(_De8akMzF1Bq+8Oamg}VXl_j6VA6w!%b{`k3mP0Uu(`?tK(Y{k1#Nca;Lc-$6al4sylc zq3yI%!|B>QZ>;do8ET7-)+BFyY58VpSbBsG>p;GuCf#~!HQ4H4(~#h%?+Hx0*~*>d zo5 zX{cBSfBy(brGLd>g5Opi#CqZ&W)yfS&w;(x$UmaHahjIP@V$wT@=3ispUsE@^n$Dg9CMStC~>?r~RAXUvPb) zaJ!F$?8EQQTg{Q>y5vu9kfI-hSFv=c2mXfu4I&;BD0k0D5GHVAhR&Q7yYb zR;EHI`9b)$V(4=?`_^PpefY}vdqEmoUyy{#ZodkK*{3CgjPNzzz5L7v2f`I9bk+b3 z-(Vo>ZgqbYBpr~+`8C5w7^xWxMz{q49<2Ey3nmJWKTC(L%OENnB!O1oP`?rsOqw4g z`fKl$rGyi`44U)|KUr~h{9l3n76)YeAxw1@E#`2&iuo;L4pz+X62I`}pMw`4e(x+Y zs)#r{JF(f$Vp77Ao4e$f2P;jbBTLB&pj-;n0A(6HhyrEe_Olb2+)&wG zH82oD#1rMss1OBjWqFIT{FdmHAj-;RjWX>=hKZq(xHX;V>r+Lg+;X`@f8n<))Q68FXb zyX09XyF7yv(J3e-9h;aqyq@DcO9f+m0Aw)!`*nV(b` zd%8WtqLEOk&h~SCWYLIs!*BL}(^W@9f_;Gn2gc=ptM&`hW5D9)3-w>$^7?H982Hks0X(YsLXV zL^>oOj;JWHYy~L^8W1rQAyNV)fk9yyN-1l{TFIEwsK344^$q0MwC=pA|;3a%)eF!N)eyUWcVa8F& zX#96xV^PKpzp{Hr8Yhh5i>(wx=_f_GChh&q<@3H9s*Cy~y^~0t5 zLlkK)zUMKh8NPNDQmBug&i2;%DgQayQ=cW&z5}MR;~XyY@>R@im`Or#50k1y{-I{a zQgccGN9g;F&Z4wijF40cu$Y;awKmpY2*LdorAJCEzvL6d{)HA?1cJ2aQ5p)jl?sAeEwClt$Zy%*RXamx?;S#7&m$yI>3`}~_ zmOvci{atdIls+tcdut(zDjjE;iOD~M;h0bm**jfeXVtfXQyp_dqtOHH1-}ZjR~;R9 zqX`#|MrR-FmSmqTg45@=>Vrj)aucS+|5B*W7`N}#G-%@+k_88Im}qMB0$xJ74mtei zummS_Auoo<4SZ4v9OziP?0P)dr}A3N|1C>3EwnAsj-}S zmZZ;+liLb1rqb$`%RHhCD>Z)VspnkG{oQInOTQ!i*SIFY93eTg`pbu?S~AOx?Zf+= z$G%-!Z(QrKu)m|-GLP?;6TJRbSmEnSo%EpE@yGmDHvkgN=pg2@)x*cm*Ob*_b)C>N zobXg+gL(FAa56~7oh#{(LljI`%dM4`?`EYaT^TPChqaHO{r^=Lf2?p&CnVK_ahY=f zd(Dld63I)buyY_yu0=TsT6eJ&`zMgulsVHLAiPZfwsSPjA+lqcmnbGW9HQ5z z=`Y(gG3sTfZA;n@G$1{X>YFsA#2?=rg??-(;YmK_$E5p;wCp~;kB!u&1D1RD{31p} zfN*Gy*-e{^QI6KJZi#>K3is!*z8=Aq7b@sUmP4fkhK%#FBo}#=VI8l}aDE>+`NBq( z;iH(!0|9r|SG2kCx(NSB6~esm0jk}hf^f?B+qn&SNl^KJ>(+;w*^vox>~z{7ryeJ& z(3MDL>NZ8ty!#K#x1Zt0_oc+QO2eEEDceKMTv+~E#oGkn`HgKF5iOInMBemo3HUGY{H}_q4S=WKV3kkvV zFW7jSFAj5dT*y1VDhKy_KnQGQNq(F=yG56?6L~2}%Z0g^r;# zw^!a&@2+Vw3hg%4F6palWg^4mR5MS6hpTw{;s&40Zw7~upD!R82~*9GW81A5Lf64m zqs;olh^b|aY;-zU7;QlvUDh@A82$eKb)9`r3HnqhL+(ajbAE|oYmQ2K{pAoNCWXd6 zz9#Tx)^p-5l(gp;*ikQ!`z|_`IzYP1h^lmuC~>P#pW^+QID7Xm)L$q|$HK&t!hM%X zOM?)3S)>k1Cgc-j;=G*51l5)B%J7-D1bX{}&iK&Fq2<2(5naD7)#EAR>7ESyOb(#Y z1)7G2Xu1Mc<~~$LDB4;9_|kQP-q`Vy!>XQi`F|G{V*^O{yfAT9iJ6p4CNM;E$;V3e zLTh*+dUIbi1*EnNGU)shL8frty2t=1b*5O^vA(qB41$)+zv6s&(sqyRxml$uu&VI0 z&l*vyQ2$P82({{5gj~*O=~hrWEjlPDWA9>Peu>drso6-%;W{G!Hl$KAh`ql0$0{C3 z(&~g=CY~@fgBGdu$O-R7fKyIUN?Ijfz(k>9iB{Gr&&t-YHcPTGZPsYfVl|&+-^#N5 zJ_3(*M>~WOFZcL#IBIQgC0NzWi#pqr zW*t_4+WHxz!+^H&s1C<`FEb;=8Ymz#=N@<+7+NW$Dy!jpq4SXFEN=}H&H27dRNrOJ z9^PWy!KVu9+}mwmj~mV`GB27QPO?Hf3qw0xWqcPy12fUXq3}Vodc?!U=W`Nfhoell zw|;I{o^DZ|579dj2t;C8?h&?vmZnw>GZFt?2cYQt6c)|wHu{@kozOlsEzz1FHY0_k z34}>c->kkle&*t>6M7jtXKHuaHnLVlnZnTN#v(Gs2C=Qi3FGeL^FWIoebC=uLtgCD ztLX78s5^tT8UeiKwuRNf_v;RxI5J_yG7tsH&=*4pYzew?Ib2QaiM1INWA0^9ST}Ao zb26eX*W`OiD$|Cs_7gQryi~+yKY2K|_aS^jeqoq@8OrJ1+>2Dg%^UWQ6@k4- ziLLQm)|b7EdbPIC@16v=ctELX=-6c`dVkuS!i`lH^=-i> zrszIEHB{tQAZezDR!aJdiA}bo;LzX1#VmFw zHpZ*sq6 zW`V#<0=!WZJs?-h3BjCl~^6*@mjzW4t0E255K$< z4Q>q^m%5SeZHC_IIsQQS>Y>i*FX4Z=(f`ljK;?#>^9t~Su3S`=$;GldM%WGFiWfwt! zFSz+e<}S5X%o)7{j+>9UxjF>L9g~^Q850~3%v>&vw$PgI`+I;TIQ^kfp#4tLP$i6; zEg9T%uZVHw1gwEvG73CW@3Da#Eet+Rc!CQa>eB*@&8jf&aLD?C7PO_xPWJ5n`rS4j z!v7TL#ET(#@4In0>#FIKO34RQNBG@~UWcxnxj+h0sUtS*%bJm-!?2lZI1^t3jHx(V+WV}6;wWeF!` z+R2r@A+=)BhOi?wWrxGgEOSdWcN*F;-QOFripIJBpeD^7fv8GMB4uB;~tC4 zmkYsy3iIhNHh*N#K$@rDaHbh_%#W@ifbRZ~=mPwsgqCbpkz*SuX3X$*kD2bc{L z7-elC4p+rNA>Z52h&Ej7^Q!{()UW{(ttlXs8yr~-)-+oEyvUlZxm~pjg5KzY<3{_E z4bS`#sT0FhY=>f=kJO4om7B_@33DhICh zQM6zyIA1}lrI)50;q};oF)VwZOK0aSMN1{Xv1-1(;uWLLb7rGyb8Kh}JnjYccC1=| zutfpX!XI|*W#H6dPHr1#2!Z~vGfnkM9egEy!&p#atp6HP%(7xO8t|Uz+1JGOkVj+Z zP#r_O-?$@vjYqKXcswJ`!(JOXFS{>yA{;BDPZW=s#+kmd-d-W+W`*k$M1Mv~^J=EWSiFPT*wpyqhgqP<1n(TE3&sGfU$KyTk^EG&uB zSY7Hz?u?;~qln(U1!bD&yKv8ahap>cRL>TftQ04@~Gma0f+k52+X2d}nw_iEt zrE}Z!%l}m+_=m5RnW_c#tktTi%dcAa%Y6K%pc5QGh-LsG!W4C^$y3z5r&C)N@JT`8 zGX}ojF8q>XY)O?&U58?i_9?3N#%oUY*WjJJj8h*We*;_^K#XY!<#vG5{Y1~j^X?L? z-9_GNwS=!i#9r=t_J=HL?Rh$Iz<@drvbw*((>4yWe;#@?|8mh$CnXNpl!Yit(6~DL zTd)POi9#JZjCniV&zx#-!nakrU#Z#6ycQzo<6D;H^s&o@WVHxwwvg&CGa zC+V#=R|_wwv6*G5R&frQcXU8%5$UG7eV%zUmB&9^W5yV&GPp}g`*x8px!!+3PLKX6 z4QQ+NxG~Z5<&wp$eTGc zQwkM5B_QAG-uH)m&rhYz{cUDBRq3%YI@5+k;Bf;*qIrRfpp2raURd!jKomOC&R@07 z)~I=CT%sjh^l<5nIP*Ij{@DDR*vqD{+N$2y{+?^pK9{f@4I5Sb+D|S6(zA)cP8%uJ zij0jg0gLV5Z9{fJB7P-NLd4~d|w@rX6| zOy&m|Dt3H-ugs@LeKz=^&s$(@F6V50|B#+Yr`|7xZ4M}~7Dud@aV6UPuQgrs`L_|< zK!S{0Y?-Tr@a&OcE-YtMLZvfh`toUN$-Kd-jrTfWf?}GP%=gg1se(oWj->IVS2X(UriPMJ$>sa;^NweQ z!jdA*IQg+Egy%??H|WdtuXU>=YA$9ozS?yqqh=6x!)!dXWZbM5E*6uLS9GI^nT5p9 ze-@)Wmb`1fKC~FO_xzy$o(;iw1HsL_DCIM&o-;S?%j?1&-w)?L>}ZTp*GDd`t%nu` ze_9c=-&Q)Salhc-u_^lbOK*<7kMMO0GKwp!3h(bqXuA`x)EN`5`#n+x>T6G?oex1Q zH;nPs)eAoQ;5T99JmcsINFedCQ#yH9$Y|H}_4;nf6r4oxI5&-f`44^1Vv5XR1d~FF zS6O>TX#XcK|6l%w_ibdIJQymx%^8B_uEjD4_cJ7}Yo7>kzFephzxgs#iyU+CsBrAd zSWI7EQEE42ux@DzW(!=#7@D{7T>+cYcSwtqOdHMb_>WsLOb7HJaeBvxhde@2(o*QE zZ)YR~_3c&!S9wk#cF|rRwAmiIz|z`U>+>DXe2FyizF*bNZ+{u&HBvqWstP|pIaG~9 z(SM>B%3+JTTm;H4J8xTBp$!+Oi{-GSx?3lG(UQ>B^qDS zcPpY9%H3J}*rgDrDJTI#h1i+oB39ep1+2=(!KL}X!S^hLi^m~O*RIb`FJPVpw{)1N z5hS2b4)v}CKb(01P3BzHY>+qQceqARO_x~TSJ}WasWfqG80i>Ur##;Vj@6CO<2GY( zs%A160A93g+wp&@L2LsgX1IQpP=0D1scL&5Ye&y|JvO7 zLYy?5W0H>+C7Tf1O>x+-yrzcuti}Y4k^6%iwsIc@JGsHT{j0Bn3Qec$ygxG5oAfm0 z(g-L~(#u*P7vq(jJO~VptiEx%{PWbq6#zkhXLI{cBCijf@BPxvaPW$9NK{qE<`gh8 z@RRweSNGS^N8&9mRHlleuJ1syCpaxqz0h(6@l2O_f zA<1a3C5H+sscx*;uscYG&+hV?8~BM`ju_5f@9#-!@2)LN3mo#DAsTDlt|-=FG@(CT zxW{?TX|Jze2~Q!HcRaSDq!zi$fuT^=Q-O+$_>bk$GHbK3>7x;N`KAJEQ*UkwD0rgu zuDj4S;_Rh^(~1HH^x^y^)3o5eI4{MD0C!ZxPOqQn>t@x0>|Ef{bSiBq=1Q{Q89rv; zkejd_5*O>ye01G%(Umnim|t&LV52fuDUMDQmUHkOSv2w$B6|RQ~Fp}D2YDwoHGapoD%7QcpXG=^h^)K=$ZCaHJc5oryp`wwI!lWwSf1@ zs*r?9u&EJ9^y0GVcRbW~_x=9+i6}LBAHakDw?8EU{|q1c7D}%p5$3m)*wJSO_w(Wq+PSAy(Hi$-_(9$yBzaBb37obU0HI0h zCKiiDCy=*Tg7v9I2Sji$42#;3tSleJr+(yVj#wKOdw<3s{hL?eSZ=Ze%!f9x<5^4V zT6s*bpFt0Z;sJZMewcs2_8%^j_oCVp5f1WIJF*ijmEf}l6blG6D-d&>MXAhANy()cXxh!m5Y=ri65Dg z+%N$zO44R?wCT`;aweav)Ym1?6gv8}RGD0-?ilW$A7+8OL`N?YvF1kl_f<@NR<`@&j3%e?So8!D2w?}hSL;-z;IrJ0YUq@qIEOVTj|)amtpJqY;?^W&{6xl zAJqNZTdZ?*%+BDOdL!V(F&L_vT$W_{9=w%8rOT75roml~k&v@8YC)=TKk7}RV$6t! zab4HvS(rg@+aCb#I`MY;pPt5ZDTb|wT8>HR9nNG#)KjP0)rtaUquLTFC=}s(Z2B`Z zc$Er_yAS9iDSp)3E8k+;{@QbDuOdqkyz{e%>8d6m|(S-)E3{ zIi#Locuun_U+(O?hmhJEyQ%frRFnMfmMCak_y4pjoA5Q4&i8OYzU>9RWZ_e?cWI2@ z_~{lohfDTNz~JJ9ZjY;K;r+sFV058H1vE*(7yz#Sw8hV&Wz=*WAG2=pf;7YVC#2l^ z$=B&c+yVMAV0O`9pvX8zip+toPYEWJ>43T}*jAqmJ8W#EMjefn75+6HFDFkG<^SS% zLFWFLk32R_U^Y0knGiuN(l63|*9l)Q{+zra{KFLuHZoFus=`XLg%7 zSey(LE#;u#go}%Dg%HubTD2)&sSFu$T@#Z4I)M~|M4{e4_9_9yRETp70fC?24CL5h zfM{ZIMbR#LTPW{Dl@OYxo`?o^sWzYL!q@vA{=yG+XqjGS;Lo;9{?*$Z@LEMp0oGgJ z?N(o8mD*BvIZ_X@w$Uutkbk5NOUttwEkrj2JjG0Z-B#T!0IQ(qr0+f-@;_e z&XoNsCmL0XkM?(Gr97*q>vpM_n%ULV?%5TCyS^)>#t>)1*fLeQNli1u2RtrIfH8|r z-N6|MU511}f}qqQR91o&&-Iybj(fxkUL3%V)2ASZaVbR%huE)->JXF9aGYxweb4q* zOLnIL1DMlu9fPL&7&M`Bkcot$JSK;_e!j!3>mBj#w>AlP>;ZunRahU)IK7bq8E>i?@f`Iiq_db(Io$#&E9WX)ccO=kTE5E zkh7rGuY^$9MDFzxtlt?3)qZyGgh;@dL(0i7gzi}k)efPR_a|gQrz}yhM;=>82i)Wq zHzM{Qh6^W%(*U8q&tv6`@bZ>vXl)go~;X`qG5VfAB(h<8;mTsD?OK6 z??g3r%V$EKXeNVLJ2o&3?j)rodgdaK&p7f`T37p_d06kriT=XI_t)0*1XQSFFF|^z8>Y z%`Q-nC2KPjNYmu}?3EyEFi0(_otG2=uQ_xU=&|a8FF!td>a6Vr*q6^e4BE1+f12>< z`k%9V-9CHkZ77iU#xCcrPQ5=#NE9hYTWZbEh3<*vVLGbk6Y!6=JW5CSID=1;7zJ2S z)xccqvo7DK`REJjJAfa=$qF?GE>2(=g*coc<{!MGGs|oYFgt|PxddMteBGt3MwT}1 zP0EH5ZfqWzefZ?T?V|HCzlTQYV4xC4<YhXe;a_r!o>nxGf_#m2v!ot+9O zQ?6Rcfa(p}Hnhvv`ARYYHIgDAHy@C-&^)2tQY-F*xH+2EKS_%TrXLT*Y%gwC)->^0 zxJMxRIcwBZ{}e+$6Q`oWrrdzl_fVCGUg%@LSgW!nd=$JiUOen53R@46pM4k|JXBzj zjxkeJ3Vf^0m#iJk-`mE$vj>;lL_5s7C$1ZppAE?<;rufA`*aVpMA{j?UA4m13D-Tc zcJ7iEBE<4PHDN@}YCm8CDy9GPkh~YyF^77pVqj;+C^F55r*%;+C-r-S-9V^A zVksE}J=id;KEe6S$Gcj&?!$XUaOh=%uxV1Bh#J10pmfE-hhKZ1?QPuNhQdnB zhETOKlR(CLa~Dc49fh0`$+O$#os};`S+eizW9p@p=LQC&Qq8=Mw6<0h7l4w;0*R_M zZ+BHQs1jDAU!f_5SL;k&|MbW^lm$v`^M65xm`vfyv01#x7Sfq z&mGPi=EFQf0)!$SByLf;^vL{2H(Bm>uo`ax5`htzU;X}~bS`_+5@&5jt74LB*89Nk z6YT$e7en$v84}CFp9~~u{ijH1IW<(Iqv``74gho(yfX+c#^5y1V}IS~=_QxYqRr`{ zT=U$7uuIFs-0bA`ovTjpSmkgBYu#)|^#r%FEz(g&w5#)@=&Vgk zSCxi9-W^EqsiO4@npN?$R!V9aVrVaqRcrL~l6m5gnVh6kQ@4^D|C>wE{qNgR1J8V% zC^eSWY2QQF%^a=!g+4ds`xp`O1Rc7d_`2#XgfP~8FgL@N8A%@nq&Ze?oCu`{gL|Qh zq_+oQ%3Hr+u1lzHn|5F|`4{z|ahrcp(`*3F&uCkgbPJ$}BHXaUW&x&ZLk2ePq0%L^Nr#c~yAB2sK70Oqb$qIipgTQVrqM zA<^-?K|}2bkKJ+=xrUnKhN$4aR3%RXVjp`~80D$O6uaLXn559oFSe#EOo7O>%Zm*w z!S2EtdFO(~x>LNes#9A%#8f6}R@dvP~%t`(Y8a_Px$|@69ueY_7 z<0X_}@9j`Bbtun|(hh0b|M%;nv7w8D6L^W}to>8d<%NKvzv#^NG2uS@nur%A{U+bDwYp(fopWNS?PZC8`DE&KK(`3S2=_Qo9o^={M)86m7MYCF~(5FP?7>O!WOw*wW>T)r}Ak#TFm&S8ai-o_}m=eev zQBtIvo1*MjN=5arfs0mlwzpDu?K+Xs>?^V!-81QJ0Av42m(ev3i@MQ{wX1TA(=J0x z`+~RMd~xaI4HgFdF$JiG+Q$O>&iH2J?>;2soe3f-t-6OD&&-wq!Km@VdskyCM&-q#|M}WSv0SB|3A+mQ7`KT<8oG{9m!1M zoodATxCLsEvz?Qn=SoXE&MnAB>u`nc9DVgfFWL$nNE-c6F%ZCojJpapijWxOqlmGAU!+8`-NT88E^%WA+MlCq%YYv8 zPW7&KrRZJIOKca~p-X=D)7sJ(mne(78gqyAc8NXJq1Yx=hmACCbHwGFc@WvBJ#NGS zs3&+VbfyjZDNvGA&Ht=N>-K9ONd05yTei!>zRlm&^G%CJ{U;t+cijKtJ6DGHfY*e?OE5y&lp zh}D^hK(FS#qBL3Uh7!N3mkUUp9PB%29F%%7Ho+o^957*Wc=(*m+1YmolYP0mEnb?y zaJa2e9?ckzmNWz##uL(jqfXcGjIwFH&VIyE=tr*wY^`q3`@W%Pemwq6F|EH!GkPG| z9zq;5}+7o(c4d7<@@x80-Aif6kPA5 zU!jU#h}e1_qfd%=wFqz{dPD(h2<6dku1eT3&KdQEj2;(%tmPJmvBfo`XH7W!x>dhJ zH0<4h5QTOak8szoYl{A>-X(TL}N+JL`$c;@! z)xo{*EqZN%IEwW05BAj_hRsmkYyQeb#hP%F?UN*vy@}P`=kzh7PwikqKb68h!azYr zIN+EX3KkUm(>}zm;|1&yS<^K@@ps$b_dbe2Jn^WmdU{)sRR zEdAK@ByF@^VV97xyYz8aJp-)=ePDoEk|y-LF3=peY@v0j7yd9&aG-@o8;xt zO(rV`+RmwKISvLbeRN5bW}r3LCV@oJ!wsSR8F^2mkwL#t1+3aziB3^rHo0jM8HpjFd0JDQs9reg3snw>;A`F0AP3L<z4~p?1BdT-YLcsqDJdvy&$Rb%$Ma6T+%)?u2%?{+FRkCbbO5(I32Y#6 za*5k3Jw71j?F{fro%^?ddY8x2_M(BSEy@GN|8#XQiw>D<@J1pW1{c6meh zjZ;*jVflxq3~vPtg5W+}U{zC+A3bqs~r?cEg{Z3V+Tbm*>N#B+8=; z)@4V2eKCB(eDy>R=xIp7=o09G=8yS26}`FRvWw36^vkwQQNZ$(;{n(Ion)+UKqoHT zrsnCZE~RgmOu=t;?XFi9C*G#5@qBoRHUqHGe-puX{#m9RcF54Uc1RU?p!AouwM$!K z2=GCQs$20kSpynz-mZkz2w#e$m!Uv-)ae@I~M zYXs+vy1q>qh>JF<>b1taqRN|eLGTvX0Q^Q*2O_4C0Z%>E0MK18*hu^GQvxGVVX^KDa(vQPayqFkwVO{$`QI5J!2aW%j8%Z#yCRbd)0RH?nQ zDdn1B#B3*sF#Q>-shOkf=jdqcmnrxbx$LGMWLH!?cq?p07-&7Jmp>;Q(YWoA-=wx^ z6ujIs*(@(X;emvI(J-Q=+d92vpS+@JTVHK$Qi`b#&1!wG8jvkshtA<82n@a?#`glk zsXzgHNceKdJ=PHR2_!0!>{f_V{>%5NV~mx`S=CH^l;(1wLN#C^pU44H=v_Miynd=R zfPCFnn`&_6g<>86qxzJz5bvuY>DtEqou(mM5J-S&z6kNCPifE*23MsructP(gH#`Xed8$^f--n<*9Z~{U znmeZU+$xf?0lrupnJ>lS}(knI`pDFryjY;QJWJ*ZWzGv7)g`3r@LL7h3{w;v2-c}-g7PsB@kN1K)VmTFUT(%_c zFl~o}mu<9A}l>nf;duiulS#PwUkH$E&!%4ta8;>OIIqA@+u zef~lY`pzswU)@9@cxQ6?!%;CFB`LB$GxcSxJQ`bnzH(CdIh6U5QUBU>QfI$r@Pz03 z)bOAe*Qsq0q75F)B$E$hN!6!%r2{-a*nu^|6#R8#R&zQ?? z5ZmhUL!9%8>0XtmpB9Lh-E0O`+-xJxpewGK#`mBX_?-2@g7ZacvEhW1vg1Iy%zriuU zH>g(+2rM~b5@L~@h`V4sL)A53d_V@`sZV(U&cMDHHtUlqkx|e-V1debTsI|cX(NNu zeP9yAyF2E*vx*j6s!Ja6s>yjJDj%y^GX7Kq^wL9okLD1*H_%f}-=>lDkUB~xhK|S{ z{vH5NJR1_${v(H?HX%&ulxGqywh-)_OATu^e2v(mY!crS)7o!0kX3QP1Emog*Awt1 z5$86hyUQGJyhnP@(T8ex3KT^Tu?XisXFYb)`wh0jZl4O$U#(dNh>I1D_Q=YK;Bj>- zTE=Ahc^MKl7`^|+wj6BCsBZ3ySIqUt^4Sa8?(FZ_)#PU9sO-ure7 z*5$5)SLJIJPrhfhyUFT|8-vPm-7%L)V`b(G*_xGg9cbG6i!h}mB~5pS`Ixfq(S4X5 zvrf~YfZVNC)51TLmYMLo`$cvyz$$Dn6X;|XCJG^R2Onr@XMEpUFqYame*e~@GHV$6 zw(PE`=N(Q#SQyFp#E+=mxwSVoCdW}&Fam&ZSAM6C&n*sH2h(+DD6oop*=BM2@j|88 z)!%qq=Uy>+S>$o}^#wWcj~4H-rgpv8&k;=DCCk_kUSj2_ z4n~1r z)u{$r*|2=7R_Z#?tK1Hll!x*z3vkioYHkivwu2Qw03a~jnFJ*@g+3qCepvKZbb|n} z_s*$KN*+lyKcA_I+;iZY4TUVO3@uU1cwy=pQLredKZ@PLF6o+#{yZ_4QGa%0X3vCb zrF-AQ*NL8wF84y(ZxA~B0P~ra8UPFS#3MK}lb5F7wso>tq5;GwAf)2lK9lpbxJK6A zjf#-bXX~F839%h3Zohs_<|?Fd2u9{Iuc~99kE`EFf8KzI$Er z^U}UU@U5;*h#)pECdZEm`eyV^Dye?i0y1|K8q9dQ4Br}%U1Vd|Tx3SwH%j*BWgPg(Ji9I1)T!NRXF8kFv*fa~Nev_!@_%@=<$^BM9Dxdl8EnhC%+C0#V=1*e z->o8eCM9rbXHyn{*TQOQS@YG$edau{`LOq9l&PpwL9(mdu7S2Yu7E?ySoA7ziZR|i zQtL7!yg0W6Vf~8$timSpI=~cs`IXP|lfGtglW`qx;2bGiZ_|o~$KIO}TQTbqql+=> zgYuPp#v&f*Zzv@*vxmnap6YuM+i>Y^Y}I zznnmi4~ae0Ulr^Ie)+g0lU{nNgpwsNm~*~?WX9de|{V_aZznrm?;Si>WICkBdaCsyVo?H~m1h)R`RL1O*fw0x2A)f{*g3Xg?DDYG5eTo)!A~VtML$;=`FJ*HL#LVf$=0m2dUKsJ-6og@QX0Jmt(Rvy1t@giPm2CBiv)Isi5V*xbjVH{$Hs81F z^NxpGohs;rxs5-XfGw$~gE8M{Bz%q!Oj)+q@?E|A{0aHg66G%DthP3lQ>+&pA~sVp zqwszyx^4>z#9q&=@XOS?g`#idhS~fq6@lwAG1R-8EW9U}ak<7SAq;ESs=wf!xWr{^ zN43)e1&0@=f+aAVg)m3x+`ehwvG-?u7oY34$EQW!!)J1IYj*0G`AG%$ zU>%B<`qobhTs65I(Dzyc*Y%MiS z8A;#(td*5DdoPf3nTrH$%e9=!-e*GNI{3r&M15xDp4P<0kOZ?gQ?0De?L`_0;R^&gjJ>z>B?<&B`(!&%H_{n1Z(BHz$7_}chkVE@uSkR}c`C6m!y72l9 zFLb_M3hz`82*XP~nGWeS$Og+h%S>?^HcQ&3DagWTrDKb>fFQ9L*YuZCZ<(1e%u!~F zC%L$0PCeWL`h<^u)NFq@ri3;2^E(nRb>42La&Y(=?`Vaw&wwx`(W_n%{sCI%Tvz2M zs_LH*mP2#7on$T@a(0&9L&$hec;EmDHWy0rGS@41PL~;q0sTOn!~8j9;V(vtzEZyY z^|EZ4)2kXJkIw;4JB|X8e-UZY!EO31Dicg!)VH#O^%|Tk88VwaJI=YF>2W#%4F}vC zXOE~FFMV^6nqFNL%F#pa>G=u`?^3WD(`N4+ubjE(Rp?04JV^LE%ZvC{5MpRJ7cI$; z^fryQLiBK2lW(Q|Kn9P>2QTlwM(zG^T(Q5|bSEbrJkj*NPQg zhrn_3Mb}Je=P~ig;3ODf=B$hpX!dJYU+#E!j_o3_DeoHkz``W*_Asxem!0z)vy1&Y z$Run}fBCA6EKjzAzMbdk(IrmjVB)k-KgVF5JJJMlMb%&H1#dvXH{XuUch*gYf#ydz z266yS*OhQp5Td=uJ|k!7&%vzDQJ+BKY!c1HM{S@n8_`=rh!dE3ankk-O;fB6KIE-a zz>h4c>(P!%if56iRQd@P6nMV}_fK2Z5haXyLHXQLRpwO{zY`ed8Jya7bwZzsQ0>p6 z3hn)^z(C>J)yW}61)aHX!1Lp+@3ag{Dx0w~BDCSd{W@L3mw=CMZ}~|kX-Z;VC!+*w z0h(>a_9abk6RO0kI~Nwz8TI=v3|}*7->+8T^*v4ET+~~LysO47M7G|Fr_O z6%{9w+1E%J%_qdm(W{sG{5u-!lN`76OB`)xd!gT!mc6dMsObK>Su%%D(n~RX_|2?q zWO&7oxjW(I(Iy7h{{O1uL;%D60_}KRiS3qq*vNYAS$}sGf@!jxsk90ckqKeu2MZrq zwj~B;F2#>FJELm=enPYk*)P_ZvA531dG>~@#@Px7;qkJ*|Gr{KnFKaW3(ICpM(Z5; zK)t0@d`Z#Uw6|iekv04hFa_NmN%!0<=Qu8IQO!DWV&;KGO8;MbF(OIY5ve4NmH>je zPjB~^^ZOgzuA9j$wZ6V)Oj4Q`mo}|3{}KM8jo*K|<0Nbzo9!Y4_;{ZJqKZW=*i?QI zh5nOJ)OhjZ-T6@MjEOBfE2L5&$#G#jC>qm>d~cwIa`XUw4wgfgg5pW z0~*N1X99GNlE#;$nJG!DE;sjmw9agX)cGnlHV%EACE;& zJr*p1vT?rGWPAx@i;}@+q!ZPMzuBa}OJt7L6B`_S{u;M#SB}QffDq6Dv^DU3vvSMN z1gw(KZg4hEfBy+ETn*Ri29?i?*-!TS?sgA$<9oz-b+px$sVlFM&&|4zPke?V+&A`A zaj%%hjg+kOZ|8#7Bt`M_fJhCu{HdeSU`}1@I$AX2tWi|`61eZ(+klb1=HS^LgL}Sv zs{Woo(F*!r-_fH(XB|6tsm3Udpa#$_zQKT$)95mtOT8i5cVzU#X!SDvu!?51BTU14avb z|GL75&Hwugo?)NY!uW0tNx+A{iaY@%AJ3JF@r1U-bl|M1z-n0u1SI|Yj!!>lDg=gf zmR*7&u2W5pBvS;6lwi|*$7BNTo*W^L*f6}b$p^Il2wc&9mAJq5{%ltak6plkV?B<5 zfsmQ`XN2Het5=d>7#~A7g8{+QM+>dD5lbF7bF0QBzOP<)ib)-k5dS|!y?I!Y*&9Es zkur@7HO{0aicO0(m1`~tg5{JpP1-V*xtp4qJBYXeE|oPdXjW=2*jU-(z9X(_;Etu? zf@>nEh#P`}f-m3qcm3Y?U#^Gi+~+*cbD#UU&u3xFHc+rGP3X6AN@lm$;9CN+?hZyq zR?CaeI#|AHw6^!ig^#g%8w3jL$1m>I_M`60T-sI~6Xs=>y2G|^!zo5M0|X6iRHt(l z8qp1V)Ar5^H;}Hr@0ogw%Wbc@D#VyK=z(7YliO9Y(`XB^xJT)t!G1PrKeR2O} zLakGIgU_b;TAhB%*YVq3g(?F@ZN5m(Q9VO@oj}yR3GtptwFL+F4_9;^RFLK|sdFJX zS^1?gxGN*9#g2+{U3zj)Ty%ZT?sl=n9# zxL)GFPj8ItabYj$(q#FgUJ^%^-jr{ z*bZ;y5NA>eYbi*(^i_|`?`_6V%2_~B-$KI-rzK{An_;ID09JZKV?=#jNYv-}TiwZQ zjyJ*_0Nm~~-IAg5!_MbG(?T>ZbKQGY>M#AR^SY%5;J>FdMX(RkPlNuuq~)6@M61sG ziQl-#8<96Ee9ojQ;J8%+qfUGPa`q`8ve)ql?mGZ_e=A}s7H*fbBNj+UW{xM~(9w-U z09mglur*g07aEcd~Aao(?Y@9aqc$F zZ`fq=Yjk{2KU0S;D7&!t*agf#tSttpdijn0G8Q%OP#ErUrM0Fle{C_Bi2ildyx)@N zTr_?b_syU!%SAj=d5{+0EEpAQcq3~`YaMa$d&TL^i*ewyG4OC}8IA)li6Sh8WVAPv zt=tyl1o9iQZq9bAMSW);X1}k>d8^PdKWgfCy7e!b5A_A-QLl*&$#031U3w(=mc^Y} z4K2WPYxiqj5sx}MXyD|G%+SADRrdC+HHy|cqfzZZpx4fmxp&WE#>1{he{SG1tANua z(O!hxv<$lOiF_PdaR6E3nbvhlZ7i+TmMWLO#0Ly}&4Szq(9r>7S1!Rm4B8(dO4!Wx z>EX+w_iY+spOvbJ-_;8WzsF>FJ#$IUQ1e!Pc4+7r>ss*N>yeG?vj-%D#1_zVP*&Mm zjhDetk%7nGQ<3R|=<`;6qAYhEUE8wDEJvNNCWv(+alqD<`pq^N*QG}kd@3|DQ#=vZ z{8FkTdg(4Qnj?Sz z(oG*;VHiL~fU1-T~M>pmS*%ab|vb2+0Ba=awC<9(IjogBbYQxO;mTfmQWPE#`1AJ{VRJgrNWs+p=c+uABEIMasgQ-8)K zz^=Dy%pSk;!#(h3iBS;1x(*Zul{1Se%`rTvYh@>g_>su{DnCJvoKMZ2#g^3QsSmJM zeqOYFmb6!A+T;0P0HZbNjOXcaXo}{jZK(29gGpeIFWiU)_~D{O?z?$>L+g}du=@$Q zoz?3-`LSrlRr?2H0Ty0QV7HyTs(J0hD0+sVYp#4VNx_DBv5NYZ`mn2tLNY<*0} zs8RQ@T9$W$nQtMN^nYQ6Z=#FiCY(MyE};$;YHQHsBJJ-fi()N?F9xAs?2}Oc-4%(Z zBEB6reyL&cb?(Y^ono$d&@5DH9{qb@#|YuGi~sR^RHfB)K(bM4;DL_)rz(joxsg?J z&}YZk9a8?TiL_v&uh7={nCI{NP;dHN&ZWva3rR}JT`}r<>Q6oK?1%&G#>H_>R?!7Z zSqI9)%||`weW>d)Yx#40RE?Q>YC@fM9JvP1;Vc)-2iG-JjMXdv=VL9>$jaDCKO^l0Zm886H+vnG#UyShR@nucpxBMm&^ zLa^Uuee2X3Z3#w>>Wv7c9+|njF}yb$lZGP=9M3BHl`1k=zz2GynnoBM93{H^74!dv znoQf>32q1vY{l<2+Fj?jiGmi+B^-H48t6Xa(;G_ylUw&v(mbGU$#Nbol{; z;6{^Vq}NH8Dn^s!x2E(`-C4h{&DnoL1j_Fx9e5wDz(x_yBTa zV4jADsA`j7Zu+%xbWP*`t*YYI(BMnxeCbIe@@yZl*VWu3*)nuhcj3F`=d5Dc60U3N zRRYhizHV=4>TYSHOm;Gp)=E9yeV^cw&|k(eC5@p6vLZ*TxX)ys!|<@96`e!pmI-&W zXMtUSUSALOURTJncy2{Wrhu-;Dn}CK{bzf?vn&k6f-e7j0U{U)lUPG+NCmb2ZPq}E zQ&0lh8jel`@5zawrY82@FlUg>j)wHbFn@iMYOsm)(9-Av47dVf7X5m_VZ+Zgi1J<) z^6XMA!;5(q5osF_v_1c3m{2W5$!ensk#-T%n;Zgxm!6$zMbY;I%GkNKza;&w&64W9 zgyPfStucz>Z8Ebuy1=u3MGZAVqQ%y%`J{%fJGDou7W_>RW?^Cxj}hkrhvVZ^#WmxK zoY)AqDs-=zC|MhnT@+M|4z!zoB?(6E(w0lCkB|O+9{ElFNzDmzjh*>$rpg<4yf^ak z;TH64-wO(3uEgVUMd-PLq0Gjcs>?d4!@jwZ)>_l?2|H`yQF!V=()s19j9o#$-ope{T(fTpx z_A{y^Fjd|^4$)FEzpg<7$4V#MC5Np4HxnPjOeP|Yp|Fq%86|plu8c>Z=W2seS+^E1 zyB)&|KZLU717kJTCw4V`A=XGM<5=`exQ96%%1xehPXKpx(p|Ef{D8e^t%@F!CE_jf zRb+hb(g6*B109DBKR{;-cZZ079}F4$lR!z-nm-P8_YTJoUPDHV;yEb=|V2aIYNFRes=pQl6aCIYi6x1 zTF#WYEEbS-G+W6bu<{&EF6QD&**Vp_EZ@@J$!Y+boMO^!8q>3JcwZriC$0=>xf6Q@ zVw0n*&uJam@KM3d&Y`XuvICiIk6b^)p&CycR9ycOq$8gw{H4DbQJrlS7j^F2_w_UP z`P5Ga4yeK^^!nZ~ATcw+VZY5(7qHw1k)Sb~3z+Tv8iY>@j+q}3>jLL9fcsds?^K$p zQ|m9-fTKpO$U`GfJp2BztP5t&ayiD2E9AX+ZSXXvA6-1x>k@c}7IE}ri$Z5^U97VX zcijH(w3vdqT8lLQ-YAWpkSkWH8oFN9J%uVBgHwq@e6cCb`3O!qFupz);5C?Ox{;FE z)4&917+lN&C;u5_Lwx|)IG<}J|Dezdz+O;ak7r#>oP8QCHHTQ%B31#ob=|m~&gwQj z-HSmHSFi_eyJvz2M(G8~s0z*T{+Ue09nVqF!0- z+ImdzbY`VoTF#ZXWmhnD(27Q zW|0GN+vh@V|EqLxHfL*8zdQtc2vmI#%+gpTVxpfIm8r5aRoC~_T>Nx_jsT`TDmbe5lSo*}e zwr5GX4)6vkdfGNj_f0*jI`RL`%*vQGL<4sXywn{Aze$KBu#EJ|(2rLgYp2#86wd0s z)Hr4qBc8iwf5jR?jnk8gro^VI*%Hs_MmizPOT#*KFWM{5`TvBphhoG!hVAb=k}q$3 z&=BjY*?-4e#5=_`dKk&LOwt{W`H>c+CE9wQ4VN9t&xFTr=pl`^#G>Bxj@LP}aB@na z?XWGvUsrSN7uKtUFvAtlmV85FzvgGJQ9SKaO6nBf?Wqb0PtLxfHjo%P?T(QWQ+$L1R7V31u7dmR9;J)J?UZNp!hW?Y)fD}X&EW)a!QK~DNr2MVc+r;-XGQK$ zyu5<|hBDm%of)*I$+CFR5!al5xd{)d|#X*8Vj3xD`0i#NZh(sIxah zYxBKrWXBV17`#hCED8c#J#;yj21D=%(&b$3-&%HheW}^3ze1`h@oa8r7YkcgHB5jS zN-Vh`qD@wC0QG85eqWJ8fx9crEaJ&Z88Fm(pRsz^fI&-|tiU60f!T#j8^%449x2Zp z#~!`CY#s~A0MS5)msD}0RJ%=WJK2y~%K5$4-`ZGWoU;D6rZ>Zq+w0e1<*K2oe$(U) z83~`5)WImk?tSXj>Z=l{8n}-g!mKi# z2=@rY$?TE}360PgsQFYw>4BJzLwYTEk7fjY*Bnwkm1RNHV>5iylIUn#t$BK!+2d_x z?e|9{zdx)P(b&1Hm91;<1})#m*7g6SH?H^?ZjCPhc|*i%DBVHOl%&9r zpnci0`dnDpuqN!=&$@F1hW3}bTkUR#>Nxb4&~?>G{-r7#9BVB=e(~$novCmskyqdD zJV_xyrHwawh7GJJF@;(*QuJS=+*aI!)kSWJ(L3m&5TN(9z+cUEvfHVh2}NdV;H8If zyK(C`N_!exXZ|ag%uA}<`*cPXjMi6e%bBWL86bjPe+?H>dU zR>|IgmXEm`x$BE`3G~RzEOt-bp{n%iFM0PFP$SFp?dG=JvYe3U575T zv|M9Eu8B<#Hk)f#2SevBeCQH8i(Lv`oV19{OcPJ-+tfbw~N0J$ImK8A=xBc=4VW(tS!y6~mT3`7- z>L6~@oH#_f#k1*eYc9n;1k&WKP-}HurttK30L7NP(4h5ThXHG>%*B1*>`C{HsaS@v zJH8o&Y|rRUdZj{jU&awb`^w5b`g<4SXXQm_5|Q@{)!k$Bc)L`C=G*;^OEMa~sAyPb z`xb5A$E;vF*B@_jZ#$0p^D~E>wbk;n`Q3q8qQ;<7g&yD7_UNN;&5rttSYc&AI^g>^D`AS-_ z0?>ogf(kEKMKsUDsw5cE`tIRnJUav&x@hE6gbOb-+NzD<_4E|kBg043bPrm+y{e}^ z5h=9pUm>8chekGi_t7P@8oS>V+)MoH zmM@#VhvpNzKtTVsmzzsdsc1JOOndut!f-}|R2x~QCkNpm%H%1k(sNHz^528fb_ea|Xp}H9JdawT_tPlL(ZaIHw&I&btRyBV^UCZnX#9O}r<(ol! zv>)qo&?W5kAz6n|{X93I0Wa|)Gmdk=E6FR??an;9{7>p|%YR8z1*mi&Xxd&$J*K(o zQ(mA>^NXGfKc-XFJY2)0)@psyi}angbzdSI+~GS}l{`!5OdezOUGCc3vX?o*jUT|9 zPrW|z)K;L?0WHI+rlgwaHM5)-O|_$Mb7Ph=8<498W#a)R&(;{5%eVWj_)FbQ8~^sa zfuf{@(nZF9v$VDPfmXs06Yq;Q#E+L>b_n`dNJ4% zfr|7HOH37Wwlf8}!EvHbdGMId8d&~Z!)zRmyz}vtiX^rMkE?@N$yb;xos&@g%M2i} z>2@DxP2K6;nyKhTg`67mQf?I*`qr6rrgrL`FrJ8EqPcn9CuwIXDgxvoNj z7kTN&Wv{l|T<nuD>ryS6rP-~yH{&22n zy`Pqc4D&BPK6o&zF1ksJ=ic_naBXCoMqi_o+blWIctRte#E&ADH1IQL(W?zun@!8r zuK>h9!@Ox6=nqQE>=jeGI6pIF{S}aY+#r}H>Z0X3Mn0j49_Mu1PD)-c?~FFUf|%T= zHC;_J4#O{c@ZzK>`*@b(qAI%L$T_izqAPOXVoSk_t?|ggH`_{iE}Tw$p#LlXGi>E; zOsRV|=Xm*JuqGXhM5l#gq7}x9Jx^b?{WNleBQr z(j7O&=HfiTlR;9N7A5z5(9!mB*13CD!%y3ya(Z;Bxd;-5rN#6CW;}dzwBKr~dc88R zZc%veBoHi(JNM_wL=x(sJCS`idtCUv-z7bwtwSIY)w$_SqojSM6iYE1znf9XzQ}!k zd%3|i5{GT8TzC3}A;hYlxvbA$632s(SV*Ru=V;~pVE#9W45QVpLf3PEy*n)vI12B3 zzAgkcQO494^p|ceyY2TS8Are1>l?by$@vG=-y-vcuyO*X_}!clduzL|SD^`og& z!L>}22>%ymGtqLi3E;S*uX->w5~mcgN;a8(1viw$8L#Z{zpL9xzlfU32)_0A%-y1G z$WqYo_at(+ri1y+mzO%Cgz}k#2BqJW%RW;yhw5c=O3VMgQ|xTMY`BNPli7g|@-oOhO2h7jrz^MqYgbR4n5wv)BEQ4U zatitsqNU*y5l}yu)Kfa4@Edyfd(5;R;;PwHIQJtYX6W$E_#^gK4aJp=MW0eKRLB0k z83^&%5~zBr^zJVg zCKYpnuZI(&w+jJjjo+mW=DdIS*a-h^AZR-lW>HKZpJ?{PHENvATwX-lzc-!F;LZM* zt@I)@oTHnYjFbq8a}2HE4;8(xbvdOi6{T9-_6r~pP$x8`Nvqv8ix{&oXrrn>V86X{ z3FGew3fPmUBwoP_oH40WPUk12**EC3dkxG`1ngXJ5BLVBSeQ~fUfnpG2Iz5~+^qeG zo{U#B*m{74W6J;zfwZbd9lF8dkAto;6|Zr1%S5Z4-bgO!>Zg+3{NxQgo6 ztNIYmSpAYo381J+HEZew6Y;pP&uJHo#z@?o<_x6{EnLPfyH?r}4K}X7FX>;H3IM;L z2q<3I)8+XcYC!6c);z-y1dbl@?HFh)rs^bkfcJ)bNVA;p#S9!CvIw=`=vM-_C zB1{py?q%z+5PQTkza1=7n}E2cCi}{9gh!LxK$Q-!gOt$^BBe~*pfX+B;b)|A)=fHi zHZP(0QJy5n2&d11PTL`Eyqo>w!<9Qxf#=>E@trZvxrVIMqMgw?@7S`VR;>81;RF4N4umCZ1fML<1%T!p277%J-+oOY{;1drO%>A)tZYi=PMuur6)YVPB~N$ABLW2r=IWGa7k> zebjWyu5YyH?+*=3TU=PfYXok;IcE8TAXRajjSL?xi&<*5Sq$xT9lT6IUZ1CPYl(Fg z?|O~iZntAD_06V239C$oX)ERP;;HYj)MEN%S)^Cfdz^I9;60Zw)Sep4Ge{f~+zGBq zvCRJ(Nn3C2apIG&4+w3UdT9GR%Pg#V&V(4!NRKnkZ)=cWjtX7lip#0d0X67R@0`Bw z=$g>B0_!t-&S+Ww==etcdH_!!TO;WZOg}O^*GU#^mkT^e3G)bfNnq zKY?-cMTwkrkDwJlAgh5S4f!6-ePy^slb=q7(0;?7L7G{tL}*V#oPDwCd6+y3dY$EE zf8sWV`*+^xyWU%9`p)`rH-gE#Cez8}zXaFiI=Uq-%qMK?{IhulhgA^b&xFKW8PQfiHeBH#{L?2Kr?aW)wa_z~P_udcvcZN19Y~o$AboJtK0% zcff-iH0>)9tuaddxBZO~J6{~0^ESsn#PGImaKR^F@y6TWs@p+y!W&vmdtiAfIx_iE zOUTp%6Z)Yg^|YEl*PWEKDK)Z&Y=(^^$WJxbPSFhdv_i+_gHjmuf2;31#ReDjJpEfc zE!Zu-L5^Z1@jMf@?NLwSne%1D3So}H0Keb)Ga1VE%Vc7N8V7p2G>JJ8QTdw2Iuktp zJ*Cc=Xf+cz^r*q1iJY2z1@rt(=!H+^YYo5sf0w z?Fw7Xre{GD6^XdoMd4L~dU=M6qek#VlY5oz=6TC#(GD&3V~opb)L~lG0smYKxqSA* z_7I)$R$ETca(!iNm2o0seHvsn&ChaqQg4%Jt^KzV|K%IQAnBu5JSuX+a9k%=e>Vd7 zGBiJ=RV-d-mN-7nop`A9+w!7}peBMKR@xzYsFJz1{&L`sOV(=migZ^%Dsf9;mwvsx z=z8sHU;?7Py%-mvZmzfrY#}>le#JSs{v);1kTZo3u2Zr57vh#v~?x9NDO;xrSpYt{Wl zU0Of(XX$HGf4uLY9>_8erJm2j)ALt~gZJ$@KgMmx2q0$TvJ|yyDJPSE#>oZE>%W=9 z_Q|~x>_zK?d6$umFADp|#ko@CNeKZxR$`b5M`Ato570NIb2il#V zsbhDye3o^I7O0fEA{St+be2!JI+g9YT5DK)EYpt`n2$BQnZJx=WK%-MMRQ)dL*qV! zyhYdOS6cV`3+Hrrf1G)CAmddPcZD)^?y>&H7%UQYHdyg z(buVGu&1|G-GED91cvqj18ZREWV@xxyJck5ykePNOtJS?lyPSv-h9DLZ5cvsm@1YZ zSRe;qhDDYV&Dvt_nKAy2V)+K!{g?y%byt&hPqjR?B3=VEq{&h%(ym{rzhCYyKGKi5 zG-8hTAFD&4i+jpbYx+DlwjZkR+c-Rzc-e4e^S-wKJeE0kFG%^SZ#l0s8LRb+%zlt2 zP5#1mn(*_DxRtTH%#!cHc z6iJjp87X15%DVA4Cq8BO@7MF?tF0q%L4r>Nj89Yfo}oWEO3JMLw3Y_<=COMdE$5lT zyAvmVq}@$PVU!Z&>I>U_*R6R?HdH2&Nt^h&Su=;(qu`N}_g0XS6088wU$oyE;`A^< zk=Qxt+=xMDk%6dJEYkW>{(=AKVDrPZ{=7|XhIA~nDBOTCxY%+pdr%##_uc`nerTji z&sPY2_fH-@5Oo_MJ5Qh#mukJ|GD_x3%qPaayF@vHV88-@rRzZOlO@m+0EjLP(F#XP7xxKsG! z-^==+&|=n}c%_90ka30kLIY3>c+Ys^_-`!UzSJWKltMNFRusIR!E=ivJG(1+RLvNgLSiWSNch%s2{i?V-od$9k?}pCj@;v0EhWzYXcavvJ zO}Oo2t$iG7Ka3x3I%&~gDoj}lLMlg87znGs`11@1!urDynQl?&zTp>w?C9pmv58jw z$AY%UE942IdJY3NjI3__lBiOyjUgx>RG`pW|MD-so@&XuakGp@lWY9aE4LoYAXFLU zw)odcxOq{_#SaSICdQsnJ~pdX!)}h$=k!P^JT~(IJxDJc9Yd2VZ=#+aD?yTQHoy+& zB=8UTt&8_7I%cYD<%aq0Tk#Fj*qF&NDbWV>v4Y{V8v3FTG0x~)7RlAi$)ycm`t#gB z4ILpnvaQT_G4v7~!IHfgH(K`I^jEFDjNk~nAN_{aimXeZgmk!U4Zofo;0pkyE*XIM0Im%6nu8GK0#~s)#q2EN|xJSpwAqoT5Curq_F)L+I9Xapz^Xn0!K4;@|dZP@FUB zO-fWd5fv70@nWo3p?Bu0x?himSSvVMQxjPHG$l6~3;Q~#FE$dscA!WcFSCUIX?;pD z{j6Bd)jR0dG*prkBjJ;hLUyQ~vMwI5T%Ok-*HE#3WR%8`vx_N^5af!0^|6g9@3;wB z8NA{f{qIRPX892@2<81WXWWhvD-fv_3$VT>Xv;+6gY!Az%=XSpk zq~w|0#Z^UBITxC8*rrkS;qq4!Bpe}h*d{_*LTT0wtI zEz~AiOtN3s0t;dSh||0hV*b_#@gpG0;^hVjv#2TfoCxy`0Ev==tAajN1{EYl2TWIxuL05wB0$ zT(c0D0w&U*?s{~woUt?cJMCxE$?b_3!$Yv}4)M#MVj6i3iwy=JF%@&N=OW%xSrQUZ z=L>u1=o?F<#NT#7MM{#jIA>{QByHGc@(RP0Q}5kZ9~%o=H9IyHMWtPM6V4#f+l(BQ zq;2P16}mCdH6Qf8mb z#)dQUl)&Adyu||pN>e1|`Jc)*|C@2qk4-((hG=Yp9pt5p>L|1S2KS(vQRC#vd`hWF z)9OJ}?q{RUvDJpZ9Fp5pIT4e7^%J>;0VcaAVC-Tc4-p^t zm%Y0B@aKUa(ZGw?IC;o>EJ=}c7%aulOrPHi2}S*EAxjm)AZ^vuyv=BvJE#TUVb}@W z{>-K>uOJ?J+J+%*ki38j(?oV`YgN!c(R=gA>WRd0&cnGwMvFu2B*|$Z@<(#V1`(%Ycy$FosOmxwnGrOLQYmGI_1E3&V5BmSXT)Gf|oR zL^f$xjEB1}S3X9#r`O~-wC{@6JoBsOm}V>)9vi_=_L|4SvZ9p@eLIg7&2vswq|+{F za=UzW<=1eI08)({pT^mN5YCuDJlcWfoXB;$#qJ}clW|~|9aM!VdsqBtlUz-{=~G*C zQuFQ_XZL+D$1Yl);XnypjY!qf)2pR%cYvLGtf}2eGjDwx7{D+SxIZ{QR9O-PL=)xN z%8{&JB{9d$xGb^BO8cR$Vujudi#B8K>=7IG5#I>L>XEu?66nDGqm}#920m*N^Vgty zzH;o;S;#JqGUZo&oi5C{oj#*)QiIQ94JO$TH4 zmKe;tWV~Uu_{GJ4N7_C0(mA-{tu$!PSPQbxu?mLqB-q zAXq&dzx+(&4I)~OcRpRmSyIs~Gy^tWO>%KBc&gB)k~Z=TIIlk2_mq=U1#Fz**{Ckv z0TpPKEyKBs^!klL0Do19FJ^x1&1HG_M;$AllcQ3Q8!2_Qj6IP{@x3yH20N!2#YeSj zO}Syv|7SickH)CG?iRb-W){7Dhc?GCSjjJkv6&_ELz;`-gdGubj3CV3{^~4dyl-kBs(<%_g3jx)3N5?33 zm4s0QhcyF~5NU83=tPIO|-ZHW8|1W z{OM*JCb3L~^3lN?j8`>(ZNH(pfCA^GTw*#Gz#3Z4^~^=zeZI)%3#Fe02<)#?N6%-=x0v}K z*RxcQ9zWbcLfm~Zf>ssNOu`>aj%J3c-Yrh-)p>+5dHHHlE*tkj?}?G>C4}X(2EwKY za)kRH5FzHiz{w5E<*c>VZ}@wK?7Xi!vo0U-7chh(XBPb}m=q$|_DYp*$yOP!hLR7H z*&Y9wtLX0#O+Ao}**<$5*YQUM2iz(v_4><6EaU!j$%3@e!tx;M^&8r{RR)5+M%2Sy zwzk)?KX!s89|7ABKTSc<8-xxKaxqLUp;BXCugL+spH~6w{Q1v~th5{27C=qT9yxZ1 zvmWWnx_(n%~gB?49esFRMK;uQ=xySi`mn)Fs;U%&@$7o=XCY#;$m@9Nq(D85&?b&!piF z^~?_g)i{I%v-(Q+8N?pcA6=m>Mo(Ta!O*-TyP=%j5x$b&=`^jW2%36l*2a+CUp*;Zm7-=s<{ct=ri)@`jQOHjk~s3!tq3ZgW@^M*y0TTw4D)n z?EsC5L}g_*lppLwr1)%b69_C3@}s3(oU+-^exdQ{y=U&pr>U4Emt0UJ+u>r#cCgih zM%F@*{`8(99kPx26Z6u^1K@dKckVTGJSb1;-|vcamSCBbD_ne}nAVe3d@j)7Ajfg5 zOYnI)*L>>cG9~oasvRx%31^ZKA#&k1`%DjS60gI4ov8ECh|?@suKbaYetuFZC92w2 zv7iVZk?mjQ?lp5<<~3P!o5p%}?<5s@yMfz-`bClAlp6J6b0XM5e>klu@im-gv;2c66J zE*Fdahinby|6M;TkH->8yojz(=4HsAqBrxfH@Azc`kZ(hc-L>@fP1KgJRlDVURh^>@Z;GeZ}|}gaA>(XIkKuxNC{c%PssF<4u#}nF_bFYFw~i0pDL1 zGIW*zVGb?@OYM$ttTSyX4G7UI%A6NJ=w-z|u{`^C=l&<4EIo(6W@@2ucJj>UU#lT$ z42IzB){<^0>SIE&`Q-G&^LtV`E?%*8vQ_q}GA8U_ZNXGP?s#KXjoKltv`k7YD=fd? zRy#_gY5%6Xq2`94759^tuXX|Mo?$Jiy^-XfY~VDsXI_~{J*j}+zPUoXKZtP41-F{o zwTQ;jH}0K2LWI?+xxSg0)xO`;(EU*K7yk)g0Rcs273S04Rf4?I_qgit7R9W~$Xa~x zzTtKkZ}v}o)}@muq~Ww2)q-x?nP1-ZLA6?w3E9o%69S55uG;cmuC{40vAIwAgy*s^ zc)4L+3ESWHTTVqXe0khHEL}M6FjiS=?AiPc{zGSlPgrtWify-6v$9ioYW8n2{g7Ld zuL|9j(4)G)eNbgGv{QcW%*sSdK)vYr+y$-To6rir@{b2o|5btVjk?v&ZB;nnPki@f zGq%n+!DXG7Yei+`uVd|ipSubiqURQlz-M1j&ckQFPbtBr<2Sen9+e}1QQ zdWg*V*tq2~-R=-hVgF&9zxHK}h}|nnF;T=ytZ_;8pY-Mv>fWX+oi_O}9y&LFo0%S? zxZ11*Ik`EpY8OepSoH!{8dZO~mLZc#mtAngNBY(lSjhb74x2VJLa>FPA*-vsYGV)a z^?Si1V0_PuB=uQMYd?bptRrZ$IAhK3vC*P%Px6Pgi7~!~*@k6<(s{ueY6|D|5Uy? zd=Y6Jef^%5qG>sF`Y!};dd+IrmU|BlIKew6QRTMfV2pLT3@=W&$p{$clNtszsdYC? zKH!w0-eI6ko>RvdcB+5>$eaL7RZON8RjXEPl^BIe>GhD+E4i{Ad3Q{NY}am+QLQ{4 z@9jLj=Ws)KeqZ;OaUJIs7ktF>X3ufw;9I2LR#4Hp*B5w^AjO&Y&vFwtUz~h-xj)oA zM3Nc!&t&Bt z^-tX?!xLAd3mn9&%UakqVdO5e=ahSOq-c&vaBIemWeb)MBflvl>ENc-Vsy{J)u|Z& zI|~<1WftkLZLBX(2o2Q3!t>j^iNXfg=%%~FK@=$kQ7CAptek1t?lTqq=QXLoIYp>v zZ??k-aU85uZ3Vehk1WaRxasZKNuw~_Gz2bdts}yq}sWCIh&(d z^_+?4hmd*yer2BJBYa<0u6Aei1lzxI6Ui|<#U{2`i0JM#{@IaPR%?)Q2%-B$#Tcuy zwv!Sch*-ZPW6~Q}ClqJGh2K{O6QZ&PyTo?}+P*+&tyy$*c;rscD8Baw%|2P0e9rif z;9{eS-jc&a8TCLunfp=ID>=CNYgEK=naD9w`1@?DuY>Fq)mJ}@qm);h3yA*nW6vo_ zI4WzCPT(rteU?G4eJ(*fG}?NiX`qv1NVV8Zx5T5Bvz;_(48LP|DKrK{nHU@*z3 zze>jpRbgUW1|bG%&z{rCVH+9Sr?M1Ta%AIMIWCNY>pd?JTsfW{`cKAXo$bZVuG)L5 z&rE65RgJzzy?znWNqu$@SX@MpQr$K=j^4|c<&GaabPMP+t$&(7Dj5E8VZ&SnnBtV!9M^!&5S#+H^M3AJ+Z5ZUb zOuhTET<+UibqBW!MegrYkZ(_1>jANy@5lWSIrhX%3YqZjUw`vczH!^^bmMHt1t9&{ zz1W6Z33W%)8EO32!cr_><)HhNiP@_rm-P={nd7<`RJO@DP?>)&NX-)XsA6Qn0BDBm z;&`Y&XPwO^S)~!e;^!{Bc4>u9ADuDTx6mUsvG+hn#~Os#MITYjF%s@8Uo$xF)!U`6 z5;uiUHa8zmJtyh?jim?F%>)O|>q?5o^G8HSbfK%?P3o`cqw>LAh#zS?yNSU15o)AWP7#`buNH=n* z>s+0g`X8S)+H&Q~8pd0r7Iz!@gs{+zNa|=}xMGN^BjqW-B{X)!*X?({26cniJ15(_ z_4*03E`UVb3C+SPAGzdxYD0(b9vvstEw_D+GoT$mF^ z{p6e=*mU&BzivO97u^eeU)0~62+9LbmHMid8$Co@Os{PEU$OX_Lf7z~qQ+LyFX!56 zyJw`3^dA4DFDy@BJusyvy-*^VwTZcSy}*4 z6k&vfDL1lp>T%?;3yMgdSBSrnwW-G{!x=-Wwqw}eohW4S_(rP$?@vNzm|uTcRCuzP)_#Z2bi@Xivtth61HLuH!9(Q&Ho zK@j-7#FM~iqk{d;c-7=2U=NYoZ4TVRrrsGoVT3R_x*5&O zc?^eGthY}njNirdYqw%oq_ty-Ypbh_AfZB~Im>=~*{$W_=RCwRi&r&~uRVpCn=Vv6 zrDV`-*Tnn@Nen&GYy~0DA#fjjUuK?ZIX5>~QTK`;HqYk%Ko0G znF8a3M_Ymg$Cnb%o#qSUFF<$-G6Box+Gb%^WcLzMqFDxVX5Zhw%uFCcJqQ-&REvU% zEY@}PULF(wi=^3l{SJ+{zjvEf_e%k{2QKOQpyKGD-I>n)oEzh{_LYe6l1Cqdw$`t0 z6u(wE3NrJW>5XV@Y(Y?Uk#Q;%E`DgLVU7Q~$^5_3ZIATtR@B6q zDOU8}QJOtB6-@NIeQ#F+=ZMRFQfphPt+uif;Qc8^s`t&0lZRw=WG(5>7K5}HMks7A zU%FPZcV2AlKtMeJFm3=*tOi59DaV+NLb_wC%OzFAAh?zPeLz=2pQD9|PH)KJ|A)3W z|7SD*|9@#prbB6Krl=)aZB3`ORV}e3I_;F1wshK=qIRL$B9_=CK~1SQwNw?gL`PfH zzD8`JG4SQ7~n~=V zQ8c4p9QAVQr_{zU=`*hD|2!cZtzD7PzPLmIAzv!JuqIYvPm_&vJwxZBaz=T5>dce{ zokp3T<1inb;4$M{$Gp+E)3xIlSfKb+ZFmX)O`T^M9Nb~u?WemG?IH?zUYv0EXEr9V zoCB~&E=L*@F$jgk`j0A><;TrWSxBo5LL0%41fG(d*JJ|ppeY)G(bPVOg3@k7&atCb zwNrB#KA?}UHF&_8@Ph#%h5up-?vlke^*J)d`&#I{jFlt=@4f~%`5tHeT5o!w;Nxc~ zTyjPuFAv47suNQC>!4IB4#XUd{E{mIm6sMIZQIrYnOs6~-`SzXlo5qEp`#NwzJ}kw zF9sR%J)YtPO6knHk%MBN9f9kmWS|EJuH&_qgo)NVAuTs4;uFs2pq}-|d(y%w`3Cp1 z9V~@k4#~hK%_~kjtg_G5x@RPLSP~!X!+hSqtR9x~KbQAZ;zf@RAjZ|9eD_lS$%$Ct zwOUJ|h!G6Le#?P&Lh-6s58@SZ`e^o&#+_6BnxB#W2+bqg$AT_kvn4F|M5nas<~wZ$q4)p%ZShH&v^MPe0A##9ml)CD zBsLvBv9t!qU;ndQMs|wJ3fQ=tOi3_zahQ7BZeV0#u>$&?GGI%QcIiu#x+FjaLeIzs zP5$zCU`qX+JVv9#B`mxX#$6DMPm|F9vP)%pIT^f9??EaQcQN)RNhd%-QA)t&&^M!fS5)}F8O$DeM}J|pd-Vy>LhW;Iu&Z5ThtCK|lA&K0-7f!%Svkze;JFwNly`gj=~n{}*8PzwEj zmZk{0ss*hDaf{3D!e0Z&5kn)x|Bn}{|6>P~;(p@(DZ^`q3YJ&8b#bDaiM-h{?aa%ImiIvJGW6fQ zpm-$zldO&fUMqac285li1~Z58UGgb#u=$r%8fY7YsGWE~dQAS^XQ5tqvWv7E@jRej zs*RFtp!3#qRreQfRrvVu1QxF}6?(9HRrM0St_Ezbd?O_dEq%Z|lNMvV4)MXPA9Xlb zlN?`Ev(aLio9wMTl^f68VJl?QG6$xGEY@Z1X_F#C3apJ_#eP^ zZe^Q!c=Jm~ALA&$X;E#gFhKShqv{i7OV#Ag1vd@9q9$uIQUmNwBE&j%k3xI8hJ4F) zp+$_tVG7HtZEOY^mh%r*xX6=vPcv*VVJPaGRmG?3i%Ea>DEkOLZYe`!*ij@`{LM>bbkdRvm(EmR&6 ztFkTOA?s~c!c{;nXF7hCx#g=^Z{(#%_WAOd+!?(MVy-1UV4Ry)Uf7IUZ)hpV)RFDJ zD-G>eESIu;s>%49rk>dGR-=U=7H{VJqe(RwRo3(MdmyFS?3Lb9u{9mm`;A7{UA=or z8wI42DdP9~oSZ^uN2~k2Sf#;?C<0JX?EP$`Gy+fNW`0iowoEyq;;#J#tFR7avZHjR ziSJ(|o$rEngswt;3%2T8i>Q<#+im4ng=N+OAFtUg2U8H$46%S?+gtn0tDbF_O2sz` zuz&_W@JaKc4}8r;T-(#jc!>ArF`}hqy(zTw3&y$w19wW5`bC%Dg{9gwIo@KKyL^UYBQJ8u>@_Nwrt^?k0w?t(-DET~HGLz>S+ z%x}328W7^^?UFV9a5%>@6zp?IkFrZ`E(UQ{0R#WIML>v%&GgYNbydDc#w%UtL?vcd z52XRKyM8-nxFD^M>V);m3ZnE(8PuxOlOmW}hKH+j0b|QMW8n*n;bK18CdCKLv$KQ_ zG)ac%emSU!Haf5z*GPWO%CqQ&kTFFLoJ%W%_bK}o#UATOd(T|s+XR8qi07`^%~s8p zt>KYg8|UDNMaD!gdD44S*0j@?zqrau6}&jJ%D*3$^zNZmW;DhVRF4;m^taG#r>U`<$d2DK}SCx1vsw@w@}d}$3~t3t&-$|C>6dw zzLE>g`_bFg4Ih4Rxpy+V+_@eNg!ly7w9tkch0ZS*A`OUCap4;-P}j4<2szTjia%@0 z3SE=0plX`q=NyhAn~_$~B`EK*+hCWm;j{$=%@FWp)84zm;OiErv%1gSC_MeKSWzZ^&ForsvyE!F&) zthg3$IO4m9+WT6yGr9|jT*|9nWfzXVi&``DVwv<-B*jDyPO?CFvtkGS-twZ-)T4lt z4XZK_eulT|PdLlN?omNVs`zi1h)Qd!#ppEnDxRi5iD+PgvgM=w6urut&5sIb8Mhvh zqYk&k362P#PMsXkzBFds(Ik)!mEXQdEux;j>^!Iq^2nlijHOW63S0Y&~R$(Y+faq$c}iQ8NC9BYakjbll8l|Kqg;cDtc?r29LJAhf}j}IAJ ze%e}1tv<=`ZYNhv`Up9V_*I98b`f=)XtL`4w+?~{kBoyETL!!4byMD_L9;q#6y;dm z!>PffWJ1e=earS3EM&awwg!Q_GoXSjk&nRmS*($8rnZqve$k7!$Z||`0(&PJ=&pVS zmM$_WO9Mnr`!EW#CLPemtRy!RGX@_q9hp6g?;|XPM@3V_$Xe{kIOYo~AuLIkczw6_ z_(iIxqITo02&tEM@`CpJGX@?q9RjzrY8zkW&OFM8$q^Vu`~c6cn%&8oj0slu zM|z|^JNgX02SJOX8O~fyWBaOev?jN8ruXx(*=)#QO@T{zC0jLYKw;gKDie!?2iGBsPfp4{6CvR%xAaAba z6-==Tc~e3(ZYhuJQiK62bg=j6b!&yVWbv052IWt-CCEMTmB7QT%wf|=-=ImllX!?& zRYaGL_V;VlNj^fh*fXb6R!!dgQ~7yG83Yd+Cu=rmaHarfi{W2_1kYcMZQM;)^LmO0 z2jZ2wFO?QgIkYLm*oBZO2Q`bs;U!R$x#zBhdc+%NRW!vgZn(k+owVSY*)?RPTB!x| z`LeruJeQ{^ODaMgdZpo<7Gf-jA#q0y1hwGvx+Fb-+{N-UF-#I)_+hEDNtNj`l5~8! zA4Hn#gS|v3ZN&`l!RIA7JwD05&tlW0vKm{UaWvKYWFuFIxmMI2$KRxtNh>HBNcb0@ zYq#K4g4GAG)lLuTpsmZ-Dc_K?OGv|%2euEI2vJZp#Twp7FqhfE^N$8c52~rUCv*B@ z$O2}lsTd-WoVqW~RhaAn6%?oqX-J$GXD-jI1XcVLLJyBK zckvWYu<(Pds%)1ml&jDn8uyq9n3T8rjP9!t>Na#^vC3B60eU50WMecfsoq za31|R$LIZnI=_HsigBXfJ$;q-w_;>8XAV~I&&+_-azxnoy=!>7Q>267-*7xL6E#>( z@4fuy>D1SsTF{&Wh^FkF$o%Pv(jZmr2ZvBf*y5Ls92J_fGUh$Rv{oiL(`6t(O}tRqF*i8m zjePrriE4A_%zhvL7dWl9{$b?O{8HSSBTF4MCP31-!P)nzF?E6CN+F<%!$(aIj4nG& ziQdu!l1@ghVQMwWH2e;(ua_tt0P;31a_!whmrx?gO8Ggsl(Pc(wLEM8MEG!ywL}e5pY+|IL14 z|AHWR>uL6sleQLt-F0}*vwiWg%Cyf>By+^@ozHIPDKU9mE`$4AUL`c7ZbAxXuFYAx zt-5ZxHStAiCM={SwCSKXuCIj(zyE1wTtk2Q%)TQ!=O*LCaYya-qUl+$j9PZI^*2Xe#? zKHHrTed^In1ngVR!p%a}CFgDetTP|vHhP`m!`(8fi!WUZ*6}p5x!?6DnYZs*t{LPu z6=xm~4-%6HHJAnHZcZ5H$S?qc%Hp>|B=(4j!Fl1^P;hWWx?KD~<|@@TdPcQb-93_% zh0vTwxoAM1Jc#Sy!qfehphy zREuwqb#@^W_NCDi;2aJcO!DyUFWyOpin_`Tc>{Gjhrt&%LUSgM!h8T1V=U@IP^rHE zAzt6j1#bgQ9Z&4RzWQ-@Z7v=Qut%C>z|lq59b*WoucK+ct!1X3dmf*ybo1t0qtC!2Hv8v;@Rur7Olx+V^~mLQyB9gKWWtm28%QzJ3EA+qNcS@& zR23zVt~vX~7w5dr$oj(ec64ew>?<+dN#vKhx1PU`yVSgc^nuw*t^e>(QyWR}P`6F8 z!Lo6GR|xicBo%^5qy*H3knNmy*NZ#k6&7+5fOP4b7qm%Kh?hWfEuXPwH7%KUb!JH^ zprplXusXa8ROxsy#=pX_*Y?6?WSVxR_3Ar&g)HrIB=RlX9Bl64J=%_8g*KWN5 zrfX{(_K|yjAzQ)DA<-sYgt;#Id+#uZ4_h9`8^&dJ(e+nDe$3*2JwE+bf`8+R?k-fO zrDW;RIPH7ioJSj(SW#Qk=iIssQN44J@KZKT1KO^wW2^)W;j_983Gmrflh{8w`Tv3yHzLC>W1dNY2>g+-ku_QN!QYpPAyrtuF7Xu z9hZ7WI%bdiSLyk9)0xTbA! zxo4{jZ&K<$nOWtCtXH{_vA)OQe!l|$uV0^hmJDjQ`wloA!^0+Z$EMSNvUcWVdDJXY zw58x4sn3Y>ubszCFs3CT|7KswA`b>ENKmC8!iPTA7FBUu7eBF)SA1blW~u>G`_G1) z{`tYyu7@VnGa3i8N<1iW;Za)jAWK+eB7AdcQN?8K0kUbC$q~UsTO1(gZU>L-Mm+Ttkv|5)ec-)uGW&O0lk_!ASjD2=vL<^c4uG`L6MIW~#@2J}O{Se99tlMQ zjznEk@~N~H&+j9#p%EV-K}Lu1uEI6v1}orDOFtO!6Q&+t8&5|CX84liPjL??W_~!m zG7jn6!-Xwbx~Q}(S3XpR%gy}Y?eM=2(g!i^e!%|v|F5&OwbH#V*#CBx=Iujvei?Gl zzmqMIh49Ri@R6j2-aR|v3XKDuC{fugV_e9v`#f#;gR1E<)hXUj1bP$VRwQt$}##$4o%Lb+8)ivsgPEIqe>x-{V$dAu~{Px7Pq zerpv~s<`cCpWM31*J=2My??&*YuYO#hBZmeiLlm9Z}yEqemczI1O)b#vIJ^7yQGbH!BL(WRk zg9#4^BIA$W*zy*%6XFM?oY?JtY^W4`*>+m*H zuS}^*T|?^RL2C-X+_`Cg=v@XZm_u*+adoU7;n9r#h%dY2n{q7Q(eI^Z4QufrfcsSYG{ zl`L{jLn%UbGT`7_vR189hgwEm`2L`17;=KVi5sA%9A6X6kG28B0lhF<8S@N!zYamn4+i>o{1VXSZu)PyG5B#SLXZ(C>EO zMqhPJWFs*tjrwoey1IMBIc2Ux=*?PFwC1O;9vcC+89sN2&7_svs>xtRRR_4=VqSzd z5`py-Z|8=dr$ztJT=YBY&mp?BC zKm*lD;cd#?XycgXRXq$a$v@7xuc6u#toBv3$R+wbZ6kS~TFyBybq0Lio^?SBZ)m_b zDYmO4;uT2Ntdl&Kc-TPrUU$4( zS0*#zT9UCPX0pfQ3HT{$n|<}=UIHr;Z$>gU=X;yN8nO!1QKD=dZ=j>XjN0x)%4j+N z?d^e>R|zQM8s8aph(9Q{e!4HWvJWY3@@v`#p!cz;TkDbFJ!!=1?M!uz7J$VpdcOkZ z9HD-1dwV>_*uio|oXJ-U`7-IZLe5)wYmG#t0;uRNBNwf2Mk{K(ry3dWRXz+1SM;ep zp5GT~lov(>6- zJMdD0YWL(4LA98;oR2BF=4_H8r9{hZWAS^- z)oe7oyH#PL!c3tsH;ib=2Az)~|IPF?toj4zK()lWy_U0AMG123JIIM`AE&~{feKvz zfO^<1ZO*_RLs~x zG5JsM;9ON?R6j=Cg7Qm9?yFR)>cSDya+*|A*yO5(Bm6)NrLgItlCSM$tE6(tbLGo^ zttZ?&^WN%~{>+R$umE6_!AEtqncE63f5E~RWS)WW52`i1 zO!(M%E2+jv3CAvh8>O@FD7)w3TVwi!;_+ zoA&JnRg*v<652nd(D1bX4CyMsXPXNc-?DhaAe(uNUuif@rlw=?w3=0Z{rWGcs^IsR zAPQQev;W+Mi6xr=P#@!IW?8G&;fk}P9r5};{l~Y8lsm}TUqEiBCdG}(_v%|6O4Cd_ zoKnVt$)o*cw$4k5-7KX-mC9Jk*^Aekp_UENdlc}(#SC3@8PyHy^jqcJ9I+P246FT? z8R2hkZ3iv+S8G@VCbSZ}wBRRBwmwd9TJ?0Bf}waZ3v~vkPB2caTX<8}gyO-i?^_1r zn8oCzi}hRZ`%e7yz24hkL`+BFadu7p^rau@7Zzv~bWC_cn*2|FYcRpY1)-m?sAuHQ zw<}slBT>Bv9&4g!bU|2S-^H$edndsnGO!NUH1)=HgP>BLjyYQG+w5;L=8oAK;Fy~8u%N?13R$$Msd?aQeOcC zMgsCO0(pX_Ov9n(poqZA6XqMUb%It#IkR`yJk6_5exF4B&VUIVABX{fqdr}a$lga4Smgc1 zs%f*3sRwx@j-_SW|D^Xxc;=dvf}E#LwC)a%9W}ijT2N+CmfX-ZH_7g62}!Phnyupe z*F#6vi^XpcQK^&BJs}6@{IGr;n_bSdiS?%}Dt2m5x|DIa5C_xJW1&jue;vcxSA3h- zV+C^1QS?N;eMX!ry66h$&98kM6#~b#V#?IqUp$RxSpJMW6&-$&mEPoSA89HCoW=KX zN$0xNC8Z<64lc7DwY6dmBgRfIS`&o`AXiZDW8b>IxcGuyF|j53Feq_A^o!ANI*fe8 zGX3o%lNg?`endFQ>2<_wQblu<0aTTcv2fK&v7WC``1h@Q!L(6K-R68k`pf}yWls0H zH2|Z$wYR(z>3|B&(}Q1ZT`nkm_KVThZEO#sBf2d>LEp+ z*56h{{JOZe=YkQVU1OKlyp=G410A{misBu@D2rrqc z61$t^lz2u|;4#(lDgED^M8J%uY)1M{Zj*x`DhfO;f7x1fE z-!+|ai&1A@f}8EHbJA|CU$V(VM;=@{hsA=s-+Q;z?>U=@Bv6c{8U5>VH|zs?-j_Q% zd7ML(xvIFx)WhTrlKh3K3DM*RtW4!ab3;k@W>~ELEI^*Qt$G2N1x_xuy=8somx>F3 zbVsF=XrHVl4y!$_Nj68 zQ`^EyFz^oH3LTD2P4@PyR9v)7TD|@>4;D2TbwkxP=RTZEr)FtnxFD5V?&G4@_uiVN zUXE)F4oiggH5>qm)@FKw;fV$NhmD zHuYHtj>c!YlRJG|$Nl=`GeVRD%)|PGd~GFU)o*r)g1Tq8uH1;?OaLk%`!N_;7g@VpP4g(Xg|gz7ds71a^p7p1(mNDDh*G zvE@ z%-eO^D_=TfZEW&{8xhLxUr^@+f zs)K(}OW&;>Q>vn>U?E8{XektUHxCPL zW)0rU+pC`F)y$~#{7HB-tMqyjM4kvr6!zo)`@jv*FEhO0&3qC$UlhH zO(X^$X3GvuskS>H+2R*qL6iqt?xKBbWWZ)B!-04(Pd1iDZy(vzi`v_*Rf@BQ;Xx;G z%9iMDcjsmBM7CKExVs>ht|*nMH!BWwcUp{BC|gSEfS2o!aI2u*{*msmgJU+dr(t+f6q`7F}c~Pfu;r#f1o>wl$oF`3Q0M<)4SBC7%iKyy7w#1y(4TQFbK;s42GP z4BJ7?Pkpw}TsS;36aZ>LE8D6Kn(~{O_%C#!lDrkP&$B+J)x04folJiyT zE%{17)wzc8sI==z9eLa0c^=ZT%ACr(4lVv?-?A@RPvvPrAfhv%auweoF0}svd?$T< zp3CxRm0*=%(VRQ>F4NU*zexQ#6(iB#WS&qbGv`?7h@3nVm#;PB^mXOyG4RhJk0;6j zU91JY{JbKVHb$v&Ya0pmG~JBVHzssOfn_M~cxS6gA=vs1Da&aC)<19XQOWR~(QvTu zNBxH?Ly2opc2(>X(lswOXmddkR^9f3L5|!V;qEajLM0 zcjCmZJ4D(1frG?__@6Vd;o%2W-fD)3e!)xR;FLLTN;-ge#uwi22ntLtoRC*&i9#4! zD-n?L_Y5ft-0dFl!U`?56Ct;9kaLqLiE>dkz>}e~&FxIF?R5iY!ZjBwE$nRYnL@|z z+ld{7R%}kx17c8=sh)`_D?0;i7o*@dXTD=pCF74IqEITw5Qc{mgq7Xh8-4hMI`zdLml8{@UzKPRt4UW&|6+ih zf7oK(fHiDH^ioQ^0qG@LbU6KDE$fSyuOkkz|E>=IGb?9nY6bM_V>EjG-AOVxF8%^5 z#}^%PN3@+HWu@x-{!|C}W)()%B>!igO+}r@;;bEsmAlt6r}wVsEY6e)Ryu`^8Z25e z7VCd3yWT2#et7s}XXB0ENRzeLFzVdWpAXb|wB`RHrrmQvH_SBW`1^>FvB&Hq!33& z2VvT#qfE=~0B)6qyf{=bCPP~H!)9L+4pSjulIWO z4$m03@+BJB{9LWPrntCVzngU9)~YZ zD{yi`+n4LKU@N&)$7^#8)Jt@%U#Pg=xYKS5LAIWTh-;LA2)=ZADKox74ob1E^8ow5 z1c$iE@>#iE8)C55jG6o>y*HZLj~V{8v2`?GK74U+2pyZO?M4rrIv&F_EmIEO*Itmw;#^D!0JYXlxBJ5%FL-gVblK?|lAO|~1vWmzVAZi z)MAT{Q|Ruw)l3rmPn9P&g8e&8ugE8PoY&d|4?bz?6TJB!pL%QsJuZ=VW=Ep)1UZZW zYp48u!R@uaOP$h>*i-2=gOqt)cW|2p z?=}uNHNxt6>?}CdI(y_`)Dp|7>d~(BzamEcVv3SLx#nOdh`RlbUWn-XIMf`yaiU^t z;m8MeLbB~_u-FCjjE=cRmyN!D@lGkc%{F7L=e;&G%1mnKLe;3Bu#8IHKs~xl6)U>T z-S=#3Hx;&%QlwNSa80rO!|8&B-?LzN&G(RH@THU~dIIEpv0dgHEBO}7;Jwm~89rM%UoM08;`pD_TB-`3 z<@7JmtN1CwQ$rb5q!Pl=%F0{NFPTEcO&3LQfPaq@~*V!HM zFD&`Sz}R+jN{zZc!~O8I74Ezb(xcu!&3RF^dqpaM9>Q5n#TX~&^kvRCR41D z3=+fOv|1KTJ)E=qln$f_UiR9oOy)ZO1r(1V|y#IWAQ-5q=U+n8z>LlUH7X9*=*+k(1`AC**<NTNsOSbxMHv z=;=%+n6G(*8#VMBl~)E+Nq?3jWwv*M5YfT0VPa;^`Fb)+D59qHqr;^a7p|KH^oPK& zB?b5I@V3Hle$RSpL#7jt3dB0Emim^XR|Xv!i4bkDjz(T8&8In74cDES^`4xL@;Vk) z34K|mjWO4{#o;p+(QdgS%^5ltEyMnVY&DPTQgBWD?~+u%DSzC;z-iHkoxt~!tj4W7 zwgM#S0cmP74fIs={qZb}9%Ls;O~&$A@bwGg*Wz*sx+Ku*X~5by<*@fm4rB(cc7ia; z(o9N1i_HFEuGzSp{7bcsqvy>0UY_Lt$u*A5i<+!~aCmwGlhJU_+2T2=A5yHf+*g~`thRU7Ymy6E(mOypa?OFBuJ_U|=prrOQORuX#5_?Fw;MS$~sd-q2v2N${Ew@#$ z%5SFCwCcGjIJDvN{(@Fgp*5T|~aKO9E{b{#x-}Xyoi#i;f@{cl=MyPU(iK>aqjV))ZYF+_%m;uzbi3EEy zpCw=4ydNY^XtOf?y1#cqvQkYcGi8QU=iwMto{K~FV7tF+HJlhKY;jr$0=bZzVt6&t zblo%PVsoo!wsBCJhl~N{M&7it8OxHn5~aMhZ0!=_e*6|uJ8Ipy&lkwzZAJ`ze07HJ z*7BI;?2M2#-uFA9UaFlOqws7?&jgccoqPC5!_auYQ@6I=p4X1eGbJ3THeT?) zqFV|@&8f-j8(w|vE5Kp;Jd7(~nR>Y=@wYW9O{ygeX5`I7au*FLMn1doV>XOuH>1?< zZ6J8zM# zFASQt$=)Y!wh>nFDQ3y5J)tW-$)hZKCXhfv#=(Nt0`w|(2y2TQW};}0E>4ttevpu3 zX%v9W)451c7U2g)4{u~&4a)(Y-%1wl&FmFTkk`8Q*<{i1qh~grvpdfzh%ZLmH!@`P zh^u+w9CaSl@Zv!ff%e|o5h#;c#ULZL6wWzeKVtg4=zutoe@F(NN4Lc8M~$3oJ9;b% zt3ArG>-YgZ2Y4HetgQ$~b;q~yzAsgsh*0mE-C24B&8&Cbccunr1~MVE#DkEn!;BQ=1-siOZEyYgWyrf9Fofg$=Z>n}=z7B-_Hw~oTGe-WZR)s9gAG~jGb;%}I(6*WN#qZ=!Z4hAV zg&RhOP5j2q7-%*1wF_?=#>b?0HfrYcu6=&L?m*mgF@>8qIz}1yXufR!gxg(>n>$oX zQXp$Hu9Al${fw|)P&((Ei@sH-)RzGYJ#&;?x0rmD zydZIHI!~XTH`Zq#yMSK3jMMUrT%)bobvPS69S6@6YRPukWzN2QnZuxn0_}J;3I%j08dg0hsWw zx1H+32929J07z zrs6l864jH3bcCClZarcxppI%BXEWI(CTBa^Az`7`g7r&MzueL;>N`rO?JCJFB+sGz za`lEyV=NThxkC`I;-}^;odcK}iPSWLK+HHO;MILYa8{1FQ~n#N^I&K)3vg$B5!VTD z6Mw021efrtRvf3_AARX1zyW`{_;E_&1TGmqyD9spQs}?se@;7}axde_XFgRqI&&rk zozk=O7mKPoQ5mJdhWC4B-O>`wckwe`T`LSiV*<>l>K$3-SG?y=$f})}&WvB*-Ci1e zyPU%WddCdtIi9=aj)>6u4HH>t5ftw;4 zrho&;f`BoKRs@-Z{z%?mtIuVralx;g4zyx=t&W%Vg_rf!LgnGVi6UOt+x8|nzZDQe>n}fGF%<_iMnfBB=Lla>Ztxm2 zR2JfK2ht~uxsg57q4&nwLHmcEV)75IYe|A8%;8%#d3;GJ?@MEzH*LSv6Hne+s}`wt zkfYZH^=5I-r{@X%BLAgm9^?u~uEW=;{-C?&wY7rkh@YQzf)(6TnSbT#zXZFy1uIY7*3XZ7`~QY9*@mv>Hhq1b zAQ`CUDyTAl@g(wwx z(8@dX6>{CYBf6#b8*bh2Z|~@^MR|{CGyC<|fJG$&4W#f)it_xAD;0$JH5@xPYUY{x z!4zl;KR$5TzS*-BjjKRL$O_L|lP{Ki7wIs65e<9+{>GNya5zoRi742$ zBK*Zg*SKR0Ja76;i;QA&Zl(rJelM;Irv;T3)sY)2I(1T>HTtyUzg9X8oXY)ai|RWy~fQbu?68p+6T{CvcOz6wTfb;+naM! zcCIswv<1_-Z_X1aoN)f&eXDE@?sa`x_3m)#M=D~P<(5Aw%lbw9(!+&iDVjObWM#UT zs@%*Lc=TKI^|K+vay!&v>ep_E@tg`feUXE2Q~st71GGz>SfiTtF`K7*)5D6ch1H<2N_#FT+O z5S8@n`z+!l3n~rAPn*3|IZ=_Tg$#?}^`s5gTI9)TMYD86Cw7kRKb%UIAD?JNf6#p> zw|{} zE32!}p=8&kqUAo|Ylc2wDhb(LyRFg+v91mULP~s@e*BGwc5>K_$x7LPeCpz)*U_O> z-mAkZzSUk0D_Zyc>x*GA5TEyYn+}D37umjeb2}i-Z1vSKvtv~As9JOT@EZ*flN;q& z1?hQ|INk1=IpyfuuS06&WA%aELBO_M76$Ux5%v#c{2|kq)r)BQ^J%Kn)^7acI>Pov zs`$-X$mX2P;&>wRHM%F96R6W9$;78_%&w#XcLNj(UP$h&k0ps#mb^Pxz92wkGx^|+ ze*d5;AdB`<2f5j{e(aO2wuN@j5lrR?5TK3U4ICuBpkJ-*2yQV&s<|ATc3<_Mtm>N; z`2g<5S2vs5%tw&DanUmKyq@y5dC{%-q@pwuy2%Qzg~3x!$HsCV&1w6q%m*%DE zc=>(k>{Y-!rmASCNUJRZA!CUfp_M8>^>pa5&Wu}Y`F;PDe9ap?quXo+TZ%%Fa?)6G zshH-CmftEStwo&D9YXs5kj=S$o zUkOe!e3kes64hU}`K|m|B54ZP<^Z!(NSKKU^OqM7{qF5W7Zf$>Wxe(STU$8-qN(g2o%5@G0D zgxhPZ*~}mO4O|Osfq$)c;krT7-79Hw0mCE}9ELF*dQ-<{28^;86chMCpjqkaUe@Dy zLRIW6|EB%tT&FhbNcU2mtc#7if{9ff$?Mz)Re85k$P~pj;+_Aq7_fAjs^DPXcsFzc zzDuBH|M7ZIrB(@wbqlz60Oqy(Skn_%(Xxi#>M2-1v^ul;#QyJ%EE*7_QVO{7(nUUM zKqP=%#3bmin1F#W%!pcwm5fhW%D%$7^81%Q`lIo(7sG%VhV6X8b~E~}LOk(8Nq&(u zrxk5qpu{{N+qNshXZC{~p$v`B#x(^QB`|CDG6l`iBHc`iaiu*}g?Rui?y+N|NZL;_ z$qHaIx%I`YwAW0Mc_VlHsp4YIQG<0KxYEzs70maO4$Z81GOqU)X7;Y#RnvIWYv`)= zo|dY3XISBm#q?I&2|uMu>)4g`ag%Z2A#moG#0R*7iTjdCJMH65jX&HBbp59O@7Zih zeuRq-b1z@tx4)Oly|R*^bbFp}NGXfaXVXNzf=XQe^{B#yDqB@^K#u)jRnEY9?LRZ9 zU5gbpW?4B*@bavSczmD@ZNJ{?y4e;mY<$F}j&0jI=kXS#lp0Ot#*jBIqSmKE57L#a z#&FK#<`ZABck=I5V8nvjSlGr#t!V<;S2U1N$yuOcrS0w3wwvzGSXoyR${X0}q7S0V zpyqF>m!e)&AU=kCJTqj^&TsgG(ur8ra&i$rikLCF4>kxd(5>-0XR8e`G-8VT51849 zXI#+=L(Jh0tv_B2s$&c+F)laF)ph8tTpgX-`3Up#@yAq-B~o5|D;2PZEokQ<%>5(2 zXA6!yM#qf2YuoR8oWA1v&cZRM=0@7w<~1X=Jy2wG_t45H3eq2Y2+QjZ=Pw^K4+R-c zq{sLXFCd);;SR7@^SUnX=fy*1(HY%v;ayIK-ZJ0NREegsTE((yMngMbbUizjeR->Q zYY~iBH%rw==jQQ)j^y~Q_f%LFyR>U4a%x#wa0B-TUfQorwY%R!BlTizB^+qQ-V!@) zDGMx0Z#6T%e{MuLphdvucKVwUA^=u6C{F|s6~TGv5AXHfsa+nvSr6c^sm>9l9`cbN z=jiYVd|tjBH$&{;t-0<9%qA54u{>7J!ErR*L9oA6(*HixI8Fr;w&7cMlOuu-=0jGT z{}A{Q>xptyV1v|sQLaU+!gA;L`X9t={i`m%?IPKw|IB{vFg4MTi<>_`uGGU<)+Dfi zUY!WWEqg>`(x~R&!{*>0UFeYYz69H{Ep+1MgYLg?qNmz5zSYIQ#5*=`YzQZlQ2#JXlont-g?A{MbKt*Wd9_X-|^heiy-=G8J=Oai(&Mi=T~(t zILhi)*qk{V6e{_0Mq3x=e%xEXw6*5o9N2v0L?gL!# zKj$UmkOClEp({t&*#G~MP58OzcQ&ea*R&wencdNzk!$j75jV0nF7jKegi zmCMipSb%G1+MiHupYC3Kp0Mr==#>K9(T?_M|jR%)9iwijAjCv;{Kosyz zTD_%Eiwl+F_qNHFC8Zmd$oWIf(YaJji_fyr@ZI$gwJZnjFayQde z%V{4o_qK!2ez(F|NVKd1hDxQuD?kon-Vwf?ZrPytJVk;hCWop(rX5r2dx6B;gKIux-76e182 z+Y-o3IsQqFN*J~-353s*L%#HfhM{F$e?OSr;(Rj1tso#HVl$yFjIKxpkavde8Bl5uy19BkA zfph8d;1Va0Idx8NK~{f_(@Oi1*B5+Yk?IUGwIa;1e&u(>x1|k#U|a~u(4tgRd$N*3 zn2{;?*+2}-=wIKAChmB9t64=UNFNASEuB4NQB^>pmCZW z{NN#Wu`0uYHGxZ@v6TP&>MpF4sixItmms#?TMbWX>HmSVGLilIR<87s*%U3~%NmNE z?Ie2Oew$f@$!J8sd~;q+7nqMU*SS|2B!eRTxM9mju@0d?`;Zq;$}9#J)ksW5uaROS z!P|u>j&8!4uNgisYax3|g0&W(g9+;WqkWxOX3y(ayDyfke9?2+6Ochn8QJhDBsBUa z&u;?g^Vt4leZEVDo@GdFu2WW{4onObvmhw3na!O8a%Kk^U|I&(20-N*Q+YL z#3$JB1j*5;9g8xz7EKqdTxr1GWkKpmC~c6R-|-HX(Reu7ZvGBZ-dB`*fxuD%niVzs zVCj70h4usG+I`u&kLzMC)Kv524k>%11BO8%VEn9_2GA;)Lq-MZE&|<|jfVr!THw(Y zL9rEYG=|Z^&%ZNf6(6SqwfJ1ZK=%M6kiDVP_-*A981DeRS73Sh%k{BF11Q`&Rb!kK zJ~5=de8(?81=4YwXz`#YZnv9jK<~Zjs)SMT6Z2{AM8#f;xK`)D{*U}aCOpu3__+-K zhy1DpaMLyoX1C(;OViESGj%sN$DvtA!nS{(6TXk2T$FE8KarjsxzzuOT~L>_E9xHd zJNWbk;)Ok5C<3s0VoWhMOYy-l3Qfq|L3gB-e3@jTGNlh=c$P1AVonfIzyD=l(R0;gFPrMjn=D3Hwt zErVX_&+hG4s&L&@&cd%N4t5xHKba~k4-{L7qFZcY450W=CtL%#eljJ8NSZ@*k_#Xxg=6)W-*?!lf%BD0!HYQqUMr+Rv ztHFfR^UolA0Ce}g#&wgbN6#tb%Rk5|Vja0#1K*S0c0ji|hCr*x;SC9&;ZXbG=;RMf z7gxzOs^%ba*&&bVQc&kCQQn8|9p7Q&)4dcy1oM?)%Y_%2zN>gIhjXgH{?|_4_;{V$ z1r=GLLznX*6Zdb98QI2utow%snz^M9bzR;S^c zUv$NY?l>n4l>k!BAhCA%p%dc&XAZNa&rXP{Nx`eAJ*T~UmmYM zluuQn$niwVkkX9i67!fvs=so?`8Doa-(&-c9+3C_rokg^{XSk>32tY!|G{zm_SQ;M zKJ(vFXH8e`Rnqccvx(8OJX2`f-qvP+($?Mj|0dLLHxG;1cD!&4rIp)xvp%FWqyD5y zx}tk>%#Xe8>b1K6tm+E?e^<5px)S@R+@AYiJZT#E_$8f6Vdf+d{HYRdof9=8D!qBY zbm~4#fg7`57Z23kW#(!Jyl1kI{ilN9LSowW0t1HPK@eURY824wQq2)fhWHOWFMTJP zo|KX|0vsl&=e{9j`Nt>3r6U3z)952Q8$kJ+$0wQKB7h#|!_x&P#K+sx$iji;e+;f2 z#di%CoIbZ(d@xbavz$j@fDKtc*}5UH8CP(}VMD8ecl}96vO{3G6!Cq>z;aYV<+0fT zwS1%YlT{Dzkuk5%7tC~A={E5VzUU*G^zs;a?)j?8f%1v{VmI3Y1Gp&gA$I#@o6jf| z;?|CbqE1z%#Kis8MDokBXve8a_KJDG@V%H^ZSP{mH5(t(OzEt%CEy+aX)P%%w}o>o zlTG5oCraNSzw4zVh~XluFL@75G4W?f{!lK^@0@ew6pyI#9xU+(d8=tMCWh=Cy6x?S zTGD?a3bt*|AW0PUh@mrgiXgL%7XJ)k+9J0AP?Wcb8LLj=fEb;|C@_b+wfE~cyHe6% z`f{;-ys;apvKbyt1M_JdGQns4eP@SyLXoRVCRIEN7%%RuN`pRThXzNpDv?EYwl@nx zqaY3{&I-@)6Xu4>(ngS8n<-t9>kHMJP9``@Z9b%&+q1BAPl0FX>Vm51#GdE#(iM}9 z*q&QJtN+HiX3>Y(w(aM@-uyenCi%TrdXoFWqzmH?tq{{Co92}e%pwbt09@SHuU?ON z{;u;}O*!UN!>B0gTU|^*u2z2st0>!VrG0bHpM8+bhz3wN(D6DA1kIwcN+U@+;!82I z^Mg7r;_6JH0SWIAi5@ocF`bkq0}KkU@44W2x4iWbNoehBUc`SD?B4AWu7@aC0qc{`ilO z5Uquy*J48=hig8uo-igJCBYgfo6opWQ;it5Y0COog`wNqu`u60e=|sak!p{TiFwB8 zgf%ohq62DnmFEe19>|Xf5OJN77*@<^d`49;FvM*dH{7VN=0&O@z3J?F0)VLRga4Y@ zLlz{|)4d9!3X0j`<{#CBUiu2TLqchq`8KXJH@X>n+7Ew1DF+(nN7<)BHxn|9uH}aOFRjvY z^KD1i;zbPVTZV%@(kidVKe;+Rpg$`Vzp8;(d7#wRmnJ>@-}M0Xz*$SOAve9_!YDui zLORFE6I*HLPry%vJj05G->rhU;~;7VC|~YWNDO~c*1-;0xL=oPGPLWptGses$Y*$O zK@(>(L`lwoA{pJ33$3vYYWdCWIcp!&`5o{T(VloI&V5zJ5CLsH^c$yNJQatj~f0wG7rv*=>&gRce6d8m$r2;akyUS*a?rB65r42jE?TuS+N&;A+AhyJ@?|Q{6_Cw z3+l2;I>fZOz1Dr00qO5e`IWJxJY#YIdttNKUm;BjF%X}B5mU2O(Fq&#TPh9#O^KeX z`uQ~4JRimof>hq@pw7_|e7Ft;xN?6C4_SU$)D`E1OrJ>By-(N^8YQppxwC)i2$kKZ;=$e8za6`9_xvFR`+UU zZ>(p^0YmstWSmXYm4M@SaP;8AK_a3bjAp9Nc&at0`jxt+GOx3H;ocKCdcGtM%rk0# zA|5w%QPJ)81qHa}8E?0zCI`;<@Y6Ar>{?}j?%NMtpEU@HSp>O@!L^2(y4`B<4m-Q= zt)68KUghmJ)jI-22OakBo4V#oxDwI5-1!w1C{=x$`s_FVoh#IOpWEm0kX>Uk>)F6N z!5Qexz?Cv}2=D!6!wee4kVpKptJHckvS_@8au=7^VE$$e=-(V;I^XO85-Dut$p)KS zVI2K?u9TKzpG7lG^{ERnT+_Er+S{wZb}?JAR(7SFnxDT~=}&B2{5=Z@5ZHEFSax2{ z?LGZRWtIRw_wsE1ym;EagqF`XyX?zY9Syl)dTBP!AP5xx?KEw|2!j{nS)7p%>X))1 zM|IvY!SAEm!Om)N`Elm>ICO%vP*I?3+kufM*)to7?T^eXFc4MErjXU##IAy_$q(;k zbzf}Plq*F$?Kvx=t8L*Zz&+k$i&UpFa8cmEfB{qV z%)yx?+jcG@{R=yz*`Vb`swO#S9Ps=oPsv**JJ~GMxF>TwNO<~dOv0Ht$-7}n6V++e2btjeVaDy&sVim*8MLRS^p>(FSMtrYDVh8cdf)}3IsBkn>-h#RV}X?K>Cd|Q|I{Y$ltTzWg%CG9 zfT7w|a$KuYSf9+&t4q5oY}FV+Pk`EvK#!s&4Jgzn{Xa;^_i+Bw3hR`5GYs4b4d`?kBMYSE*yXF zKPB1K7RAX;GVnT08|rKP3O@fn;wMd^W>^c5zWZ;JcEr;2R^y~245e3)_4^%9(BA9y z{)F=GtgH`%8UUm)(&o%3V!?+Ufs6WTbJ`Q>ZFE=bhAQJ5=kHX!t!|$`l%CWyzEfT4 zUjB_J<*$eA=y7*d`r|9M5#o$oj`d*goRuxx3hfh;C##2$e~^4`*sM_1-Jj-BKsTtU z0n$!4#rmV+_{G2$Kka5u7vR;UujNa_X+z8pY6a55UEHjGj`#qf4`YJ0f7 z8}r_*FyA=pRzVLAVL{QF6TU%e!a^yh%NVVRJQ9e1Akj5X*Y%mgH1*pjp|?zkpgH8~ zgw=_C>xykHJi3WrPMx(!Z>x!}2(H7e>XK z3!(>9P+o+xR&p2Vy)v09FT6`?Q|3m*?LNx0JU}KapJD~)K>KJtkN+*@MdG@8b8+Oe_U+9oSHMBq^y>cc; z@+S{%ZoMA8sv0}01x+vUS9D@b?o>e=524j5N>Nu5i|r@h!Onc!@DI@YiJgvZPUC@O zSXQ62dT@4A`~yknF)QyqNbg*e%o1wR#&8-JU!e4dOp|o4h7O9)wU(I!Mknx^WWnMy z4QtZ~#<=&&r5KTp;nth5SZISAgfHWZ!s#v`ixsAUkP73S)#6RsU{XV9FGRuR?{=48 zY7H+Krfx@Z1&jC_LSu3st zbqZ=d`QIvy7M4)kdF9Nw(dtW2(soRHvDs{AtHc;%C}Yl)ZDVW%Q&0I;&YbHwK>PsI znZNx{%gMrhrJ&58@8{;-)%L;|&hc{PDvtW@7b@*Nn>?hj(q%w14u78%dC({a#;r?A zxQZ`ra%l^puZvlWV;}#a^muh1-U{+2+VM%v%Fww z$|hlH)=|@7vF<|9&(pf?WoZZfX)p54@LS6vk)+9pS^vR%!&y&3Y{ALuedaQaed3MbvX*jr0M6{wvzsHa?s zeVV_mKeRV`{c$B`C#14(x2)I;RJU92x2YDNcrl}6-KT(hc~}jU>16b|z)2GeQj(c& zMsK7=N4*S7y+5Zt`(X^gnzr3S#)wLN<>KoI24Mm0SFGE4DBk(62UJ}@5>m?RAyKh& z6@g)?H-3g;Q7@Mdv zFOfn8&V@e%@e1oV%`~Ps#|C*9X9H#K9o&6ZV(%+28y3T4iPKk_IejQb!0i=o8ofB8Pt67Mv>25e0v^UQ+ zbnUFIpOXoCk30jU63BQ_6e7jWo$uwO>kkLXJ%a5*S6@cu3}pR;b-r2Q?g6MIfU$wp zDQ#LQCk$3F(7upr_4F1P$he{M-sZy z=cg(Z);;!85(DYnKiIz#;CGxu;c4#hp~HXuqUS??#K;&!v?QJUQ0JU7mq@8WNo&6^_|kxg_1XIZUyazt7FrZ1%@)4 zTS@A1!||WifsDjLjRzU6wc(`ot7j2hKBxO#RH z+I#W*t%!Tx_uU&53rg1CK8lfm& zwDgD8WFP~Nw(1Q~NRR(#aW@DR8CSV2UTGTme!6bvuu>*Pw-$Djf89qk~$;teV+&LCfF2=~z}p0B(-T>c4C)VOc0%mK+;2c6S_|qpos7U zy(wajClXPT-{z?;Nd}UT()bb4{l_dkNtI&oQpBwK_({M_0D!&Wats3Fm?LPZ zZ4d+TyK^{90R#=C4m&t{B}@Os3sKPOi%Y}w@NU>eeRP_g@=_Fif1=N`{Gr_Mf^2|F z7c=Ik((h(V*(?he$t-icD?C{G(JZDJaq~EIsy&J{&KyEt6Ho4>c>r-Wvp%qpoS9b7 z0yK&jmuvb0FoUg39KQV#9QMv)=CQM9c+znI=(VT<5mR&Z)i6IK0Zj)iR?Nw0 zo(Hvke8Bkkav6Hfge@SI@wR!zcU>40 zqe1#OGeRK@P7beUZYyi=KsL<9-E`Y0>d1Ygf&Z{h(>bum+|)UUp+%U3})?VyVV)elJK>B zUX-g}pujWAwoE3tsgAzhu?z=_I{<$iT}~2<@x~_}4>_s$Oq^xiuZt@jX_?#7(4oHZ z@6mS~wiG1>$6j|;2=@EN&9?JG(-GktIlxZ2X3bYeHt8iZI>3u@r7i1G%-Au+v#xc(^cj5TOT3Nt^4OOI z_xYvVX23ysV=x!9#N5tsR^x&jfxU-puy3&AoL|fYfFw*?ey=z>ie?|gk`%d!4pR8D zdIdMq%y?rq^qFgSqhGzr3FyXp%1w7$1tQFSH^3*`UI$JFTd8Aj=b+DhWo`v0-Lg6% zPH`{o3lBcS|9S3YtYN-+PF~=Z<;13{OJAIPM&1_75YFVomYu`rp1Q(bYS}eNzB=E% zUEFB;`}hzc4w0L9-aR=os1;|6ku}HmR@G4T9U&{6$V^jF^ZNw6Z1gk{a!pl!?SfXN zmi07fI6PXc`VIX7Bup)oSP3_XGn1lY&au_$35n35vPjFYAd+|eFBk(lV6&lCjI*JrKx1buY>mp#v~k! z?@8L{=*aBVd)&;tsO9h3PH0lQXjd?sVi{ws4>LAWqi00WPtjg#8AbDj*dG1;=H7Xx zRR+4FA?LMY`0C1wui|5Y5yk-`exe#YXED5bXutD!G4l_kko&H&L5AO^t}5=0i`}fk zp2CvDhHCHP^o9QT~eP**E$Cpd!j zr>$;cyNd;;TaHnbOo$sblx>|uK2yo#%!h&msP_WHsEW^Ns;|nBx|9L}Q4@)*4dr)u zBOq?j3|~=B7Si;xGZ5@$E(M)Mql4!d?a~c6M56i2In%z=7IwSF0&#oEPQ>_A zs_y5P-Qwj``aT7~xs=nDEfc5RhI?90lcX{c7G28Kee1I545ddW3D4;{0L0aFhY8Rx zuw;SxwT;vxZNGu{H4TZs;eQgX{#FoKtX6-!hZGf6SfC1hZn;P|TDSvN^9r-%F!P#jT}QKxZ2ge~ z-kdc#;Vp{-gMVp#$(z{;i1IrJrt!}<`n%i({+-jf6bwOSZ_|_Dqn8Y6n#1n(@Mc5Ouv(4RltZ+2l%yZc2)mK zN>Gwj=!rZt6Gv$-1(UhZ)Ua)Rd=bZNuZejEjS=J}ro?8}UEL?tSC}3@YLw4hxj!8} zENvQ9?z6x@RQmpHu>a1l8rRMfqND=JcAshae_0%}mW=@*16)aLtW|<@Nu}lIm KWhdSK`M&@vOl`mb diff --git a/media/domoticz.png b/media/domoticz.png deleted file mode 100644 index 4350c23c9a8a2071d39c6da3d1e2f968f2767b07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27057 zcmZ5{WmH>DxHV2FQlv$SOQ9_qBtUR?DU<@m3B@TIT#6Ja4#ll_ad!yr?(Xhx!EWCB z-Cy5YIXUb6o0&7SpJ&SnQB{_~ef91Y5)u-woUEi8;@4!FM-!din`nYx$tnKMf?GcJ(&^S|x_PA>Hy=kvCsQU4P)RsQ*hxwiMwPe@kF=@lKK0cbFFI+uym5QpdydrL}o# zE`_?@jfj;d6 z)0&|Axkdv8+P3B2fs}>G&C>?s>u4Q#3dW478meB>R>jVj3)#ZI%9ICJJ3nwnIqUi8 z9y*@U>k;pX1w|-&Z`#XMcu$VI$VR`r_3F<0e4`APP4{L`@;N4}tZ^M@+}^2nDz@m0 zI_z~m64he8R9o{FK$Imf7E0IltHO=kP+EUN&sC6dcy%Ull`BZ}aJ>!J@fT`qc-pL-#Zmc(()~ym6wys5i0lf}-ep~d-be-^r zGt^^e4Ej_OotSQ7qv7-vN= z8pXbh_4?d3UGRiwPU<`WwsTvXGmw_FCBAUU$obKBEur*q^&Vcss#2o#KD{4mqO5!1 z_WsWS5V+}oKS;nnh;B^ndUhUGk*QXo`?RLD9^Wb;=rUMZ(6OEG5I1c{pUU$Ry}-uz|GdmFqc%unrKAweF1E+XHtwyCAwo4-F zmcyNCwkF1v+PvD7?|LeY<8A9YMOW~m%lc)9Ha46VVD2`Ho>ppUbFji|Se?PrecxLz zR*x#|{mt3Z>x*(x{dnF>_E7W=Gn}8d8nPns*fU?h?DvdPC$-+Ek1tt07B*U+D%xMW zj;r{6Rp3EP;O%ccB(q$+V;OF+8T|}ql+Aez|PC$=q2%;rLc_J_DOhzIGlg z0{hsv?Rh0)r1Ip6MjfABlwJ3c=A_aG0)CX>koHJx!KOlrBV_7tu*Tx$x15WAtTbhp zJ;_kRY9CfKZ(Rg2AYith>9BJJ0`_|@0F|ih)2LFy4_9Nb%foDh*=ns-W4(o-f%1c$ zbxklQs`KF;DJ2Tz>m2@2O8sz(XmBug#8rPSpEDgrTkiJ=BSjlS#*V!;B*tdR>zU9d zJl&?eV=ECCi{9I^eXG^kZMRAG?QUOJIW~O3^eDFm8ZAe2PLKJ{&FwltpoZ(>tjdT1 z*ua-7L@*~*$vsfP1x%!4f-&N5*vY-)iBVC*62m=TUa*Pp=d_PM6dE@Eiuc;KImhD` zUORMayE=3Er0L{xw7isSN)uofld$A9pkV5|mgHwJ?74a>1U6{AAH7v-J(jJ#famAE z(oxrUUa=Qw(;rpQ9tHAO8mI{*A@aLSCZMZj#f*%4 zLa*ZAep`24OR+Gs{Ft`d;MQ4Zt3UgwNEe-$f2OckdH5cR;fp%itoljM{iUGe*x;S6 z>uoEJX;~_>W=fIg$6w`m)$K7%){1V<@mV#CbR;0+Fp3}H2b!~b->7<{~C`76CEeF2B(sT){VsMwm(-UvEE-o zVhn?=1R`Qbk`k-`Ok%6+acc#t_Ib{qxj8v@57BjQc|$C_D_h#UsnEM~a%6uAtMz%_Cg=6M=6Onb!v6?MWUte&#zrHSG0yo5I!zyGxwq=wS-HLT zy|-G&Xs-E^OMZo~AT$QpIl{kyIw)9e#LxU-+IUs6jxIA6vDK%K5-AhUuawekDmnB% zQZp3~xg!1xoyRh~mT9%wYuccB_xBBEor`nC;a(^ndm%a;*p4XuqHJZ({!F5-_~~-C#PX@Lf;@`KD%(|6AQau2HNUQ&ORn2xV+71v44Vhgjz&5n-c?ABBsW4&tp7fE<|2R z)aUC&_~KhlvQ%v*#0CJ-{%GZ|ol<9@XY)oQ5pu1ilxeg3PCqW8!aqHg9EQvT=5i&v z&H=N}3lBfFtef$jD`Z)IR)uJ`Sn55f+cp$GaJlG?KeLzZ9Sfm{Zb_Xh&$_jWo>jh5 zGv(HST|JL41wGHg_FayWK3;dc*O+q=CJo0U>=gdD#|!_|*azsr@ITJ2?xfKniZ))8 zbm|B>`+p#aOWsdwd|3MnDFIX}hz#h*vLR$^;0)-puQOoT*S39x3iT zyWN^Z&m81;_p__IXP00?NPR!ZOBRRU1p69BXzdFa=XSyim?w`|JxXYQBuC=&dxp)>hm-6z69r0i^TT zwV9gwr3abrcptn_r954GNMG=_ZJ2w?X}B0doPy^_`6ifjh=vxAX>`E>2z;pRGj>Cp z_p^h)qll&GtZ5y2vfINSlKIV7|Gqj_-ZeL+&gpTjm;D$XJL_C?)OiL=6K(y5G_U6N^~00x$?FD1E^L-PpZ} zY-#h7Zh=Kq9wG;xBb49CqUY40U`+1Z<_Y-75bSof`6RZkw8ZnFwnS&w&^OhE_jGp} zWjsM+#S{N3J@MOJT%;iX6EzjZU`fH*6GqlJvS=423)AV^huH|gY+be^_gsW5no9X& zFe?S;cYGRtGGl#*;Ck4CUWlUsv}M44xV}C_en{Qm@n&ECqgfL<>mHnn4)%^L!LRo{`89*kk{NhU&D0g=A_uiKL}){?^HAo?*-7bm7j2La1US9^I)Wy$wL{P=il zB@XsYXoak*d3(9|xfjyZboLXUUVw`oo1PvynCWMycUWmY55Ma}u3m=6%k*)^)A?X+ zx}d=b-EKDumfwRqQMabe13dFr;FAL*QFkTK=;IfE2SU2(oUapxd2O8rU zr^P#j7G3h_ezOd6Q8nB0Yk!9}FAnLf8HGL=KBW3rY~_~%f|Q!{(LRTohZo@XC98)t zSk2UVZnLkFM?c!Q|0u>(6dhYrz%1k6iz8WKKJzA4#TWIXzpiyj+WRI1SE$} zO8u^{b|)G~J_5UT(B;JQ0V@D(X)CgL1RpWi;O{JKsMde?Hy$pG^V4Nb@*`6e&1D^P z;Gj#Vg49?F6+AxOHkR12BAANbICg8@a~ z!*Vpxg$k*?+X6A#0*Uf?H!}gSj6~q(-TOnNE$kRXu^Oh=eKk!ojqOOgc=Uurgn8vol0L{yRq`Mt8_`GYF@wzuSq?g6)kYztXft zk{O2zh^ZZzxcL-EVFlbIefI{U`CxJwV3-a8^wTQY95D2z{B^ssUr5mkAB}sQ7Qnou zzJFA2c#V6!IP0(Zj?YXLT53N+0ytqw=iJ@h^@vbm^u8~JT%OJgXzEMdQe@I7vdJbx z`|Rn={k@2Sa2)|nxHGf|)=G0wnmOL)T&`v$hdgCt?tEM`fn>yx(HwDfdZWPH;n)~) z<80#bX8JRsYorNpY5f5~;F548toB3DtGK_rDGwyxoAgZ%t#-3qqt$Dv?F|y`j=_$w zPxee^rlw%(l*^Ut5FxHspBHoQ7CcpAWJl)@5ecZ_9JRv=m~Ew7;aGw1nbKf-G^(YP z1w6Hss1P|Yu30M*^q~SR4cH#_4(*V^w$7L14XOQtEKngx%UGwRpldDC)(YNtI9m+A z@pf<+v4#K097vX#RxRr5|b|3jVa(ia{FW+mFi^L!{-x^S)VY;>AHwHJf zbClv(I!+!Y^Ueynh8@X&rdFNXT-L&b63RrJjBZ_OPBCR}Bi4bPGl1MhZ{F5jl zBLPpe@9VEZ?oTw&ZWm@81|o(nMG*t0{N2NmfCcho9frvb%>#3Lc9_eW5AT<#SI_eF z$^!V`Jn>&^_weh`ltT())v*^_dA07Ysl&Exzx})WNcqawzujJ%n6zX*40aI+o&pHb7Z5Dn+X62 zB+BK!&-E~HgK~(GtUmGAsy3|q2q(Qfl?guI?KrxzJIs*#rDeJlW9;s*xtla!S+(8{ zZRzCyo;IbN@z0b&<)R|x|JlJ11WmOJ?5Eo%U>FB8zkw%5c5(M2ifUq#i;+31oSBIw zeWmRYMA;gbF;9#$RAS0PoGXimkk+uYR9LY*dYf#^GD4!35hb{v!y>wBfNxQZuNtuS z^E#c34YoenG(dfK=#j4NRZ85?Z?V-7%Ouch&+>Aja+Kya>(u|61QQSKHHPUQZW+0= z34*-X*lW7P-tY<@RkM{C20BGuOnX_23}YixV{1}8knRkFjckO`f%JbTB1{@g5{dC( zN?+H~7>q$6@&;3Kyg zYWqRhgO3E8!T#Tr=cNd)$!d*lY4t1TPfHd7EA}Xk03$*zl66Gytc~gCnMMbe<>nXX z4RE%myiTxT;3q-5G$$p;H>3ZjuVgG8;+4jgGs>7ClR+eQwv{Z}*WeluVj&S|Q$mof z+>6uQd_!PwLu+d-i&JYu6~(MEyXsi{xHzwr#w&Q%hHCcYy;aPH-&_sm*O_y0rM-(w zQ}4FPEqr$T9^CiSJpYGiTLHQ5FzqnyPT!8nJpjU$`B{^iaf_Q>?D|!V;xMpeIf_Wo z|6t6Vw6hYgWQ$I;1w>$f%r{7nDQAW@4_oI4;F|(y!jwCIgz8Rd3!;4704giuHnRI( zH2)GWe`;c4ZguGzwdPw)_-0n(AoxU?GGgoLOn0l0!Owl$qx)Vq2sw>ZP&FDE3o~1p zq!$?WQ3}aPEzo zLBEaUSXxat?m4pvM9mB;Uz{LZ04#|19MxyDN2Y#w+9Jtd_da8Xd9!;>;7w^aEP<`^ z{|THnS3Rw_H`IAKoF3U8rGLDZa$ca~^8@AJi3wXDxQdZZPRQw-K*4DDxUM66sN(Bf zT1@cr5T6zLW*pBEdTsyX9FS#5FQH(ADOTIvTkDV1iN_nJ9guCCt^Jav7B%PL z<_Hb&~;xo`GfT!uaMSjrXuS z62*h~=ld+uJp*oPv_r9|#G0{YjGeuDW|}2+4G>jwf;O>t=&ZvCaY9BY1s(o~|E7V) z$Y4GN&sb+Q2Yk%NE#LwMyp1(XTjou3$TfU=?q5UASbcIQ(5 z`td1bKEof~fl}z411B)#hyy!Z%5}%Y4J~=gQa?a^jsnbv#}%6I%=eY6p9A#Mnl-8! z+unZG`*W$=l~f|d&WB9I2}wnZG+YTRYDVs{G);_}6l9dNrtAyS7IG5pQKbBe%*qoY z8t7u#-ddBoch}(aynbv${j?{e`KS=i+$ehH!3jI%6>@ii#|O#05)sfWtY&vR>kGtf zZ8CAanjfbzxTKi)GtR{hWt79?O|%l&2x25Fp8fG}lHw9jDsd9znG!cZJ1V@uNgE{h zfZ@la`4A>8*s!n$&WU&&E9Q?1AcH5Hs8ol6d(&^{s}mJHvPt!HKu#6;7pb z+`bE;A&<&)2epvMWsr*E+YYmxoy`U+%5Rs;B)0 zulG|-$8wYN@uwxX-8AM4j>fk-G`FihK9CGSz?v#so^NklS}vs9e7?>a3G`bMGm-_5C!aV zxGMhT)pqKV6{2aQG55#QV4K-Dc}QdGGF!Vw^?W)rq}kn@r6|x;;b6-8v&J1^B(0)D zj;(b{LIlR=W#zl zna`6@uY;cFuhYw^Uo5l;>OZVa%P?Cmyd$AIav<#`g>`VfvmgjP+^lIs%2!&mc;3`T z)zxAyL<%(_9AT5Vl&WzNETaPR=X*POD&s1WbZ`dCdLiAgHYx`NPtxVUKI@rSX6y&A zAf~Vo4nIqd_ZXB4iS#moY}o$r={>HZ^)Tg|92MK+Xm7u~i5OWqbCGeN=C4%MQxF0P zWQxH;>i`KOa|={WIcJVNj_nC38M&7H2fJ1J2C`yY9LJ7u$U&aS-os-e-rivR8N+x=e%uWl-;v;`C|qaqjZn6jD}nDV(WzX|I^j`&Ci-=!FaPzm5YfRIX{yE%L_#>;Z|T*v zr%j)$o{%YIe~58_zCI#&h1f!Cq12QIK0=x6@;F>}>@8Wq)ub(QtiYn1_FC}l=Pi78 zwRt}>Bk3WxELF=@q2SY~>=;v%&WNvs);EMg#zRM6uIvEV3`I&FdrqlyE_^{w&`1Gu z+8v#LqhkCy(mzw~h304v43YltWrtdP7aZw*^UP!2{6@V{DE7;uyUvu-A$UqD1^fl8 zXP0Ja?s7gTB90UW2#yR9h^#;er34}Kg4QOwel=g4weS{D*+1{4=(b!A8az8Z*Dn6J zRKB(PUokA4wkyO8xfyU3=oxb9uNo)gtO z9_STjUqj0j8pR3#$>mcH1?1q>#_eZ!VCSS)z$bJyvW zAtHF&W0oJP(-E=3c=Q+f6d)e-%cv4iR)xP{xY}h1u^#y)0bIcMpSNAEm)2Wd73bY_ zec6)7S(K4Yqf7wNDfenccmqqqdha>q?$+`Rb9JYtbA*xDseE2W2B$_>%cV>F9*9v{ zI1<4b^iaXWI7A8RX=+P$fT@z_ENf3XTN^%`i8w- z%~rAIl)HBE38+!r438Zhem?NMzX1O=n)!7Or^LX|bt7}WFr2c$uf;J+~49oQu95Deq4RM()r85=R z?7^M6Q$5W^KTNOuQPdoGrhnOOeF6)oeU8`VjQ7GAX9mu-`uH5~-YBm+xWcO6{>x>> z8w$sZWn>ujrsVDi4)ucq&#cITY?sGMYoWXal60A6-JMd#Oo7MrIU^AY zuRWWdNeo%K=C|$NXDKy{)iQi;-yX1P7MF&$G*Jg`GSS+I>sV3U*Q%o$-)XD5GS?aC$}GmnNoa295k4 zY#mCkh1RIXOe99$wf}Pj09I)W#Y`7#Og41+{z%c0p18|gpK*6{b_l8|ifnZYb?>~< zhnpgcQ9<4*91q&Z3DOawO2pIB9;&Ukh$#n^TQ%DJ=1eJnJ5^JLAh|P=*Whv)lkji!PA!vp4X3H5bA?& zQjvKw|42aYjFH)y$f_VMF*k!9+30@I$SCzbAHDIinq_}oSnYxWo&WA z%gA;+ZIwT+wd9iz(a}M*T|W>8qO(W3SHm<^Hlbx1>1xAoGsFmVZR4=a8 zPs;f%2|?DeqoVq~q-vd@`|=7m#>51eqIHy>Kc>y50FP^%=FKj*LhpX+$|yCOlfeb{ z>~+!YYNc3B8(C6NBVJ5Cq?B?%Qq>HNA0%!(z$MdsQ$x1XXMxETEB+(zX!)_rle}dc z+mW;tzr}=Q7ss#l_Uxp7Q=&v=N8R@2+3tB&@y!$Cq#Sn`E`oN()Ire{%ns@8ELfFM zFtA2xY+G`4^lA$&?p-WMMB5r>lI8vt&D0dlXO-cF?R+WdP#Kww+8iY!7GtzFq4=C{ z#8-`mxnC&Z@YA^4D&<1~s_o)<#e+tfdt7TOS6>VX!28C2*QV~hT7vET^Lf6R@Y$Wo z{i}oMR&*gZsjkHLaI#N$El3yI<06X-0jcVe)gp>1>x z&Jsb%%o@{d^-FYXsyeX~6htX9vdV#*uFi>})5y9{KNo-gQH$fXws1eoQaaoztKazj z-oTXgo)B9_DF|dOs~ktDd6LSq`enANoIZ2?$i$qm&)FQX&=wXWA@c`R%(34PHuC#S z-o-LA=hGdLO!Lr0GyfSK(3+YS>a4pE%tr~~hj&+VQtb{h7&)qukSs1mf2MAL#=?^h zX96HBkp%Y({{)ard)_Ve7~-W>dJFJIJh2os&{=oi2uKYePtz zzi-tOuDABBJLo%JDE7=&n zKY=B%Y(JfJqyvS0!@I37pn0WC)_6`>{NSj*n!q01^M8dhL9SybXXI@*#R%Qq$xMya z;#66)rT@3tWgG^njvOvjmfq{W#9;*%DW?Aj6kTKkhIt{(a{t7<(eilVq^51`$%)iD zEO*7Ag1fOQTTBJFUSv1{?p+WOtDf9*0&S!dpOc*D-Oy2`x*rsnM}=&jS3 z+3Xp=kwsp9k16Lb2o0@J`dQI!i}Es0srhdt{)^2JfqA9XB_kk2V#n2f1Phc(O0n5- zv4dE+TK z!OZLYFT-csz0ngI?h!yQVKziC3fjrEa>eMa4?CuJGIiy40_pWN|M+Wj`4y)#RKygw zA_sk9ax(Tq!X!y&%?@0aiH{b+dmjLm9}PMEN+c2!N640_I``V5fcuc1%wXy9O?%<{ zxnTH8w6;c=;QYyvIE=70(dZO2f(<5oQ_V2l+EQy!a%@c}j8K@edg+E(l`l9M2|hyh z=NRxHM$$+>tcC5Ld@UDyDk^}@&@o?EZe5zYb(*i7LPE#K8Em>=uKn3wC1SXt$~hAn z8507*TOWSC@#V)zKAM@%^ePbJyZ=cQbeVA~R0?x(3LIfzkJG#*L21@K(<>ogXSs;b zEY4*r8k|*s`0emg%Y;^hBJItw9}>HEL895 z>1hR1_{?{uNjlkkJu_s087k|P7cT{V6QT`9yNrRbxUCsG0d$y=GaHOGmR+pl^`GE6 z>V>RnIr$$p%*VxCnm1-M&@F8Y6$8nwEUXww9td$Eft%oC*Wt2LnKz^f?D(}S5%cVf zefCLtIr$U&0r2M)`*To4u2b^;J~QiQU{5kJsPA&ePV)W7u=J z$R}O5ZOWCE77r^i>`=C-ML1k7VcC7K+sB*1b=7rzl@tUZ*Uqh|p@pb1LkYqImn_K2 z$j5RIoJIn3yQ_L*CA4cUzYrf49{li=Lct_sLVikJxV1peq-5MW?gEa@+*jft=BU4u zXredt>wEhf(IBSkY6H@>knDV(67WLG)NMLBuH3xAiKhuQ(sALoX>nzFo=e zSZbPzZJxBp+CaPqe{d{FWFyC$Tf(O?S-lWlzaZ1&6RKBFh+L6Ob27xDsmBr7`nJzW zZ26|YcM2fV54^cUI*2Hnm#k5y+%XL3B=U1O=8!>>c~Fw`xk@NabvL{2E0sBaecEOt zc?6LskDy)g*Y$b2wjpP0T_>@N$*vu2gY5J+j5gRZa0+G zmrsm*Q^nV$ybp#T{3Wu<+)48OdGBmee?H1FGPVdCuac{)u4x+!=wdAuba=rTYHu6+ zZ8G}nNA~6%X@0zXul@i#JvHF0Y$R~@{a3WLkzMA4+n4QN_@GDRN9v5~;V7vRcYtJj zUi3))LhvMLjOV@oKCeyMOAV?(>*Mh4lBc7#&&aN1wn8!5GyEX@<%VSO@#MMAYg_Av z*fm;yiYJVQ2;^5d*-z@{!Wd!3=kgA}H=8J5qMW?9YJEcLH)2K*EB~iCXM9AwDETxP z`K(vIvq}o;Q26&I(sWuvCU4p+C~vycPK3wcLc>P}<0Su#9)d40kYTgdYwOA$WLE2O zqxjF7KtJ`n$h&Y4dddzc3&JzY33fhkLMpH7p5U_bdI@QIfk)n(_J;(zoCWLl+dj>< zAAS9&?(++aH;d<>`U+~?d52;zKuw0Uj({4zbjnRsx@&v!@HfbP(Fu30l#_%?>6g0^f@@gQZJ|fx$V3YMdgsTH;ax!- zYiyETsTNjC36(oEGSnvOtqqI`V{o2z3Q}MNvKE!sj$(wMH#@U=`e;5|BcI5-=iz6J zLmJQ-e705i{Ie|iLsMf$D$C7-us+~0zTRGw&b;&PU88?y36URv;8ku##%3y8r?kz1A89Zg3@j{JyAQIVc77O!o}_hXJYuWHqOC479`;`(M(utfOTfAe5U zH@d@#z+~1j{%2j=-Rn`4vgZ0Asu_}-Y0C`Vt@$1bFJ~miJY2l!!PGT`>Mcvq?0_(> zSCkU050FNiHX{VYSA6TyHhnD~^g@ zUNVudD^97^J$fCkdZBBk$h^>7oIQmIuO!mi$f!n+Uo95OZU;OGSO01m&o#$6+Cspg z4S`Fufa-|OXil)1uO4PYUzOgV`o5%QZ54T|gE(~n>f2>t_#792X1oq+)uCYWl}U)* zbAappoE<{!y?;|+fA!1&_uC8zo&(e7C|{UMy4uj2=m5wd=`lOwJGUw}l;p)+A>rSM zKSpv84u|6VZj`S-bJkOpVsrIJml2VhVE-&dy8YyGDwylNn-Vnb8zRUOqncAy^~#z) zPWIm+FSH$Hyslx1?HHADkV%JeI6K^siZ^gJXT%Zbq@cg}5fQcb0Mm zDfc&;gBVJI=Dc`CUKadE;&&X*{_gbr7*LE$4tfqIT4)3ZZHEq>c0La6spV^_XwHe5 z5L^PfsIQldnUR4Qm)5~i$i3f(N->QZKJU?3De7;YD>{s>*k2pKyhU+`*Xt6sot%Bm z2o!}%K3*3dx4?7B79zr8j}KF!bZ-_wWi~f9>Fw`+C_Kcq9kRsxk32tnQ`*u0@J0Ji zj1ie$cy(^V-i#59sqQ#|VG1%aBOL;on^A(%dZQw{(3l441IX41)JAEwskn9sYFRfq zO*^})X=}{YCjujCzQ+_&>VK!lYEVS6mQBRQg-J+dc+fae)_4_7D`4E+)xA0u;V5_> z^gS<&q`)F@1HHAhGoI@1A;tP9 z6{Oxzrqx4>*POvW{)WFnm4Wxvy6u}IvTX}$G@gItBQTOycwK2Ui8?zFaxTl{On#q zhEPfzoRcGYNIM?9brJseX-S5>(i?<}9tfDdClH_ugZE5fn0#daU@*b+lrpP$`#i1L z3db`^v%QtREydW1rEWQFDp?&Ug@^7|hPZUjgPVs4j|mUJd5&Fb;NvBN0A~i0{P05w z-3MZ&fUPi_{mlij&Q}DokrD;|V4d0doM%L|MNP!3+j4q5wK&D3;^zh5zMa@mLZOrG z`I8sXf%dD^&bUVQ3p=6o8+mz(;tF&OBqKC*A`)W$YCAVYJRpJv>AMjyRvYT+69dp z|85e@b@tP`ALA^07Zx15 zlv;t4rf>DTU-mp?rX@=ir}+6o#&&5E)<*3MsI$1hj+aLg6WqQK?uf2nzIVw?%8P_U zhb)tS%vXwMbAK#Ni@;@*{ zWGe=9_ygBzSih~18U=E^afq1}MpcqW7>FpnW96HbIPaGv&CKq|#98I09yypY>N$F= z#)eaxrhJ|&SPSbk9*;E4^1RwkAY2C_v5r?RuR1NWjw{%SBo@N>SW)ym%R6lnHZxS) zgpoo*Y(p9hhSaHn`z$ero!`(LSqx*XkFDyye!WaYDljQ*aDilOlIZgwM&0k^p`hVr z1I3l4G4n@I;fpX?V3-9F?Vx%`y)xmJB_5ZKjIMc1yRajoi(kZJVD75M>Z?BrMN@l& zt%tU#kdOpLfSyZPtNi8fiQB7ch#(OYMKWSGL3Czhl?r+oslG}en zgS(ziE*d}8d_o~5XmI9;#qzzb4FBtlCdO#VK|ti^Mk1P0mNUy;S2nC`-~INWhul^d z{+`&ovL4;|xWpB>R*%01D#%8e5*wBa-{Pwfv%eaD3)^Dg+nMMQKP3GkO|k{X*JVOg zLd0mq(TMzWxR^flfMu`g-Qi0_DURFM z-f?dLN6xUY;~%ck9O<+&-o(rLELOKoNQCa*o52DeZ-p3YhM<1}oFnL!2nj5=*4p=Q z>y0gwi}`xf`#<(M|@xlt(~j*BBbqdVO=`s%ct%L$z_ywO*+2i ze?&~mZ9K`ZA*C`RIF=Ir0UczOS|vk+p7%!%=GjJ`X&p)?eglWDiiB*dapeo8J2?w0qrBaj=`@elnZ-T3 zSCL8e#esVH%#5^9C~!f{Q-ZEwX0xSy-ye}ex@L{+QSiJq~`^6;#$e)1Dx{$x-;u@p{?Z3oOH3 zEU^oihavMV;i1~dC+{XM<8^d7u^}KMb(=eq_LY^tmom>L3$3Tl^#X3%LQt(qY-5H- zqNJO<)~}reAWub%M$gz4jNX$tklw&yqK}@KbMWH45hO73Rc}CHysFk=Cqvji{Hvqv$2l$0y z#(QG)Ypg*dAEyjO&AC~Af9qEP{apbi5`mC(+MC&~0!qcMi6)C&wWJxO<*!qwkz&gz zVquYy57U;@%pzEkpP>(!mWt9#ZiJ0jBs z?rpL+{^2a6e-l9m#>w_ll zH=*+svx_I#4)m#BI_jEktlCSOB2rnhmwZ@VT!#tEA)1N(6_I1tAw0_~4@g4jH*8Po z*BQbT8!%X=U?llgUgP?zpa0Fiq!VCxUGC?q_J44c7Lgc^065Z(0gmvzolsdr?_t@Zs1x0VUOis9lXRnwe}7#S}Y=h;i7On9O-k5&R^c4AZ(Z)xJY3b(y}p#pPe zpDgkc9Q#kdz#_uFEvM&k^=qR~MYe{r-_MYI1TyI$n1@UQhNGgi@dR?z>yKIEA#$6{ z(=&er{xFBfsig9)?|VdnyVAw*ONbzsWZRK47+Tz-7`=(H!uCgpT~WfOe<)IYBY-L) z{EGhwC{UFyc-RqCViDLMTgG1~^8o0l$9WwnhoAy)qIEg~Z41IH9Gst3f(Qc2ZbdAU5BH#)+Q3J;OChzqEhsYb~3c03r1;-P^{J%deFpA=djmNX{PCXHe6!~ z;F}}~(n)}2Y8V;0;jC}@Vl<7=BG_!si(3y-0IF$^RYip z?Olddi4lKs3vzXd0wq!?kvE`hV!GzV}Uj zWH_5009gR9n5*^Rf2G_u=C3pRFvx4Y^Q00|ufRfB=bT$)#o2B>puRrY>KgRHg1Vi; z?|v?^nsz>4da0Z(CaM#Wy6QBV5L_Un=ndy8b*ubURuBb|=(J1pHyUshbxdab8Ob}| zgn3S0L;Fj88ulfcgt;~n8^;#6Dz|WfH(s6k1;M)wUMw<_M*@9>LJb@7k2`H&xfLGyEJ*+!EfS$t9n`M+&^-3rum*^y1!<#Y;rU&S zbC-5=Z5$9^JDGf<7g$hvs`EX4nb%BCNhxAdPHodnY+TKqjg$`FI<8w?X?AneoQ!PQ zias*!=g?(@l1z)pPrM7*LU*rLL~t-qlqv z!du0GUL?}o6@$AVATD?LM^~63aI3#plH9>ckQ_yqSc+5ePsHa}7O3iYHpheDYAe@> zqySj=dLVz`xJ5c-D7wUp7!X^o<%ZFaoIsn|i=$Je?awueb0V8mr47eMN%l z@J3VzJ28|Yh5mc^Yuwn+;;M?BU54~-0Xv)_1LjR4{M!%SPt1Oz*&g^jf`VI-;Tg$+ zRgmMBjYbSNf86X6qeD7;px)G8F8g7Wpx+bVr`-jT+0%lwDjR@IqVIwcAUBEOobgd6 zZ5TVF9XwOn#TF@=@FC2o)X1W)^oK@<`>BRyZ!)N{*gwIOlHa3^*iK22<kz ztnFP0`S!{{)D#&Oc~l>Xq0lej53I1z3JxyAi~$05)Y)!eVM1)6J!?e!HtyK#sz5Nv zCPH_(LPgFIu!A36%M(07M@IbZvEUGjpe<(J_u%VK_58fI{9nCXCo|A+VX#WDX&5 zKtN&2X3&Mi#C>w6xjw#ZNo0=@og88Xuu;+Z*7C4}doX$0D!trT zLPD(2iT&%X)Li)4D5s!@Lp)57Y@bQ|gv-=~KHm#%+b_6l4oOz|0+4{WR`56H@#s97 zD1T=>sKNW2?WJ*?m`2k}>(1O+|aIF$&MpBLR z6{Ld$7O2N)97{LA)en@+!LhM~p*ifp!8wZBl~7}UFZsRfc9=3^GbASN^qc80AzX{B zAJ-u+`UTIsqbI7fHb*&JSbAT@I>;>_@)ouiLuhRROS)IR3|*9!NTwhUOqMEMl8Mh* z!~HirGJzwBj&U+k`u;YthXG^TEi`Ab0~r~C{o%#R$_Ra{+DzZOa3P_fBQ3tPi#yLz zT90c@Hp6<0TSe{xI+m=pS6{N;sE7lCzN^CGQU;tvt~()UPO0}|DzJuj+gUrX2u~hl zP-Q=mXK1`ZJ^I*^F<<(8lTfO0+VZ_+VQEqvn6$B$e3y@1jJ>+DEFxGI$ao%3i+fVF z-`JwkJf6yN2z}QlW4ypfbvgDPp!bPjt4yoLu2`U=E$53gJ}+nAq#3QI&GN!?QR{V6 znfq#$UdEs%km240{g7Ll7a9Kq#k^?GSocg&! z5!FoK9WDf%fLu_qD1(rb@ci+1In&?HIDy7*3uc^niWbWb)J19`aSKa};;k<`_b`V^ z@BOyg{L1&&zAC3*UmoWSZB~ca7KGbYUh1{7IRQ;2iIuGV6BV=2WBByb>itP4>heRHCFT+?TpzJvLQy<8-G`}T^C z5imm{uMvm!$9um&_ErX^t7Dm^-)8eb*W8l^&E1;cJ+s{T*4Hk419$>vQ%zJAzv`8h z*fg-I>px(K%3Sm0#87z=dRzDiELr93?Vr`Fo;7JK1;q){vyjAD{!J%KR=2%7y$xE$ z=4vu@{)F~lK7^cCMfb7|9EbsR^e6atk~e?4yz#Q;;{1FT)T^VTGwAQ{5AXeSZO$EY zHxZKYDR-g4GL$|Rii^Ybw1U^8&wtxl;hUM=X#9y!2AsfM_7^xePzsq3wR z;%dIIU)(hWcMk-2Cb&BZE`z)4;O+#65FCOG?(XjHE`vKkf&>ZQy#G3NE>3;tVqZ<| zs@{9LSFc{{_dI*T$L0EqLiLd8wgViCYyzh)!MD!|9=~LczMnnz)NA`cF1JHQMmt8d%G?W85Ykf1F415N0E{;pr=WBjADYBzk}P zNBQr7?|xsqve?e6JsU9LY|!3Gw7ZE7QAjO+?sF?V3y^#I=1|}sca#lLqt!=lzGo7GgJg@bRUpfR(L-X^XG-`chM|}qV^y*2unCCejmzwuDbj_O9OAYBQC`< zBfmqR`vvWq{E_Y23pf?*PMzxvZR{&b?Z9jB@xaYd@QN9QYr1~+)E9?INq&+P`8#WF z` z6GRfr_;pou=p+<;9>n8zKqouBw?9q(MeD+u>N`Ts)Rbu7bJGE0gBT#FKf?QlQWelUBi=q+`5W0@0QHq_GtsE4 zI<&iWq$a>?z~=vs58A7o0XdN}8`|ohciuaVgs(5;F2CmYVNt@5QCFJb%}Ki|TEPfK z6irvdQ;#!to%wkO*uUork1+OCVPRu0RKX*X8Z)6Ih<|3~=hO-Cf4rzJ4m0`^LuAZ2 zFxmS=G!WJt;a1W(tYQycju=66W34hs53aI-6=$}n??M?uvsQ2`ynoxo3O!UyR41yi zop!FRdUkwl(*tnAvHKmp?1@I#gkF@)*gyx7mMF1x(ak6YHskUlDC_EAJi9CgRk{yP zk>Aej;s(?RP_`ofJUk$AtE;CDs0z9NQcQhJpN_Kgga2+b5Kld+azY2@`rOdMJW=t$<9!+BpAJPv8Y1U)t60sZX6Jv2a<1MVK9bN8@ec6i0-z zFziN@mDVv9u&};9$pSy1`elwFvJgV&Z)Z&5^J^L6eO8{Y9;Qmz%*WVX5rW%v>Oq(2 z-eugx&;vATx`aaua_eMOzb01Bhl^ZE-(ms+0_K#IluiLDSpJ{x*adi+0QV;ikeSO# z#`X@`&UI;S89Sqfi>y*Lp$5$KS�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 H9P)nv>pJHd diff --git a/media/esp8266.png b/media/esp8266.png deleted file mode 100644 index 0eea496f3d04adcade6b3438d4d8dc8176b7c4e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92063 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

5^dm_TB_nBbA$dvD?;V0cZ^< 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
7np>FXJ&k(Jf59`s$RO?;E7L7 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 HAfZ-9g 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

U*)?w|_*^wrZO=Whjahk?_yBB=}q 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�O^{tSn#UjT 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%0A((Ly5gf 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 I{c7=l0DUF4nE(I) diff --git a/media/web_devices.png b/media/web_devices.png index a4703d7f4c52439e4ec7f21a0fa8a3f5502c1f8d..8d4f8794af131d4fb849c7121f97381ee3ac129a 100644 GIT binary patch literal 89709 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 Zbpt2^=qiq=M6iH|lDw)M?3G#I{{hdmL>&MC literal 110309 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

r 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 diff --git a/media/web_log.png b/media/web_log.png index e02b7297698cd8a686d51c045be8e7cb88339c85..e6e2444b90bdc21117fb185a0b80ff8fe9cb7b7b 100644 GIT binary patch literal 167225 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�X9n+PkyoG;@s6}Y`pbOmAL4u&ibBx2n$X# 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�@|JboNvaj53Iqn!RV!`{ibm7 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%0D(QT+nd_GH=_7M=e;Rmzo*(B36q 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 literal 248347 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

D@90$LqN2I;0iRmfn+nNrJvqv3mqZFia zg5O06-Rjqu+m6GOsrA9!Fq+MOw1IVYzYfvuGM!(qIl zE3XCo3+qh#4l3?zdMcx#ET1Qkj6{}fmWmIK4Z>#ya$cGX#jlZaba+ow_wJGz*ouDY z>97NMjbC{Q=#^NIKw5o$h6uA<-8ulLE^5jw;hP0hD_`{sxC0KS2weg8A(^=t`+P=_ny%qhIvGah1gN${+9;La;AtXpIw?r!Q{^}XfB zSMoP(kGMd92*Q{TShfwC|9oo9KGoU`*O78LyQmB$^ zalShgW_!nV5&|6$P6gkD0*J49q#2f~DX2qDlvd1C&@%1)JC73y)O(xvjtT+hsN@9v zSgHwRsb*vHcyHq~>A+1amTQBUfzi5^PYq_-2Bg5NxFs%~3fK}$1J4>x^K)GCu6Ipw zDP)EEEq7KWM>G_Zu}AXjVi~RW`7sU$5vs{Yl#q-bqeGV(uU)!OPfpJ)fS-fjaPDh@ zPUC7BAuEg;dx#bC)>QXIagSl?(R!ztRC%g5)6+)Zu8wpw&6E_JP5Eh>d}C3h5Os%c zb~rVf9b#EXyg8u=onI$npUc-mO@PmQ^%f}jbL8Z0y0{=+!kVcBOuR*+4i;)M1CQvk z`^g68&9PSd zVNLV+eU{_GPsW+De%4xLo=(-ESr1*KV6CT)mOKp{xgE`T2h}0 z60^h&c+RHNS>DvaT|Be$e!l=7E-Qta{Ze$Jx&SgB9Z{}-xNvXExrL!Ii}$!6D=j}T zc&{Jxm0{{of};lHp0C1d6c3M+8o166wg09RV3Y0h zQ2f@#3SqD{!B*aHsL{_Ge$)m-KR%)7w>&p5IXREZhHS># zq;4V{d(@OVX;W*io#rUASI4k&1U-o^6jmZwObN&fM-?q-@4vt6y8E@w{_!Wmb&7<1 z&h1r`8s1{aij-V^HkWg(NGKH>E#6P3915f6DDn<{g$}XpzNkxOw-v`wPxdWE4s?*B zPJ7XgmRu7?am;b4x5seGO(X$l>vHlgGLF{*p|dLI&WsJ7#t8IJ z_$^GIFpMvehwDZLjx0F%GxrWkbHjGa z9YN*xz*6h|>#&tDMU3g&wj@@vx^9;f6~5c>zA zYNskf*>7k)UsdN{G+*7~?lV}->7P_kYP>^ zx}UY(&cr=}QW)>KRogpvB6QnR%@AHgVvQC+S_=0cQ&`#MYf~a%?=ObO#xxt&@h>8Z z^b_UYn2b|paww`+3LHF2womMA>DpNwQa(ct4Rl|?vKo!l*nWm1Gdi7O%Bx3)LPyk9 zcmvB{e+Z=UV8Jl+`dv6O)D>*FfJ?WI{uwpNZz4b)L4J zrszT;1=%N1V}vLXHhbwJo$dC<8KTfJ+!V2e0((x{=7b{Cqw_O~ZB+z}?K5`W9rtHK zJD=WGSZABeW^G%bB;bCSD%^g)G-jle74t3TM8ShkG@Wm`bXW%}0<$EGdBuxUI?&H; ztizm4&ug7VUR%-MzvO9ATA5rJT=op*ID3>A83563t)H8maHwtBP9%GQ`sL6C`l zy7ws@YV|H0Y)=0j2<9Fj~}NbbG2ah(dD4 zVq^CI&=!;Rr-vUE z9yn~3ortF9zi|;Jx673#*eH0|E5?f}Ee4Y~jZx=mAA0!A#CBwrDL1WS(0aY9F8|{< zF9u7wzbn(aXgBh)yUl>O?|Qj8*Sg4`<88PFs`wZn(>&9x4zU)_kfgg5kiRoc4F}}K z-f1&YNT8f2*deX-4(Ox>{Vd2zGd%3t{zpW0DzKh-*Ssu z*%SM9_*61xbbjHM2_lR17~|AeYG{6VFADFESXjb3ZQFZfoAqpWCqoh?T=s_V5w5Dq zPDvflZC7mY@nM}kc&2s>C`_H%pCl;Q>^x^*LIXl{Hf}$BugTQir<1A7VZVwI8|Wh9?%|Ma zCMQhvqb=0M2!L8J)QrAPA~OEO7x3foPX|b9rmtH5BAkw)AM<`$p3oM(hiQMcjR^J# zEB30H_~yfBId4{UJD41!d`)UkV}vKwuw#Paf%x6g@poM{*RT#G9N!c!e8q7s-YJUr zH8bT4e?<#LW=k*OL3gkIE?EHc1_N++x%bLlm>czi3tfD%>0>~Z)O0;>lIvv7z_5)4E??QP|Kk`Z@UJp5( zk=3Fxq*{{$f~qlN{U12?l)Lib)i=CAc5dtp4Ie{?%f}xaTD%{}9Xd5tQSd!;8<^0L z{fpnIre^Qf5_i`7!0WS7eEL@Z^+pW4?3H!0u(wOOhj1w&&}9v3F5ry)Aq3CT1EEbzOTNP` z2*zy~?;rPfP(O2pfYk+-tm$tIU`7+a%G&d=_B zd!zHf^jD8i#|qBg%8ErL){EQNqYle&7WY;PLPz1KDLyyD(xjlMa!8BX5&rn)&al&( z8Yb_iZITx2mpJdNYV}3z*i@cxk<;uZ<=mWJKmJ;)k<{)k$2#d#!N){I8KCA*p+vuZ ze}mWt4p_uDKYR;&n@~sIaN(r_mLQL?n3~Rb>)G0=4v_XC+J5pvlE&iQrx;m8jk?n!sQcX}%)o=R4i8-2o zg-Gx*K4A#Z)ejjn%yqRTJv-*`X(i{HyabYNj7V<{^YG26#VPF{RNfA1!^_6Gl;8)1 z<#_rRIhFlu{$y_X&WUA|hU8+~qc2(iAx%jfA7kftV8GXQ!S)}~Cq2IcKcL{D;5+Cc zZS^a(!D`>cAY@0jdz;~%h8krfP>sdNCf2kS4GxAOaY9H7mRy-EVDxo4%K0*BE-Is7 zWr4LcY^tr)@0YW4HOkhG1B|q}aQDY?I0cCv1EU;#Z6(1x`ot)SgH$#uC`Aj#Wdgz& zP)agcv+pycUs&O_D9T4;DwEXYwRICI85 z`B{=-)2e67OGejV2nfObO2}h_;2(&m8H9WD09%@5RZk6z&RWCRkBf9X|h~z`|wx7Rfqe#AMd^nJjh}f>DD+Dhu zFZ)vkih-i|e?rL8nUGa%S96Mzf-M;arA z)TH&h=XQwtwg$aNKuVOG^jD9h-`UB4c4{Oj#g>kavx@^LqTZK!rHdNp=h8w9PMM_* zz^uE4S}@O>6cL1&i^p>@aUx z22BPXb@HaVJ8G-aMw`u<-D&1ps!-Dz9wmlE_)BM}SR0s@@Sh>1pr9}T<~Qm>hm1~9 z>3|W_wKbi8_Z%@3w(Bt+6gWs#88_qPcotW+eT_7;ubK$jzYh;1!H1ZC;G!B=l)UN6 zLdZ@H%FhwInZhn$BJ5Qd-BL;HAJvPT9rBF;=f9lmsEwC##Uq7GqnZtxZ+bfEQip5f zcvx`=G9otdu>2i|L_R0(`LdCyJwI3ZD#EEJ3Gi6j2i@MHszdGa%ZCwLNF2y4%9;!6 zDg1-8&TT^f!ig{-{#=(osOj^7;{&;k22^s{sKhSvU>NBRp@0TTOwYbQTq6%_U%m%H zRpqeQR1Xif227W?7T4FNMTIm%*~Ajrq2nQMG^E5=r@6)I4t*X6{KusG;}wArKKg;~ z$j|fx+9|<5LZ>$!AY~HPhE2}-R?38YJ$z`eNR%a$)oB5{C}y@=yr<@fs8A~&1D+Z; zYW19?I(kT(6>Nvx|K4Rfo$>x4T^Vz2)x*QmcTGz#I4n~d@=a+%qTro#WK`LiE9$DY zJ15Yn*jT`1DRZsO;EIBGD$7|K2T_bY;P)h;_c3omYI-jqZ_z zQdQz!gLAD zoJ6x0>eWj8#c{dUpxN(x9O=GdaWy@3p^%W*(I*=kH$bG^yhLYVX3WplNSkh-v9Wf4 z9vuAzE@7!A+AU(76d|(Yhsh3Yos@FK;rKXyOZ&H_9~%>ECWcq4Dr>z8TaiS+b#6|- z!{48hpF+!67=q$U0wN+teBdPErn$P(%35cHqfg^88;hC5ZP+8*PNN@Sfq4p$#4Jzx zyYFFgt8`X*_8FI+WrCb*ZvDiJ3OBVX}>fa|KKE`hm9CjEM< zPd5_XdG#DQLS`so=q9wEY_kdWuxK#pc)$&+&p!`%I>pF9JISH8lLXupW&+#Zd5AGZ&Y2pj-Li)(>MHolA z;B3W`op_N%<$HQAYf4a>C1%pudj1e=i_B+IOa{RCpbp_*wYaWK>8E%me+f9`e;rL% z^ya_O#=lV>6Z8KyZ1^pD2OCaB%4O&ZOxgyct?88XIdJH8xY}2PfrC4wrltR1i&c4I zf?Nd4$cNtLpeD=H>zXiP35y~-LZc4pliMWAe*${_0XyygcWX*X0sa@VP^ntOKL^d+ z{02)Jp^d*ZgA^`^RtAic0_bs(nTEJ_4wyisiB8bneLu-rw0Hl)01+^cFBf-`C!I=` zlA00C0!)Tl#N;F=`0$ogMIU1Mj!kaM1YA(SB}^fw=8)5I>ZztfLS&rPMdFO-P{%M) zw=m$B3s(+ON<-~nC2*u1K{%)=WJzvOOSSH)363yfRZq4o=n;`vqR@I@{@Dqfl#RT7 z6FniuU30KHwiSv;Da%-F!*lFPcG>0>6oa6ZrKPv$DqyUa>No2j?rvifR6}g*JA{r) zVR_#pr)%hza3sSkj}|TQBsp27j}01Ka!J9a8^7j?*TVS(YnT(3E(~8ie?X9hV~6c) z-UFwN$vnQOkn#D=e->Yzg-!fBDVJ`2I@Wp17D7xl;RpwVxAA+_rSF$KJAWy#AkE^y zT@k)5A1j8_!DQ%?2)1r9K*k+Yke$LuT)G#}k^+*5LQBBOQabuzm8t6t4JQ^$;9}!E z)NptVxPm3Q8gR(L?V0&kFhNJshH#v@vwO2CIB*H-H=P{$?~+dTF@=JSZZV|Zd1E04 zUIl!|Ac{(a{T0^y1FYjk@z1GxmmNd>9+=^lfg$WGvK9Ks1%GBHHqrTsS^LlIjt2bZ zw&*U#HC1C+xsMsktSF{wUziDf3<)W*Rs)IM2nZezCDs}wr;w{e;CF)sZqgaS^fjbZ zXR1)Kf+E$7zIm9!Oj4uonAWqx=`|V4G?B69!6_8J|8gONZ*~UMQMo4bvMToCtohLo z4O(MDmg+kK_nz{EUv$r4RBaJ?SsYQxkRBVdR~F5^3I zlcC|alL#XOxV0$_AXhqupdhXVxAsBEb`t%ev(EQ|uFZH3XbJnv&uhXIBzf1J#vVDu z^oQ;A{S6#O9$f!KNN&8}%ldG`ebzPL2-8;Y;@)U+>Qe-U)yifK=ILIGK z+@Z9#2x%v#J-*bWR5>x4L??#^au9z|28pB>%re(d0t~W9ycuO*mJtVHI}39+deP$w zWp|*Ok07TKTm`!yt&0OHMkC^?G(;~>2;|)P;jKm{Sg|)v>s;OqSNX7&IQI@1rlMpt z+YkL>PLCi`!ASZCJERl+PE`O-6i2@tQ@NbkZJL4|ju1W0c`019{|N6qy-b6hKae2J z(EOAMLP;8F<+AJ zmA(rl@3RYC73@9I@&1i9z=}A2G+wu*HG>>BdA~Py$74w$iz0J;ReHWYdGr#`);ym# zB^r_9YNaz~`56DM5VeHg-y=~3`L!ucE{z{iO%wUMP(0l7d{$WxS&)i%Sq*{hBogRg z(O>*I&p3-uY#2(49cgX4I~eO+_sJcJ!#T-TgDzvAB&ezjT*XKYh;&OK-)Z0WBq@t) zFcQsfN3~AZEf9e6StBd-T*J1*%O~gkXVNp@{tnQy7QZnEEyH`ETp-*F-9oB=B7C1o zyrq;;hia<*v;{SOYIt597?jyPm{Px3?Y_&WO-oI-10bxS_EHP@^dim{ zBQG^%pj!t=KP;Jk^;Gi6tPZWspAozZ$v*qm7D41$3nB{&{>=F0Qg}2DXFDPGMZKAWno^U#uI+08 z)u7?m!~)SVKcB$7nG%2_c5&Ma{j67ykVHl~_Lqs52OI0^sp9MRMMOqt{)c=MNiwOE zdZM8$mh}(wn=>)vGcCGCaWr?cm=6E!in$5DDfnu(hW9gq=d%0E^m17?!IpRE)19BF zRyiPaBZq^x^Z_yr`25Sj3@AKG-zZ*v1iokE{Wk%zBAZppF#)vLpAYSSrg@T$e2C8* zMNs)}U~K>M0cPyDlxQe97<2QMSxi5_z2HUjCu?d9wF+tS=Bd+E&Hh>DgT-@-Se~1X;z& zZEv`nE!b4GSxfePMJVb?C34vS3V)(GZuwF5O`vhmdg!u{_S3Lle6_Js&W+G&4~8%; z^iAE+10EK}|Hax{1?90t?Yg)-!QDN$y95dD?iSpg57*%C?ruR69D)-_f;$9vcRNki zT7R87wa>oUyQ}Cc=$^FAF~@k{XHaFt`1!Hik>uem_=*|Tu-$#!P8O1#m0gRmavX-6 z$cbiA)GIu7=aNrD*b`&(5lWQrNNuP>w=J|xs!jE z-zYCEe0To{zHQ&uvXt=P2*D;O${uQZ0%2x%%i*Vyta&0eF_pw(T0jI%WpB4-G@?`; ze{4o^d@dtx;J=*PTwN$fIW8RvYL_K&(wQtzcCj+#!BoY*&!yv4WKZ}uVd-kUJ^vZV z8|jxb|1+a0Cmo{U;d#mB(U9|*zws>WmRj~@(M+qAawsJTY2CJ z=up^!sDi0*1qSI+cP1f)iOf$#6x*bWm`PV0etme=Y52SgfF&1sYjK#hY&7y(8?Rl_2kQtYBNyoUzAgSyO z_ATohrk2k8>2xO)`lcbv+?MuOdgA^&w15YQup=N6EQhanhWp%T!jnqFuI0(rVoqu- z$;QTg2*N$+?Q?ELe2b)md&U0#RiVXOmdP6ZxC`~aWRnIEoc_0{l9)F7zZo3<|7WiL z1*%9$l*#?C0_l7Mv1tut@goWiy}df-gV^M+N_X9;4F}IPJo#yya%i>PmW*Mc_#12J zcUEJB0=KCugua5*%YsPHKEs&LAZmIiUd&N1;|#XepP9I-%e#0dOAAM zH_8Q&8|o~kw|GnOHM>7v)|0!0a@DMa^sPZSZg3W{JSaXqggs2zwY`v2C_O>Xns)^w z-|L)Ta~sCJ2nGng>W5>U+Kc3B_F+Ch);%WBs;}Xc@ zfR$mM|MJgA+1lwXR%3c&Na2e)Bp$s$xV&sHNqfE{PWPeme&-imOm!GwV{$(H1E+9$ z>bq8n;7x}KL9VA4q~x>t``RmzY%&OT2@{q@dST+LcLMEF#SE;s(Xc+IV}HqRUw2fa zXEBn`%Poq5zpeueXb3W$zns0r|C;{+g$GCfMsrOnj#N+Bog+-Y&{oQ?R6qx2?pF6~ zVvI|WrGiK{VApHr_~9fW+(C6e$|y$wBlsnsvqmxlaY@*Rs1Br7UHdn;T==a)h7BEE z*#|=aj-m{y=PRxF#@yjm--De_69hw-Go8!mW@F0z3<(8lmeH7AV8^qHUIg;!Q)S#2 zm=T;6R&a`O!LvuytTTlj{&_W|Y#bqkB8R<#+Bw``uZ0t|6HA|K?nAw`)j?8m183lZ zN-cIo8njFIZTU#xpzw{@^WZD|nXP&HEW;}K`qqB8cRVU8<=iPJfyPNvrdo#n$@VFB zwc@J|;Cuf4TG5?aHUHo&Xd?f)mG93!j_2@eW|gi4l9A<{Px)(-9i~qki@jAF~_a0R!pH+k+ur%r;VEGm7V$J z;WFD5$u!B}=e&BiAM{KVPWkGH*nT$sE)3>bB%9Zotwxi|6b}Yd!_H zJes#FxZlG$QJ!*oYyMpide2WtAp1C?!T6jfq#IS^qZi;07bZ^-wIR+dhUVUv`a+oN z^K9BFdHnvtpTgpPwd^gD(cl*mBe6*XP#E>~SuOM<=$6-P;I|4gr6p1`v598!kB zgnIaOCS-|@#X)lN1)1Uos`zzIdHNvKBCp1pn@+MiBh=n-3x=wq8q8gpI z6?Z4fON>uP=$QIXd4l?4a;qiRM#AL1o5Oem`P7C;$a21Vd*SKVv$b~2)1%WUWmfL|(*h=~b2$VJ-)H^@ok0y4>SgG#R ziAdLp&wt$@vR&~9)77*W-8dCQo0bDH|CZU?i(`N>D3BKqH?{4+dWMW$FLU5Bs;Xw5 zk4;qR@jR!E?o_C7S)rB7AdJ2IRvBmC@jPl{Vu|zl8HVt0aqXUE;SL;N@l=G=x6o5T&~D7i~j zbN=KtgZUGH#jkQQ$6(8C+r3>`MJ1?_ZDilZz8~!|0t-juRf?WrAlE@?@Q{Jqi~Ybm zByJFD42$Ph&U|AJy{+pNJ3I&`U#el!M%ut37~)L7d9Ji$wwA-UtOEt~+UfKEp1;a% zo4)XnkT4qt$|qiz*&{9<%GMZW{W}{OO|uclr51c~WUzIR$=8`3d;Iee>S+3=X=kp1 z_HyBLv-MuJ7kl2I*@}YhZzQRlvz04(;>7Q|m!GEg7Q!?~w4kvh8yV*bf!1C5&Mzm0 ztCnoj7a_thp1y+Xb5R+OgzLzxy>eqFO)?LT(S^3XpffzZa>Gt`*VWkA_S6sQvnQOv zF3cX56O#9d=RSJpx4k2K;XhyQ^Ki`H{WR`-2Jxur8^MSC^HZ|=_?HKd$txT5EaEh* z67rTCX&tPWKF0?bhJOMwo9SZk{&3<40%HFsr)AeEd2gBH;@D}>UP1U(;_N8cW%?F1 zJ`^bc#pC~NxgTXG>d2vj{k{J;EUjK%;Ivo8u$E!K1t3qzle1b1Y{rKumsE8KxgrSw zH}(e4nJva^G{ert_1E)k;?im05)7KR2|%t|>n+Wj>_4+|NkAitwI3ijn?PV9IooU% z`tGh5lF)c^L%Pnre(UTe9kmH!c~1l2784>AIZYXSG}8czQUjd-I$qD=Bq?bkz$A3OoUumm~1=Cltq^2XGBm)L98q z_W!KBJu-NbAs-aXEn!k%6`KiHC>O$Q6k+0Zw}B& zYn@EXf=_*imL?$ydp^Wuv9A?pwlh`OTZ_;9s0*ZupRZx#=JoKJqEcsz9ev9admC)%jO`Qw9#heV}{!Z>eXL}(& zu|(h%QAR7C&du6NLr~4jFRSsTW|0lL$QYg-LIIY|Hz>64ezeRnIk~8ePK;Sujo)uc zcVD`r#<|W>6QMEr;%cZkSH7xsHf((NPcp@C&f?h0Mc!cm_;gnO^*;Qh%iXd~chf zWDROmaxKM8pS-nDABNdX##t~%Jlo0DR8Bq~+M zmnTajmh8wm10Uo!e_mIq@d;pvkxOR*x4*4R=WTi!|E??G$Yb$dxIx# z+qh{7K@rXbCe$S&V$K-8p9wyR+|OCn3&oS^O7_W)`ngVuI=hk|v5?uz@D+-WDYw}} zr`kE0_Cz?<)5kg0%JdbNQ6Z{8n2dJeg5A~u0+d(*(Z>g> z>P6-f_%1jU))u7(8d2*!j9zs31=|njX~+R?(O5et3iHI8xei4tQbB>LKUma&6sjyW z+Z>5xw{ns3v4co&C9a%yd3IpfwDN=~u%aII3i3kD2h>I3aywEFUrPFfG z!<#oB`n=8Sc-v~S%rxpAwYBDm=ePofTbC8`{V?FjYk%1NGz?@K==Y+Z@>)xgn83?G z7={6BJ7zb0i8|EAiXEaxTNi}~Kg?M9#4WDP>a1bjXE2LeblONhtrSo#qZ(g1U9id8 zAHT@gB?P21G;&r3!$ed@ZI$E1$DSolh z;s;CeOBS)ukrSuZT`#N+0Z@Lvzy(abrnA-II+l4#1WEA?zo5H?u)oV+kECB3e|6v( zU(p}d=71lmTQc?+goi(+BcY^bFFb_+io5l7E}Ic5x6&Dne)=c~>moPranR-oxT|y{ zB|Xc*?OO@_{FR8yQU?lKFOpBhV2>Jk$ca;xgx~om0)jQRI$u$?(9IGxLZQ*5@k?|Ak~N2!14&tcwFsz`vw~nT1lsY%I4+OreVtGkPNPOt_Xo{ zCMlgkHnQ}Cg4to!Zg|oerPCEk3aTV|avwhAxP=WFUx`5KW#Js|l0wR$%I1)!pC&e0 z^tGW|;Og;e`8u$%%`PM~vw*YD;?Tc_ZA1{CgluA(lZ*i`SX;_92BSbO{CQEIG2@uj z&Nx(YZKA*Cb_erlU{yO_QQ3o8nAm-*ArDFZdnnWnX z$JI-ui38!}-oB~qr^m5F5d+kVZ=`%g*=jv!=R>ck)T+$BK>h|G3enk2Pb7c1>&>PmxfK4ml9`7$iI&rw&ng@9B~R)?O3mwKgU5~gE+)bs z$F8(V+-C9Sb$Ma!k5-RV%l<2#Yq#NbLN=3DooZw&Dh3T;#C&)27VRWQBR}6L6ezy8 zfUj*Z4VUGO>$T_9?*)>k!xG;FW!5C_%Vf z13urIVrH{`XGJEf-_vrZvz~yjoux$t^cvnztwehY;#Mjsejt^mHgI|?WP%yNw9{uWqdo$}`>TrFJkhKVq z-iA8_XMA|*Ebf{wZTdRc#c|IkrKnjS%C*a3(#syRZF~^ODcj~<GWD{o|5m2?R^D zTYb8_j*P>jeu=zgu?pQsFrnD4uHDHMx3<0XS+t~&S7e}(UeDvYO#%LcwMD+=Ps}&+ z!$?urw$;>$W-FO?SmTe`(fd(7Gpyu(mQNgsG2R9A1ok5VE*5}po-MITp04iE0#f5v z$UO~Alx&oDAG6qUz?{6SCnjHsK@#>B>a)91vjKm5vD&>qjycH}^Sb!lPgo!SD!xWGQ)Axv zZnue%$1B+-n@@eWF-E!S_p@wi+zKg@uCPS-knE5L>OJ41DI3wwx2=E&saNL&k1Y%B zF2?>NX}!v0>Ph=_81-hJv3w#swi*Ly`b14;hW9%FGCeXrWXUz*S+(A*OcQR)VSXgfu8f2f1v9%Tr~uh)`@Y3#$iaIs|!8Cyg36OxZR z|Crk-2#ExVgeHVVW>K8@9t7LG8qLKG2LYi z+y~a9Iu74Dd^34!XLq_?qqbc_Ews!0M#Ux!G;VdV5Culv&44A`*tRqb^rGsx%RBW((yEN8S z>jdZer%HjYyfg>A^?m?2-E$)pXWFaA%jvlYMuw<@VXL7rrbTRQVhTr~rP%2AW`<*1 zOud|f#GfNAEoR4lKywp$y6;wxOJdI`=~WMXJ|)%9|Nac{c`4nuk8NO{=~g4-{#iwq zN_j!Z(GsA7&-hxxA~{Gui5XYUBFr;aLT+rYFP~?VANK<2(4&S8ABvynHgaj0;-Th9~2C9esZXj zWw~O3LS&aedbI+l&afXLnIhC@hvHa^sv0MwNMr(U8JQlG?mZZ#l*|PFoL2IEY?{lI z826k&DO&@Rkk^d0X@r(+h0M6LP$Pm1{qM2L*#n9R3ueeCB;I=t)|Vz$I#0c@Bzq;C zNk@I*#NN^str`_|=Cl~U_KW@_<4k`kCPClVqy%6L%)G2=2HtdCFAp}L$a4CBA_p8r zL)ToJ5eDLCC4K5j`$JRieAA)WGo-~uZ&(MaN_~JakuvAxCXdhZZcfidKDY^*Ks7C5 z5hwvy)NCFW{pJ-v>C-lzD_Hspn%)){KJH__&of#p_2!=~(WnIw4{g9&;#ZLrYG<(% z3L#Gb_nI$eySq#iJdlb8GSb$xz;Oi2nT_Ttv!)joT75f#Hwav~%PSr~eyJhS{YlFhgc>v&$An9)_C}6?=l6VmuIt-B5 zMyeKplJ^f|4Zb6aXh+7+Vh~B5k(p{P7PvcIUx8E%)6X;x&FIX)K#vRlMkbRmvS!#a zfxo(!MPaKjJ;Qn>X`%|*X-{g2NyDJK4YHnFcQZyg$%8}pcga~s8A2prLi|j{~bIT2;0b{FZqJ`SV}l7?K;AyM(H7z_wp~^t_&qhnJXSQG6?ePKA|yrS)r; z021IwuLFMCDcO%2BbV>RBD?gG8lO0PbIpFmn(yHHzN}IwtM4&X(Y>0)>YQFO`^JiD zwm5xjK?dotJ_>DByXET{DoP-~)jQGAIWw=c=aphAWVbj0bpR~>`h!a9m`W?P~HV4X!k3r94lch6 zr4)nP>xE`^T8-vj>}Vz_1QzU#qh#O_L;9l zdH#QpKWcEkOPf@hh;%jxlYseSG>cnppf}YLQO@;W9iyU#AFD2|>A^52*3Xjkt_7;I z*pAQr3xv<=V_MfVAGGB6a(~%I_UY~#{SOPwaD=7DmlIc>*A6b9MyN*;GqAbq-z}iV zi2ug!RKj^Sqc&l7>2p6sDz2pZ?Rqcs-2ex`;x}q-NSqGZKjoxBs3%+1@XQSL@u9oUNrQs`BhH5uKY{ucC-iExBJmJ?4v4Qi6IiAmGI! z)8S0{3+uP${;tkZF5~=HC#$|-c+In&K3n|f*Y1&H-{-AysE{;E3NmVVlwKKIk|=ukS0ANn63G6Kcz?LL~_kh zYO^72T0-3V#~y~~7Nrn5_nhD1`re0!wmo(ckmX6AD4z6Zy$VGz?7klgSk>VqCGnDJ z-Hc*Sa@wtKH|k-&V}1TOe@j2sWbQ?RfMXaVZwOs@6x6Lj_Xvl`%6B4pSA`d5dNqm8 zJ|5Q{HumVQzC+c2X6^g=9+ya1rJ~Fnx9fGs(CM?#$=!4ru=;8ja2$>cZ6T(l^enci{80_quqhn6|1#5 z)>7WU<7+FN;Ohl+ZPx{3%^79A3|lko+rtBFb_x#rUw$4-7&IFd4EyrnYdF-S)eAL% zo%hSrPELv)beI*_c#s(Z=A~V!qL2ON;<)5NhzZToncTbi^TJT66^QX@`>;c!YLv|5 zLH%|j<<6LSJktKrEFt6q^=KIvZR#j(TTZt>L~ZN4{61l*5ZCu?O^9Y*JT)GxnDUtH zQhGO$%A2ah^H38?rs-E*x)Z;N5PcX$E1K}5QX0p7Tb;-6ht+meQ!NhTY#A|4a45;V zjldArG-9m`@NL@zelB6KSawvmlC}4gs3CqxzQwI!38&p{rzPRyUF&tyx`_Lfj{JV! zP(fo-HkSiB?|~8{%sQ^zP?Z={c}eYVAbb^E;l{5?`wi)vd#%zcRq0pmO4Jy6a?n8s`hEeU*&Hc$InOwZi?oi?#YF_^F&-1h+wdGVif z1RH#`Zhk#4$N>$v_tt1X4{yx$K%tPab8Pwcl@0FvXC;l#U7E<}fS_y5oV$?uPlO!y4NYE*svniR7O@CnTF$uj=}SNea&nVrytdLz=dka??tGeGR`>*^%CwPCS&V zOH<4I+o__9jbb1v#(0+hvaVKXa+$~8r*Ju@Pw_X4hXMAN+Sg_zEK_+rLQadI;U9(q zgUH-I>?Z5(1x7#@i%Q!m59WQ(G9MUgaTtN~^&T2KO<4=v$~+%QSZpb({E6%@>z<4< zabm+aNOGA8JI_arLK%@Ey&@AGpD1gm*!Ldz6L`%LuyL&17!}RPoyx)QWoy#UKWl_V zA{r5pg!QFh%V}?U>5;M7=LB+eewL|7s-1SKjZ_v=&51})sDB$kVy7s6)&HOogxPS! zi3lOEhT5N$z{^hT=;dxi5k|oy-WYO`7Y!D6@|lWf8C!?yz3G_1&Ucjm?>>9vs%~TlYS7 z@3>sB!_6Q>6wIg}L=tzHEpl;B`9=fi3Z{wQq^jj5dw5tQqsccdknc@-3N4w-zZSg| z+BO?pTb(aGcyBayZiV92pVCVWpLtUL;B7GI=(7}z3~8ra8Ys9yOnq|3cK-N;R%z=p zqI#5@dvGKBLi3>ajIWwj{wplBXBwV%ybcK)Vd;U$k*+mF6!IEES^4v`w}|3A>PH8S zZJwj0ij>FtOwga*M{$J#$+k81w-jJJSe7 z!@fj6bod4e_)U7k_T=tTB@`pEX%P&tWRZL*C>xi)-o72jKfkKzVA#ay=OUg)J}1c@azWTm?!&d6X_}PIVwIsp~h?Syu&fXD}7JE+=)Ec zm)5}F?QDciZv9s##+lVW-~HAm!JJX|ZwB-rtYkcR8ODD}1Xgo&bGaruEQS$eZ5H z6b z%#iUSIHgNxSBoM;Ocbt@0l#2$7u1_-?j2^)GOL-9x6!6t?&DEc@`^-WsVXnpZ!yLw zu+?*Nyk^C9})bG-n`%40aVAyYqhRzKSE zt#9)*GY^uep)leQEY;bmKbiG2<(|dhwkZuHLGrgDj|HvvE^()?(LbNo#)Kk&E7l(#V`Tf63DJKMdfvY&p!M-#`aB~|^UNq>;A8l$0~kKP+9Wa&|g?PJn@*mFh3VfyhSS+{>BSE${$Mh0l8qGmSB z@>4{Y-MCM1)i!UDxty*hE6bg0CllCGkPfyT3p-nVTA8P%Wu4A7fWt8-qnnh z_L(ez1`qZj7m<{`X{JK{I{L%q=ei@5`a4pGlrqs)%vf@e(z`Wqg`mw}iof6GK-DM)bDC@g5wMgV34w6 z{2t&&wwHu^QII|i&v28|+D3RFMB+x0GO7}n*^X7c6F&W!E8b$Rs2|d3eCgzc867X@ z`t7ah*`C_P6~)Ym2NKVRi0eBe4ey{X6-yS1iKdh0ci)i_gM7x=#zCbG8+}tlHg%n! zH4Q=XhJ3lzNqnx(#Ul++u$Q|ll?rT=7Q?Q;XNyff)Dnb=Ht3WtJ0ccR)0p%=eG0j6 z-|%FXe{3kG#j4_NU&q0&sg9CLR$;bq=lcUgu<^1OHeI?$@>3W|nVE{rJ^4tSO$A8E z)G?AQ)Y*u(2$ad*M-vB>m;FI!r^k+*WD@_)vi2lNlUn1{V}~TQEF1aIK)du+enCNo z_=w<(PHm&JIsdccu^D1@g4?a)(#)s84-2uU?^u6A*(QTkUNp10!eh`#ky&`N{Wgq{ z+;gJi92K(r6*k^iD^Pv5@BgdiXKc^~sRZpVt5bF3vGTcehQkNi&&K}d4H{OmCW#exEHHDeYnB^N z_nj&qml9B$ae(D3&K9v?+~A(c_#hkUTGEW`d`VIPQ0VUt^_jGht- z^l4e9@?sc{Kq8Ww>;2Cr6kU4xfvU(gFCP|W#T#qF;u7`T zt`w9(Uo5sQI%d&%mWW5lJ9cy79};)WfGD;gQp7v>MGzcXaFkGlN+A(oxMdXZ~)t!py=L8vq@g?XxQui?<2IZOkBw`eq z?UPD4z`GWj54z($uMfkYzTQ@VZA9=U_fBs-#!0bbo~sO9OAEqlO-HB9YX;c+SZ1aR z%VuU?L2ki+>eoqr!Ku!+w-(dq9cw=zkQ@kUl5iPr&I-SZ57AKU*E&9XEz{~b488O! zv$P*aWW-mS6McS()Vc|R?ymjZn;g2T^5Z8@v0Q7P?e8w!H;>0-3b6QeHy50;i}Z9Z zgeJqlRf;XUt0H{D#|KZEq#Z%#qb}4atdNo^y@@KKRP|9>qa6XHn}E;N4l=BF^v8k? zHk7AB=9Ng!7|a+YldEP@W~-&xGU9#&3X{Z6jB0(`FYtbqd75bPM(-l)p!;v&ETb_u zKV_sl-skH>BZWHrtfyl`#A7L*5*>p@(lv+)9CYs!u*6fTeN=x%AuB9J!Sy@)&coAf zrDf??8U?#qDwVn~JG}^Kb&f?r;NovcY`##rBJV25WF8OB4`HF0k0lkFG{T);1NKL0 ztPn_oGbQu_ppX0gL+04hVbW;caTiy2+dxIAoeRPxWAW3sm2(b73wASdzLg9ZNm2`M z1Pc^IvHKQ9z%XS^E$D4n2m?XDCZi9ew}80=KvYxl;KL^r1S|!j;_RE#41|#Gt92LZ zoz|6z5G=5Hf|*ps(BliXkxWm#cK=4i27P{FBjsQN|HTs9% z(ZgEN?k2v1DPEkaN8ZcKDD-?=hT9rO-wAMg8#lH()WViO;Us}O1WzU=k?Y*q9gfnap*Y2m<%63p4Eszl{dQ7>5CU3Xf- z+_rzWvsiz(F{<$VhO8LJBMFQ@d4K~~IZXn>oiyk*GKi4r98PM&g1`rq>2G;zM2~NF zervZwd-SYq#5ti^OBtoa;hM1-JCaw+@s1@CW{+Ih)&!_oY0(;y2e{{}Sl$gp< zMoDJYhnWZ0=zfL>7Rx4*@vanfAZhIRcs_2d8*)2A3&6Zpr~{j7|F+B|RW%g2wm$Kh zn%XUOR*L`-KFUDOs4l5-@4e*2A-uHSs`Il+ETE>+)83R4!|U?7g)g>KvpDqxbAipN z!t(j6$hDf!XXa|p1+jkmiG};Komng>hW6PRCD%vRu<9(=3oOOA;mI!Z_qMN; z$aUsElH|1xg6QZoVe*L;1@piq4t~g_bV)XQlXQcU&8%NDx2~Nu5e(9Kz_znqV}^+D z304_T!mAwG(8a|*##_yWm9ws)#Sl!=i!8eA*V_$Cw(!{v;HM9eW6!%4=r6Pn+c z33UH%Qe3$6ZQ`nI^_mbqpX=?}jlw`{Kf`oA@yD$0uj|9ZJN<(QLM&V4&YCrSeyE)4 zMTFVJcxR+;K}?xFd;8h=ZW9j>CLW_UPzj@Y9b7RX`0)jZFIr@-)HmF2wy;pdzFZLS z!^dh z=cPi(<{u3O~Z)52SPR;Sp82zb8Y<=(= z_wpsq_3=U-y=wdjVx{~ZK_ToHIme9+`RHM?a^SFWfDsW-fZv!K5rMzC9{YOWB9U_U zEq@C7P0lI7M0r?1t92qRlG=roZp3j{uzdVGEpSy5(kME>u7=3Hov0-m2$W_tTaw$8 zpF>CXML*hIlyeFsi!M^YX1PX}3U^JKwciF?Z)hkVk12dSxOp^kEhg zU0L6^$=1woQmU?e!Ayeq!aIKM!}T13vd{OoEVVL&aV8IJDjE*qX~{m7u_J$!vR-1a zxgrh4{kH89cP6?ZC%Q$aWK_9h@4lgSRB1>->A4Xy+ACROC{?zw0?Wym@e;_**~{MZo2}rt-u95*ntO2 z!8#RL{Zlc2drgBxn7gyJW@rHWHo{P&{P;zF0K5Tc=7V#Ubmyk)P^Z$(7}Gz6`G7E} z1#^nhh$lHf@NAMfkw@W!WL8lI^M9(PC*%SaGQba`Roq09a|r|>^Wp5`lPk@c%7$ug zDaZ)tuj+QsC;U3=VXQj~R^royNb2$~P{5=%0>5fP==#D6;)TsiRl^O})l_#~djl!_ znGyConGYYJfz|^v`@;zotIm^#)~^DhqW4QBvN(75_Z2{+8MaD-;IQeI8SXv!zr8$k z7Jots@Ujy6-CKFK#Tpej^2u&Uf+2yff;4(z(g@Djaj(tuWoc>xoe$aJD3}FNr4TL; zkgz{P!j3Az_`4pK;C#Wz;lKI0Ypt>74SXAM;SppU%Yi;JXScUQc$V1(3T*YnWmBdX zPg!H#-5n^t!J!hzME^X175+#n7TU(+iv8mm8S1d?c&QOrfN9Muxr-4=ex&{My?bv`ccp-CZv9Nw*7x?=vf3*c%Z7eQ) z)F)GF>bo1%{Wa(uuu~-*l-kZaKXCiG%UeManx4|o~tOv>9;$J-^aZq86=*l zO$|<=P}#Dsa}hHpI?F1PbPQQaT34Fm9}x2 zBC?2L^BW;-y+8Q)j_pS&Ylh^@p0{dgKAY|OheK{lULljji1v!ab@ik3YgM$r!rJm} z|46WD!puU@-*bN1#^vXL+w+31_Rxpg+%U0yttSIK{^bRfxLfdWGD(68*=87Bb;yM` z)!Gj%9Jokr4+l0Zw)32OGqPV(;5wC(M1xL%2NC@A z)8It1H&adEAzObk9$30O;YEC7g!5~BF(Nyv6Nuhw)%7Gz2GsIL{EvTn!ez8B5)5_@ zO&ClZkcUDAzm-Rs!?u|A6Vz>NlDnP1tExa1cS5gDk|KXXm2^#bOf~fH(|EMeO4!8P zEAG0MkZ>iRcOYYxmOhpT0U{Es9wmrSfaC}Zv~zfG{vy};#R8D9d0zfV@jR?)#pR*o zLk2=bJ0e4pzjN`lMowcu0Tklyr2k-+e4E>0+TD6E=iN#BsghED^ENy(@&KTJjL5Rb z4`irq(_>1i?$2N+G5Z<6#{tyIn%#WgG?l=INZ0KnAjf4KANJJ$L7xn^0cdpNYIIu< zY;4>Iur$|S9#1tPBNFX!G1*f^#S5q4fGK14{Q4i5gq=Dds!bxk`kth{2ahcT48Xcx zX_Q7TJ%CEqAY{c}ljfh6HpR69lEhVZ{rL{f&8%d8k%awhlqkQW77_P_WnXX4b8H<- zDDJx)J5?Z8QX;6BOGsBeLS+8Bu7I7jssf*p=WdQi<&Sv5Ua=93j{VZC>F9o+ldnTd z657K+n_WIYKPf0Gu1&LKof0HvDngP0ALNz%fyvqsu&(DuZ+R^yKYSyC-lh(TlldML zN!_UciR(jAJPC%>CTD0L|Ebt)A%Rm^$MC;iG=-_IDnR#hxQ&;5Q-3oBn`1R*UWv>zQAJs4`g1C3IgfHY}6Z zW~MP69GBZl!$ZTy1FDW?2Fwb9GbRJcIM?QdTnd?-vY)w>-7dbx&%wUk5y0u=s^ZZH z6tZLRpOQ%P%kVC~Slw0~=6WB{J#CWsYmNziu^9Fr0G9ft?`8EB0oXOEa?8TEbaWqW zxOGO6gB^&Tc~o?YD|I2D{AM!ZZ@Ws}sf|Y$QT3aHo6t$Il)|QF^=K|N^lCx5JhQuO zI-|R~QDK&iG7fcSE>h{cz)n+4v$htOu!5Hwm8zKl_T5o92a`fa4Z3y^@dvAU{lceX zd$nA3ilOuu4WglPE{6%RQT>MtpxCBzP$G;So{aSDWMen%tFUI->_<2b)5F42dte%= z1AZ^M30%L~v-! zvQBQ1J*%*zg)qx3KpamS0u4E^)U@u&j|z7NNg+aj|uW=k||={IMg z@YX>1k_ptf6(z2WDD)1e;suzowC}fBkmLH3P`xj1ulN984xiPq&^+b_W>S1H?Dn`z zA{zgA$nTg%F1D8B!d<{9E3h%*72TT+oAP|k@bk7mOw7EFQI$kI+ZidwG*tQJ>*&}< z;sE-H)>!~_=>>jlL#|yoQcO?<3ueVA>jJ{4aR&!}!<2l_QdG+3utb;hhlob&TmunKErE z!LXlSnQAGW5m`)3Kkz0iC+2zW;5FNhCO;BF<{Kv>jW>bQ3PC06N^GPy%R0=Z1X^`fLFB*7&qJxI@g>}|4XQHVrX}F_cx+@ z0n?xHTW(Zq#u$u@3=C7U|ET>JQy(N{gen3GI9RcM3m24kF)jp8mCCE`3Kmy1(md98 z4Ydj|B(h_op$L|jC8t}IP?(0m|5MDGX8j8+!E*mDCmp8xxiYH_tmT|+*oPGXe(bvO zK%loJ^ka^?cZTKCHkTH4NzdELp4_LeSrE3xjm!5NJuI}hygU+i2SHT*XA>Tw1~QvY zqJ^)VC(2aUUgB5KhTF6gKl*|)qEd?Hg1jv(sTozV4-Z2>@Crx5dDuK^>h{!s1iNel zBZCYpt7^gc54vXUaDa%LtM)A#>c%(NXC}?&k5ww8!q$1&G|)|o9isNwol}c8yKc7t z%@2+Mzbq|;eyI4Vg0_xVixvWTl;R!Mfl3VdbPTRhZtXQ{xjbD&{0VG(7Fx-Z)406I z!8b8d9thT{qy~v&R2E`vhop6+@${@nLQOE3=!g%$pOEI)K1!*i_@UXTxFv6GdC5qp z8x8OPXY?*AYxJ?d^>eF8Bzo_@@o%ediRoGnn@7G8%H?*Cx-KZU)g=9S?C)AXSm^y@ z#4#CyJ?pd!b~dkBDGZROu|$q!R36D+mzq?^H<1nj%skL04hIUNRNjry)fc7 z7jm1`cM?+CMj5FQUpPb0+Bp#5T?Be%2L=bEv)@4<#;{6zN_u54g+xRul3TTPbzyfE zQ7+Ay_itFaS1-mqkDlD$L+_0dE3>%GS^kSG0pxF=W&;YYE?w6^DbMJmzDs!OY(Puj zE69(|@j8M5t)*yt?+`Av;L-WwchzD?rU{Bbu&=lYA?BwR#=U0dek=Ao#v-SIxxF$W z@J@)0MzV?$A&h@r!==WIHK3$gUb+bM)EJ zv7E2%<9xO2{HnavAJU5Tkj+jG%B~z(?&wh$*@eha$pXM%E@bgtgLlyJ>I9|jGod&5 z-`N4!HM{*-4eoXbs6U26#KH_GohG4up~ut~0vB-eeh}YE11C!x5F6x~(94MF`>dq3 zTSn@a44v8lujOnA6*TIxu8Q~c^%LIeq+34^56XU%sSzG==sb-o8rBZ1Wf#%Hg|7`; zLQ@r?Xg}sPANF^FHZVjBDpLDODE#Apfkd;+q7raQFP-8D7q8EC>BNPbw*^G_e;7hLe>uk?A*2w|$A+PF&BH$J%YJj0M$dy`|(=o<5- z2alIw##eA1yOFzCu(7$w8b?Qe_;cj>U2hgE^bmV_U(NnK$c(7K(i+?XLo z+rzT$-bZKpiX9E><)OCvu+a`_k-`FGl)`)$Nz;LXkzNMrkwcSKORx;X4Mi?*=rCw8abi4Yi2LnCypWegTDSV?`|g-;gAjsuy4c z&&|*@NVbYwoXPn*9si>?6{h|&3C{IwM5wB&$^JXryzO)hnqvRaiTpi;9grOOpJV-B zAt@fe!Hxbh9N$7a4CJqx7C>=hv8F#9_0Z+tQ&HkO*Np=UO86U26ic5Nk9c!oCEB-PM_O9fSlKS{a>z=g08b7+q_il!hb>Sk}#?{d3@m#qeNQ)B_iqlSP}l8g`@MH=BRj!NWSmKM^Qj z&Wy+8+nD~_{tro#(+VBWH%kx8k$+cZ|BRuW=nM)`k?YeNkm}z}nLtxe+LKLG{D1IN zKu}P>7!*u{&vEp>z%~4!;O5rM`*+ONBq+oJ<&!yW090Nfuj;L@#2yDX8Y;74xZB|u ztNS&WgY6WU7rU<>&n_N^p~N1-yZWv6D=xTII6lbUxMMcDb7(?K!hUO&Cy!2#8hH;l z`rD6$W9Mh2ooxoD=h+@hoX1(G?uzTno;RTT{?SxlbwQfk3V`v`1>*nZQdo7lrnca% zU&s9cbO@}LFHie^6{(kXq*c{cbulK5ts;Bgo18k&?3+C4`banP32h@!tL&DzmHT!# z=b1WW4Q)O0UFA&QetTK1d+56L&AszYz4MhEw*2W*f&3JG<+paHKy$aEinGu?O}%C< z=quzA_qcqkJk_j)C|huf%XoK2}Sv!p}~mIXImT{o?Ftn7;EyvKI% zFiCxx-)PE-sC52SzPv7ACYE~9cKyDyoVC(UnBi`NzPBRK-)G)(t?F18bg<$X?gxbFYnSN&q8ZuU^D%$er~%mPSL1e#ba))Z)b6(Z?R9TY=#ABzAee{ zwo6@@Mw>-&I)Wh7`$hiHw=?o#mb*weyhdUumLcKn*PPaCK9{gjqvcAw)+@W?NI9Co zUd7|Oh3(^>J}y&uz{py@>BHQewsz`}RniS^3KSv@oxi{#@e{HK7xkz4pxu(0`P5qC zS4fAwF}u}6PmveFDQmy9R*kQ(ghjqPTc(}2my^4=tDYkI;lc`)z95vwJ}4YL5}^uE z*X-GX?Kg=kojN8(lkubL;a5kEZI`*b1;51PO^35SZl>v4P5kj#Kvswy4>WoO+?jJS# zi9vyiB4n8K-83{i2Q}EG?68}0y z*Hm^So20D#q`aJ1;^d8!<@g%XcB=Yaa1YM#DIb%2Hdfen$Z7eMio34-J5UKUC9@RHI4M37~5xAR*Ar{q9foZ+O zCFog)twmB8G+0Vk z^~lVhQLNhFDdfEFShMuWJ}fO)ADdq<_2pFe0jfQ?otG!>@t$Nv-apIx%#*$Vg~X0! z>)xT*!P-jl!P=i`)NYF}9J|8KPTIEJG^;BunA$qr@uPDa=E3#bKsj;_eY_HUKSC>H zV-8dm`xF6$c9QIO)9pi%jl~rFqC0PiK&Nn%+DRwpEuXJ|!j>pIKdv_ZWO&|GeC!(Q z$20Eh1ai~()>V`muD9cEDcRq@eWe(53bK&5^a6U!G(G=Jd*qLhoXx^_zsa`ko6PqU znGGso`xvxtucJJ?je&)bS;EAwSH{D{(2IF>YdkpeC1T31{kl9}R&ME@-5?=rmJ{Ol zN#lC{p%WCWK8kg+bE&1e4y&1^kh*$1wSHapOWQiXQDWGLm0V`Db8enX@{>*^ z3%RmD`kwd~Cyu*0c(dw@#ork{pT9qNC%novraQ=PlmGaAh~erj6*b+^UItyF@vIfs z11#PC#+)d!%`Jx&RqQLjz7$Wz;=h#Y^z-a;NaFI(~ zqukEbeRjmnLtX|x`#hwGuI`umsl*PQ0GP%J*2AWbVCI(-c8K&vW)8^~{m#dwGR-G) zW$r3P&o|#NdY``4%1oC%FK2&1%z%<4yXuv_wdb^41Rs89u+saXswDm^)%n6RW&7cE zh4(zPQl0eFM}ElZ;W>TCtdlC+NeuxSKef|+zbMdU&m9Zn0C5{V_3bY1XS6&cCIXy@d8O;t%cK(xW2Vk~DJbxsc5O|hzM*wgXSy%kT|KEJFh2QoTU*7Uc>a_s6* zdaeNS1gr<=-M%M@`w%pcVrH!W7@{S=FI~R66giDfn=A3lOBPLK)bgc{m7lV3L0VPd z3rukr%tTR~?sN?>O!1IhL=7=U@!rq%wZNmw-@sPasT>n}E(GX5ZsP86SbsIfGrbYA zlM|;Yk=jCcX)T$?1z(PwbvSTVHMIzom$AX?2Y!J2<}&2nma*O*<-1lpPgz4BjCB+s z5kJjm@k*LlIr~6Ncw$DNwaM$%hfrexMvD*0Z4w;cxlTt`1o;43(|Zs{q;UrA;AK|R z#GS6+xR901MJ!TuAe(TBg}|PuzkUhpvP8DA!D{a_>zQmI^;G=+?6WyH)aQ6 zNlBCnNr|;8lPs?TI{I`@Ede6;KGl5<=@Jwbar!G+<>)a>^gG?O8b{m2xDVr)?R zK%SMp2*JBrboUuW*Cz@H-l~ua#nqdFv?wjtG*sEGZw*gVKcc?o&ACN=flL|Mv0qWA zMK1>~F*>O&V~`7~;iVa++3krD95M5^BXXn8+E%$g)S@SZ7)(y>d;-~3{HXu zbwmnmetn*eUadSEV*Yem0V@73Vb*|)G8*yi`rS3=_jSoRIu%SP-**at50obaWv>q? zh2hcE&uO%z0R@+kiVKDw4mZ2+HdQ;eR=%Fd8s;ota;dv&=33%*=os&Tta)$?g?Xuv zM8p*eAHV5gzKpFUKoPu59hU+aP$&hKl+ZpNuRk-`wjFbpYt~8FUZuxOa<_(5J|zl5 zF|pGO@pe(jqphwaIF<-}T0}j;VQc*n0q8*T7z?aARHI!SdQn@}m#oY+cSZC0m~e%5 zwuL!_j3rZocRj}0{l#o41r~i_JMTWD=3N{&tkqmon(@hcoTbJPrN3GnGT5G&o5I%#;{I;CRGReB{-zqHD?{SOu$a*^lMZSQfcTBMuj)xfEfiaMG<|KnGX@tvYFNfpTieKHP)-#wl z9=hCSpKtyd-?Wl^K0Y4q_3Ue$OsiGoD!=S!HO}y{h5^EyZEXh*Y$@06Ug+9|NBX3; z4#21FT6#N*mWBGm7hYg|;ej!fvfk9FeyrLw?0bLrb`r^`QvzRXeS@$0msl^Ytj?QG z`c_IAyMw1f%Hcg+3w`EytYVx7xCeqivKv^kYW=z8kq`{+Hf{T|83Yvq%!i(aOe9z!$zr>iJ!DQN6}4n zpXzPGyy5R!qO`)Uf9*ZD0_76@(sglBmB>NuI5H-YRVln)m=O-B@_T|@+~Rhez2k$m z%)7X?4nPSRmFakn!?jsy=n`QlQe0Bfb?0tE z^C<+xpF3u<;mNzrk$9VsJEr7&AMdN6uroVnmJo*!yv4GCEeNcLeRj=)*S_ftDy+nt z78rPyr^uAYHT7{_D0JBNqr0Erilem7xQ&kJbTbn0gAKlDwze`JLa-vKrHhB^m!q$I zS=`?_S(x$G42nwKJeNG#E)&G76`n5B#TTGM=g~Ea23xb1k}O#@9Y4#n>ta_s+_0aC zVzu?9lk|n3T_A5Z4@fsM?&oJ>x|?^UFDXCgicQFVOB?qP)15}H$NlN2!h`{R#FScg z!JH+0ATZ7^gBo8lE>5b?UoJx6b`m?z3M=i4@vnoe+PpH_sHP?5%>O7tFg)>*dvcg>(n9JkC_jUP1?WT$n~B?5 zu9y9#>RbsSNDQ1Vd;>0+FF9y$Fcw;g41KYTcKPTqtj<#J_Ff+-evF*tw;}BC6xclM zAaB=M1iB)Fe-W2QB_R+qwTir<7O>(u|FgapTqPhkeLw(0^rtoR;~#_yi7GrmZZz=?B`H)M z>gIaxboA0D>2S9~eYfAwTdhOPkaHt(bkzKDxU8_|_SwsR{3&*GZx(goEVxbRQ;p<{ z1I@|er_GNb^p~=)pkuwG)Ro9^BA;u^7Qj*4`BH(#=V#rTM^l%#8g&?`OOM3NgMDWyp%Gym_nAr!Q-wihkKj?#OI_IBh)~HRW@XC#(n@s*@ zPyb9P{K~mHVfEvqDBfWQ96EnKT5@9IIH3Ac;mXI23H}s>nF_bbjf)iDk>0O+i*9u4 z<`wMQf5w@Vb0Vr1$4tx$TP*+U^{dD@FxO@~@;(=n>8QH#+<}wzYVRco9Lv;;J-@oa z?c)ZWvi!5~_U1*1_`~)MalhgB4gTa3IFh4Lg+F&tStUjIn!=spvb27cbx)*eRTqsl zF>s~O=3|q?et784b@;aOcK|`?jRl03B6O{MVxt97Cl`M%hE$M#3`_Y*-7UxCVA=hV zl&5AI>Mxz@vA5?gf2pqr|j(hV%4PapEtgfZyad&-FJ&ifC3c3 z=jMUO3*rrFDoff*JWe{*&x*}E^giEHPXZ)rc`4fR3PezE+Fw&MTzpaN;0O_=DT^!C zkJ%|p%JaPE=DUxL1#G%=Bvop~^vXCKWs15Vl9mq(dJeYry?|Mcp9#*(1aT$vtFchk zUr(QY&ppvvN1QYB$N1Ok`tPay8J&O{!qk5DE9O+%ae9rmKFu(}Tu;gjM4B zitEm3rGTPmUupY$*zhzmG@zHDTr(}(^YIKb^vu;J@N46TQ2iB%9K)Cix*>tAec$Op z_G@W_X;qOdH%Iqp?ZY^x=>gR3YQJUmbMs21VQpZMMmFN+e%#-U`QNV+6xas!yH|n8 z>XSY!fOqr-_eDw2`Of^=iKZkK5~LxJpr_~Q`juJPGfBX<<8p&l z^+BCqSZrxNULgl^-#RYoJc{q_<~eR(_71oKv036exqfgCcifr^EY>yFR9&^`=!9sSL z7H-rvN3KuuqeV?6LJ#5L>=+)a{PDiJSHiDMyoDr@hWVDy=I6LWrbBvU+IWVwvR7Vm z0B0+@Rq}uc$OPZx*lIBPXI69OMe7aFn zSRH0QgDO_N{Kp)3wd3qePg)VqvI>z$PDf5*pXN~^^_BVz7{N~_e&zQ?K|^2YG~M&+ zG^&;eWVbZO8+FBc+L0OPiw-1l?nf5;_+%9PGxwA2lT+hu?k*#&_;8|Mezb@D5k9C) zy(-D?>GQC9!r;Vh=Bc;j^C!4JV1XMJDDV3V`ugZ#tfc5*l%5R4CC|3_h3TNePgaEG zumWm4E(sq{z1)s-c-8|}mPjU7zkS>4;0#5>ZnUsMV=(%Vq;D_G-kFYxhqWP5G@JXi zd6TsKSgh!#D}OslLEbgl+AwHH;Tu?HUU4Rd+=WjoZrL)FauFV75fwNM^rDny{NO0P z$d)I&^UkII$crl%K$Ue7XyODh{t!ND3w-w>p)dd%{hn7}SU~lKA;W2`$sQb=)w_Q@ zXUB@Bwbv0lIUiucMc;RP)6n$7+drt$yvty)HT{+5@;5t)@>i?6ZmHij-yUnmSD!x# zJV%zDqq^{*w9)sl|cD=53S0LyKtLZxo?fgP+Zsk&!yP+x49`~Lq^P0&%1Wd z{VW8&yKLFN}7^@*S0U9JSxIJYfyl+$$>bIEa^EX4E zFmS6~As&PQM1p8`)VK&QQ7I}y%z={u@cN4oPI$lfd_f1!0DqZluPUYr;!F!D=R~sj zXr`t%%J&@g!%3Gpjwr%)j7d7)7t@P#Bu#jJ_}E$i2j3A(^@(Jg9l~10B~_aGcJ=xb z$_xvZ1G*QUbf8IH6kZ>JN%s^xGYGMJEL$_H_h}vYittput)m@5Q9jY|oPk{}5qHA_ zuO%QVI8Aax9W9p!&fELc<4}m1-5*gN6NahB;{vq#>VVvEA6(j-Br|d0d|4*q=JD=X zdTzrY*B9o=N>*(8NFVy4uN|07G|153dnoeCZ{wJ5r?q|K1$d*EW&#zjke_#%!1GzN#uDTZ51w?LDOObX^Yk< zWP(xO(FvkQXLjOMYR@l%J5~qbiQk(pu2RTd79ee)Uu4DZEdqZe(++z4WHFP)U#URs zVGj9dQAybPI4omMj9JRXV5=(_L{h|8G@l6l+I^AF1$9iB$>x`WuW8YD<~7WK968r) z(x7+Uqe9Ol1c$NR3`xtyqS$9IBXzUGcm|}^V;`}E?DfgQd7>!tuTNXiK22DINptmy z1}a_sszgNg8xr;IJa6<53X~aNFdjSKI&!#}riBV0G;)Sk9-r&iiXV!ym@$~J;b9ox z<(Krq0FCiiDyD8&D0wK_cbbJqa(<%0n*J}XO2$K%SL4EiDL|Fv$+dBTx+)+js^%eO z4j1<-%^+YaePJ%XpoZ)xv+=*UO@5{*= z!ZVL*wE5&b<;i$Km0wcS=v|m=^(IiOO^F#Z59`hFk5$Hk3lj$`oWbi2tw;$qKFu%s zuEh!;T%<$}3*u^T57wEMmIrx~YZfK=cnfNL7+u$uXJb27$#`g4-=Za3x>u_EGE*%p%V@U34=IQSij- zSgPrwmY4VU7~1y5!WFb-oKGw6A~T*X-K;6mKVL4uEq8J?l2Z{T4jf-LHxccJ?R{x< zqUPN$Wg|3`xoF>GVE3J0XPZb%c+3~s`Xl$vGHslDX`)&VWv(F^$#Io-)ymL&0)Iu3 zl<3QZtg9HxMCRG5l)OpCg_KE|r{+?)wkIS8>SOzzCI00zi6@Q#<%!r8q$I}+Xd ziSxra0&Gm!Fc8>e=6sE#u3SCbkbgVOFjheb`~~=5G(zaXPENmutyC)C6@rcs2V;#p zXZR|&2@F`48MdCS2B*PEsD(-~#;1{c!~%u=4ziQh*V;t~SI8!~Ks1Yi*W;8}; zQnN)XRp@hYBI?6M6E;b9=!QZ(sG7^aSI3Y8Ahqr1iF{^|hI@8C!H{p1Q<{FRlY7-g z=dwUN7usLqPK`gr2tm1IK}^0aD^JHExp~5qAA&v4$1kq1Z5sALyzr(WwDGlsC^iFl zQu-nt*K^u6rlSNclXg7)AtErija{2Bm-TgW&UuJ<$jwCzw=-=`I18Bt0k=_jWaWp+ zfJLS|LA(54)_$yb`eP%iR^{l?W6&TY&;8OL`~94KiT-_a*}!7&whA}vrvdzNWfJc~ zO7JJ4MphJ|EB5Q|5xd}^%xnivfoMA>&6s$rS>M-H8)=84ceP7!3V)ax?LCN*PC##E z(Xzks$|>Qku~|j}m>Z(YEh*8(SI-K(iWjs4y1?9fH>GKFN#9e}uLPNqg4{8d7p$bY zJ(qdDSmtOVq3+I(e~yc9(PPVV=9(J@>;$y8u>%K3trY_=^G*Dn#~>uSA6eQZ_Ie`` z%XEv_<3flmnx*q9O$ip`7nywAHA{?%r(;Ln$0e-U&CL7H=~HxH0+@g8V~Pu3A-hz` z)r|HxAVo?t?N#7mNRIF+duIz^q$w@xH0Ge9HehOHlHUh6q+tr-No0fI^0&_Q-I=3E zvDxro=ziqgHUXQXXVBq51%##jY{VtWJmUQY{O60TIzfMOLQ{v1Chs-V?NvazU6Vk# zP7BX@Ztb+Te%f=QporBc2}q|UF(a&4gzdp3AI;#js5b7mfhmfZ<~Gho1k*{#-dlOe zq;aOH4g)0PFl#IYbjllELgZ_sD&6gyeH7X0&c{#hc?GraW_%Jg90CWJ1(^IqeUPqOJ!^>x#nF!7OU3j35*AMfeuJnZ~69JUzAU!<5Zy ziEqT8fhbMC<0-bv3hO2w@nnE><8cU;v$*kD>y^!e5N3s!i7Vv-p5d{V%7!arQW`x} zEU}$o5tRMKs~tyUAI!C)TgZBF{OVfpBmvM*6QTENo1sEq?m({gp$USr)z_w6GQ%`$ z7h;%#pI=xAzqR!%GX?KC+{2R3f*=#oV{{v6Y|cC%{ZormQcx1LDPyxpl!QOVEI|G7 zYL5F}+w?GHVOn^=t1Bf-Hj|KhR9qNxAm*Kq$Ji$R=jq9QnA(BA$pN*(@B4nR`7qx7 zN<#P7&))ZO<050OL?q)xUkFjdGD;NJ4lE#}BeFPMJlErPI52Pp{vUAFf3IBYJ0{@z zu%>$F#AoY6t?By?I$wbtR^%7tbf~Ywi?o$SGa8!{lmnUR=UR6!fM!U}Z~%q8grQuQ zkzxWbZ>L;W#jg81;8TmF&2;y%cF-vF-Cn2b8m_uTDdEs(@M+qQ(bL%g`HR!#$O>jf zv!I&2(}6em!+QmkQ${)O!VeFlcO<0Kiy> zWY%?;&&$3^a29oY%=xUguy4&7@~NsD_95e;6O3SM(tMOB-`U1zvld>_%8HyJX&p+l z)5Eaf;t}Eb%^7fV%9xK7%Xb>;r#Z2ibl%lKO5(Rrm%cZ8U%(7}OJXt@L&?mv*t~1#~$Oi^eIw^x`Bc!Y;OaATsd zSVBL&0e@RzFi_c1Wk@DITO8)q7o zmPQa28(Rh(iW@bZts?t}!YEx@N+&rGg1EBjI1ayRC9FX1zfYU!kbSP#m=D}Qy|y$% zNiB4}D&rp^a`-{ zY!~0}PxA4^BCgOKuuU#o?iV)@H=QuT%qqAHNsmS4JR~rHk zy%8L(yn30{g!|JQxSflu<+Yv6KL#?F-Bb7GSUbH5q*&Rn=fOfye++EM+}9}?Lrl=- z;aJqI4gUCrR~XJ!S5OHdnH|qY*tU!~#+Z=VnCnX6_9U9VMQDK9WZXcGn1!4&+voI? zb5yU2Z;CbhpN1{li(g%Y1XSo&o<+ir0-#_>^uWPwc30O$(IF_UayOZX2VA|E z?-z!w+_K#BR3C*DG_Q8t-1vdN;v>(uzq9rx*fY-h*)NJ@W}}7|&W;lyc+;}H-V63~ z;ONLzK){r@gNZx@BKNWdL#AMSgXc{jtzli@57&3sQpHXfla(meELO`G!aL;U3h%O6TFC(=1}MxMt1EY5#6 z=g6TFho+nk|jK1hf`QBz#-6n6Sb(+$1Dh37n)4LED|N%R@yS*xtgf zMTww1d0oj~iHh!pQvNV`V)fYx!WX`a&3)u12!}5xzS2V?F(tIvn=^ZMp)>E_E1b*Q zKo~+qg)l_&yJ>MOvH7J9*I?_(az6R?Pl*L9eMfM=&7;q|)CouJ1vgw(L1(WS>{Ea}%z&UNcIHmV{TOKujruaOC@m36>t zk^-r{QBmvsqnS3&P@l5`aG!2Yw{SssHuNeFIJicLYhqn*-Vy5eZBXNuX5xtr*_k0U zPOje!P{gXi9Ew{#7z)Oig9?yU@aglyNPzMSFGtzHgBHzve6!zKHm6og#R5~&-)y8H zd$+HyE&FNlCs?-->!r}GUDl?DJ#42y;q5w?E=9J+1!hcVKiQI~Uwyi{^O{`T82q#E z4mwS(F5H@qB#T$bpKeWVIFL5?xQX9uST0rwar=lvOGR`1VD=Xdmpgf_6e%fA|Ioca zxUj~(X=~q!4AEPV8{k?6mUq z;4z1p0u0pgnwloZwQoGBk_vh!CewD!QPCpLUQxs*+aRL!b# zJ){dg!~#@Q4o#FkPPxg>6`4AeskIOdLExfeSu~2!ukHrVXW{oE$SCO{Y# z|K>|4n>J1@_N=28{qsgyxbmaAN^%uVKLRmesy?*H`u|F`HGBp`pZL2)JzWv<7+iTD< zN~i1w*&TKMJ85_FEQ$S_P=|nF$T#~JY7NJ`pd~~aJzri~vQs8E{tsXS0;8P9`HX2U zU`+g){TTO!(2PEh9IVFwh}}IY-a86~Opf_N?B%)1MfH9gG&w99Lj2I^Ywdi1yJ;3j zzu(`b!Oiw}X{6KOngTgk`L1kPa4{GTItHTg~4%0d0KgTBu>P8%}pV{0S$b2^RRJkjJdKZwU21@_d^k%dZEY4o{}%VUBUm9kufBz^5{H}4?g!ii|`|WwJF9&WMwY+1;O@E z!<%**d{xUp9kPmaY?Wvj^q)Eyhz+)9@FHu7K+|t#G^A{S?S{CH&X}I9)ck=@)2=ya z_@wB#+IFUT6eEwuzcsOdE!~m|iL7V;&y_I3VpHj4pGWujCIvP#_TMVPcv@s%}@=UU~F_0>;!zX&2c@sge7|GNxZwdt9ihalq@~O8)OPt zPtdo+WEKdiNz1U~FV1h`9=lA)D7)eHD9zEGy51dAWLe_<$8yE~BS%3cy~Ig?$x&YY zm%sDZ#T^>vzX>8vE-s_m9GyW|JP`zfR@IS2jcDZQ8+q zxtC7F*RL^d+3yy^b_&#D+2udpK233X^n_nBqD$^HjMh zt3&_IJ?#zs`{uv9uc=D^uUuSf=6|^v|9z?c+&uW6($X)FgV~RWB%a0kwlBw^CoY%& z_$|YfMJaLA5XgKL7%cegK!w5KnEy2Hy~}n;|DPUoUG#s+#!U9IU!d6zusZRj{E<4g zNL=eHg*T>LZpJrx9<OmO>z)!}vIqjz zy@)5bn5{ER(E)F$-ce>fW6jp>-dB>BHiUqedkgw1BOnK{so%q zbIXQ&ym4>jdFzpEr&G+Tm;Hxg-vggJ@%#A-IC#a)XQ!Pc# z2JOtwn6Jme2hdSE(B7pd{u2Fqqu$0<&0F%PfQ4g`-_Pm3=<{_4Ha;u9KXB}nuJu#a zqUz7R1R!a>d^U;|?U5I|k_@B33++Gd-RRgw_}Q6)Vp$J{XeH|v*^)Mbn4z#5^n;+u z{`OCU#>&sSK+lFp2so)*!;uz-44M|Eavih`bOT zCGXS<-EhB?eJ!*7qnqyz2~8#c?P{P`BJoQpM+s*^4n zinLtM5sEWu*i@=7!oL5%M>Y3kTohndw`A}nfg$SKBH|(a;eGg0NnVT`vZMB~J=L;5 zd0VbqtD9X0uCxdvt(Sze6EJ72>VMG2j78nQ(8eJ>nw95iiZ#n+y4X&-Kx|4$;^9gg zV(QS+3hMudfldPdyVjzVUYU`l+9pYlDD8pojaw^xTz_E$4m}I|*}H829<9 zDMuiIp^b;e7;+^CXLt0hyYd_<9=2Be!c~4f>3wft1KdpOP=bYkyn9N^w)k}40xd1{ zCeRTH6yMgA={C}8#EI;DdrwJ}<|e9QBE=ANP!nvD-d?S=x11{gYm5 zbo6c?JAezk)^=crG_;PVG}j{~K7rJpt(Q_=E+3f?ejjCC&UVuA;e3>y-e8`S`&Vs# z*^B#)6>nI_(%mM>*WuU~h{xb`&1ct{N$^BmWuB70A#}K-|M-n3W#YEIb?QeJDF*21 z(bPxY&Qj&wEDbMtdzeQcEn=dcDL$DSW#?~?u2YN0Q|vahG~q8NphrHO^L6v&tMt~= zSv6Ql5=De>Jq6P?lV-A=BJ}CRERJ~B5Cs-ug)_k<=GuxrZ-u8qLs~6aW#0ZXr0$Ar z6}R=vZe^UoxZ-1L^u1~OCSUji$m=!dT9vDh2YOc8r=Cr1^YTwj-IvUcaQMg^vE5Zf zA};WEcWak30S3iHp`HVOU6&B}`pwkiQGBe@Eg=74J6>}fF5DC66(HpF<2+<%k}-eI zv;&JQ>M!^*qC_09r#iJL3STj5KTDwt+k=q%SX_sA-=JO>+a8TU3Jt3DLdRZfGuZ;~ z3rd0uw9D37rJU?p~;2XqoxVch1dQptZ=A#1kkExASKa4989ET(Jy?Dyh}Gc6~AXUOC!s zNZ=6&5iH77Pj4&7zh(T4VE7ioQ9e%cH7iWWRS^yK&|_(irdt0f-5oMo$`lj>x4itP zF^jvcq`2!W0D+{F3j~#KK!B#ljM9DrGrKyHANpNRANtF`NmrW%Y+PNsufY_?QR}Ux zNMEl$yP~DM-t39SAb}BMy3cfGK)>32&mrB9Uv} z+U0d_m~NGQZHHx*Q>A!^HvOz+&aOtNPm&DWnKVI7=In*d_ZbgGro9%KH?*bc zO$EJ7m=-H1glzo3R{Kv(C^EKoGQ=Hye9iZ=3vpZ@jmaF_HE-kwN+NCp(YQFp8>S%y3g50bJ+5@r;e1JR!)=Rs{;_3Efi1}07e$Z7s zS{P^8P$3UjyZnrcAyb1X9@u?1N&Y8xDKACxvBq5!a&1O5Irx~UJ z69oqxQdfJ!9LZGvxEf(+vHGS!hn$$?~*`g zor&~iOVB{}a4AF2uP-l-$G_8Bz4=+PZpTt@m<7xv9i@0S+TzoO2pNn2l~5&%PXC?q z+}A^Ef+>XkZ$ed+?JU1*Y5X+5g@u2`UtG=&%hsBsD7uV>=#60-otYMC2C=J3!Nu#I zo*d3!F&a-VwbV$nn5$agWEElu6)q67>n9mEA#+>!m*22(L@*Zd<6$a_WLXk)c;??v z?U>Na7uH3~=ABevU)RpfX&ft7ho;I`uOV%ntYZOE6U>}a)W*sAgMT{&U3ArR_T-4Y zxl+SH8JBCzHt`h2*WSiO5UJu7lXLa>;DcIPheTW9wC)0f3>TyaWXAX(6XRrrvz8|WfFPw(DV0kbDu;A z)Y7D$jsLNHFMH5LS4MK*2$n%6UWbk~C-;5N3lja_)-G_#GbHt#17(j0q#Pama!*t^ z4tzt}N^Q5R?JJ8R>wp*Qcgx`-=Aena#_&ue*f_sr22+8+NQkRBR`-Yy`IES{Fs)2I z=p1XI(#SzMzIHVV_o!$fiUj6T1HkBP3#G9@GKkmqb|#g1v54i+S;kz8#mM8eOyFmH zWJ=Ul$NsvX2-yb%HRtgaC?vj5>8zb!+VUBB+*`roq!oxe$)ph+YGbbmv-_Kp>A?dH zmLUImd--c}Z_VS^G-6hs|IS5(2e##V<7{bND%(1s6gI}I+IYk=A+Ju4tX=U)cye*? z4M1c_za>xpVbT70Z^d+*Q#QknN=`2yx!WmLPMf+DDj>Dt+h}g%i}j_5%Mu`_-KabR z9SHM7HP1h&oUW^XzU>~UYaG)(&g{U}m23dy;h1_6*ZJYb`U@oJ02D5Zv7v$+_1ASM zu_Y@CTGqsUDTZNRGXJ;=n{y0ca+g1=SV0N2KQfgM2d|mkb`vRz8K}cA1{$)tw!gQq z6J7G$Jqke$QM&8uareg1a8#|kK+y>#Oq6}4H1M!10~lqFqPd6$!blOG#5|`Gko56- zQ58#q*q+ul>bGrvGbVQiUaC!RJ80p|B%vVSDG`<)HMFCI^TkVW>A`WzsXJs&F3NOf z8YO;6BV}bO-@|*7(9}j(DEk2WZ?HBqDd%9|0xG_Q>&_|$qeCvv>gH1%LBEQ&?rR#? z*fGe7WfV=foQV$~vNUyHqUG;4#w* ze;kodGICGv4>-}4s<+1h4L+3qTK${z6nT$n?3_xk$S(;AhblIV8oi-S)>|Dn^<*Eq zk@hfo2VscJg{3`J$nF*KhKfKi)hTN_UN6iuJy0>ECl=4mgOT(1A34DvToi_l`z@+^ z?%fjdmV=e=r8s|ri>to%9-#_P`cUN}_~64WDGpm~PS%_f^OA;p1rKVkn$N-2bLPz6 zqL#d%O{7gPVY%Se9_`;2KI`@tyw3YDXNC@Ys-Ge&kF$VUxm-@B!5%L;H=NBCW-0%L zeX%#({BGT9JT6V4521pO zz{~mFny%b5#2W4WDXQ`I{ELRgcbsrZR?d~^m)y{8A1_6idI&-6VTv?GEcKsI9UA(H z2aaqcTyFI09~XNLQxLKj!n*|ZVh%{lgYIeaDa$cF3vmkU)}*VqwhX( z=(t99K0ItB$!>buZV}vTn@ zOf46%CPjX4EVT81BHVHe(4PHn`iDA-KW+6Nt*kzIlz~(Hr~n?ke785!zVaW`5k(eB zy;t&9UL|#CbVR~HCcLFP}18TYL@mc zr-?S`V@Hl{6GZn9&TJ(lPist9+r&tOs4C^NkD}x58YS!#(84{ zf@Dmx-BY^Ac84w~`IIy8u#)czgyJ zey&f?UB?xn3Y1BHyCY6V3oKAB?-6Y&Rtx;*f3aOkN`bky^!2H-5~8aHclO7hy!oep z9K!L|?ER2mu!mmmKRk_Zkgu2%pwzt9e|jD*_H%j973t$d9nI0ax4}E<|J1zK&uf^5 zxo9wup*w>1H`F@fErgQ5hZ<6cOVDYcvO(7Hia=oBZEUj>h5M(T=>{4c^xMu^!~Fzt0Qe`%rO|qwPw+0)=3gFviR=bL!$&w#in5^8bUmw+yOl-Mc-LKp+HncMAk(;TD|W1QLQR+%336 z65K7ponXP;T^8={?(UwRkiE~@`<(aOe*5;lx4SBp4^(A^nrqHy{+}^^V?2d$d$p@_ zfp&a2^YVrE9bv{M;*HahdAn^*6&OG3`$Yu<8|B#*fha)Bi%5;M1zo&!HMJqTH%Tv2 z5&2q;Ig7D7Ga+hT7G_gf;zL8z-gO_O6DQk7WImhu^kY0{@k)U(Ckc*F?R6#IrX2>V zX+#IcuT%bInYzL%n2HhDn5PE+8oE%p8@@RVJS|j%MF8OE4c=h6p@Eyi@q(cc$P&V) zzI_;@W%16Jm%w@l5dBB3i31z-w1nzw;}*gR+_SGXoa;@-*UpS zIX`@#>kPXOmr7Cl->H3oEZCnGv}=H>E(f^QtQ5h8X##Gg$;^DNG6dU}pYHw?+#J+Q zuUdj-bA_!wwF`Wl@$dh>oj_8Zp%^(wsfLqUf(~*VJ3}7>o}@~w)r#pQiHfJf_QD6Y z2lJf~@LuZg&Vz8MTm(Je+|0{t;`nFXGEEr`T0-VlUwd-sapH`h&NENxtaAv;hAxbt zW{w>;|e$IHl@SR&rbmlqMWTXVJ!eH1sIJ%z2?_L4R%Vr zmT1OV>eN6N!FKSLf^8QzzfjgpwuZcZoiU2PdFz$)=b&KQgk=T0FJRxPGdV~nj+j27 zn%)fyHe8pbRZ3lK&MuGCqqu+ahxddB+JxG@cUvE#YuN!gmFWSB3OQ|)^W`&=7Z0w@9k5sUA`Cp93no3;jC z!829QY~?do+U-)R@TrO6vw1uGG5iu)>j{B~s=c73b)`o8I5F+oglzg>LaqJyi3Pmr zvc5^wqip9N!ZdI710xnz+0MBDKznneN8j_zC_w)bhwQCvFgAE9JUa(crX**q?1C;sHv=!4AgYU^Q$fiH# zhO;ZPkPl3-AtD47koehSADS(`Ne%<&*(A)7kaQ-W)VIT>uXapR>x)vbahgN~H8_0| zcD!XWm_`zKCls$}2KDGbK*s&x6OUX52zi$-VrP$=c9(Zf?Si+GH}8y_L84;twxU3M z{3+n7B25JO*b{0eXH7v{*YG~NEDe7e>c~1w=?{iF3^}+XnZyj4+s4L454xzJAIB9j zO~o0Y-yOnuEG*NLD|gQ%{JvhYL!xNd@;7+PO0i+! zJ)ev8>|Fbpq&?8t9Gr*Nvua?^Un_i>gna>iu;?SC3J~*>kpXh5;yuHGaJATvyAt0_ z??A($>4U(W zx2GSj;B@&tIH1#k%g`NYq=XW&-0G2cV|a@d3>ZS}=t zZj4zExF`btRQs|*VQZxUjDEKXl`7B1QMVy5a0@srDKh`XD{8&au2&SiGm zX`&d>LN-hgp$dPa#Ld^U-Lx(-faI;1=(cvT9e%XO@!%jY%(nVC8~LB(z-(7HXYI$g z1>lSL_pIN_G7^5_>12eM!A;jAuQK z!-THuRzppMC|Q&E#rvTwB7^2V_p0EMqqJkY92jM&o~W})udr0almmCf#+ZpROM_;& z972ZjcOcentZEQ`D2n;Cn$p`!{_>RctoRAXBM~dg9$Nur*Lmp(nFOjL(6raHT0pD= zH(R{P3`fU`G=Bm0@)#+1HgY_5AS>g_5o^j}9&9wmp^$WNaS>y_I#$a{H$g3?!7A)nkJJlm&mVK(;}rC#rF`_aarMElHo*AbMSlL9E&k<^!&{>m z;$jL~(l*7Pj8KA{P*fstZn%u+c(U&}C)l*M@);@m5`M7PX*&2f&J$*^`W+!s1|pyA zEVyLr2rCs|?fi=@YGgv}(xM?iEtOC9Ek=@Kdn0R2EgOR0Wfe zKDAL(!A=%{vySGxG18j+I{Sf#pvwSB_8}9hix}}RTOxFfqDC_7?QWo{K_m#)d^2Lz zsDTJs2s0DH+lOpG(FpH6>vvzdF%S5SgcJJNqjYL!=i0NIxZv~Z1Km?Qttmt)t6I0c zy5mu+_GJ<+)`fOOL9_OZPh=5p+qA_G5A~Z&gg2U*d^PSDy@!U z{4O^P_C&;hf(%ATU;nH($9MTtVC-apfuS4`jufb=?AicWnf*Lpz!Ir zNkwU{#`=hHJ<@dK8^c*prX%}VZX&0j{Z^jK+ZN!y?uGv2T6#osHSI4LBFWBtc#4|^ z#R$Xe@)>3(#W4jwzeanx38h4FyV46rVozsMji9Rox`gNW=t3Y2fYJphvJ0PE5Bwyw z8f#N}W~aa>CZwMwSg3y*_+TE2mEv&6C^q`DGb{Bzf|||-Nep)^bM&M#p{~&%xg_WBM^r;K1i-5{D3InOb~p?D}#;dliNS zYuK{=cRDkn4!y_QGH$@|80>6qgK)CV>D16=!)H`l{{!JqE_1YAyS~o+5z7Re!D;8M zm`n3NtU+CQo{^e4+Oy*+j?wg*VxB_$3wU%M`qiij)0p|RO+en*KYd5^ne2{7pLcxy zd>_P@vgeAyw-%wM`q}L+EuU?N9exDfN=qus_yuc{)ME;B{A5N=+x@sF6sy2R5zN>= zV>#izYO*sH(nKvoUuL}?iS6vgkYG4rM>df4=n}fkuS`8`_A_xF_o6E#+!!eESBC=dz>X#Oa`{iLI+1jQt^u&IK-uT7u(WCU-M&!G(al)1Yj%WIk^l0vB(@P5JC z>dWnSapoG3x#kFW_|&jJ8mxM{`+VN0Mj3aEzUHEGG*|!0%Mmq<`e7+p?s?|4#x~MT z{kO1U;X>BKQS?xGY{80|u(o(-Bk7xdyO>$^O;hCyL2B}wN6A9`5dU+h_;d9i(PASc z6U&|S?9LXgpVt31wpjleK|&FJO=f3}t*{Pz2mfSX-ipb;Y>sHe>81GAVw>h|pyb0W zHl+Qa<^*}oA7WeHk`6q_lW0G>XQ?Ah=-YEbY5LE^Cyq;ZDWa3tAW5O0@rU!K@$+69 zpTAD0I#~tXf^q+;jxR$eD{H!w>BC~I>K_rmJUp7c3?TrQ-Qt^o)FU-}SY37k-wmW+yDhX6;hu7S8|J%_rPZ>FWL?gW)A#MtwNA zLyTxo+$DKG7(25P?Tq`uC+a5@MuLMFO;kw!Sc0A>hyh{y#Utdr`IJImUTcWk^@tixeS=30(j|tJk7!%&oGvc*373>ga$LuC{xzpui7PY_@1q)p1&*ZhRH>USFgfZlQMWOrNtSj^_i?6 z(z&q<>;J)q`GkXARfqKaLh~!7uUvMbqn>yPnK(03UC1aFM9TzUWo(_jEd)58`DcF9 z;!1*z%X^uBAfZCM{^{tMmAIojU;IC=1qJn<#VO?17K4diBd665gHu%Er;=bc#AkZs z%w5nnL$-3v9D|eC7^(ibS>(zMHzn%I5i-##29ADe0cHxxG#h##!d9IW5hp~6Xz^f) z)b(}NLOw27xS>^tvmgorZzp8G1m>7@HuQAdGm!8P7A&gDQ=_EF)veTgl~;PksN%C? zqBBseKMiG{3XX)YodlMJ@;r}d+0t%vH`Gl9@0OR%5+!OInum!I%e17%LQ;GI4hD`M*kJD*+9_FE9s#k?~i z`A28m`2!z{LwghG8SC?qWOMOoIkk0X&%#CNyOpwg6DVc5ni^FI+j9DWtN#3ebp~2B zl&J>y+iGVG!X#nm_;k{dZs%B84AFT>FRjMQL`wB5nF`eIZ1J6Ds^ATK)Cl4kXI;k& z2nDZI@jq3_5-{s!dT-;pvrXcd+424uQDQkK?*rx(2lh z@M+3p9&6PyXxzD1hgKZ1eoxB008q;N2$V7cKRH zg49AhY-iHxzW}8t;V3*IUkyXT3|7Nynj2bp_{{5Low~?AX5C)}54KK=$VQ`G{gaRT zs3|!S!>I2S^F*UERAIy0q=m;qN2e)s zwFCo_BB}^wBnlddh3PMk)jzr0McdrD#>{^maH(|qP!qDIA94I3`&X`V=;0H$ew68F zn;VC}Yp~ZKv=90;wzJQ>)*b4-7ZnsbQ=tE$v2H&bJ zJP}waV@vbk2-jNRfYzi(J7&<@}vPu#CZlDpji{uKOYa%*s1 z_o2s38~(A!jA;YG=R2jeW%!vYQs;|C_h*I5C{WWj z$Q%0Z{y4fZ=xk>qm;7Nw2Wo)2vXR3a-6oAHw4Kz($Ym7U+_GdNDq}e<9laChyte4$ zz*3&PQ@d<0*6w2E=62OqcT`6;5p`G4X0{s`O2WLB$;U52jxAG~qXy zf*R}sw@b)tnm2J%eV9g5*LJ+TRoE^UsxyNQELA5yuSc&~2aW~i{d@)5`tep4kbr`+!zy-?B z7W}bX@Q$eMb>s;+>YrJ*^*7h!+ztnuEF2TK7VR+THOL+5wV_&#MZ;(`#uqEyf}IoH zWLWo|KHj=-GPE`sYuu3RtLGp+?$`d@d<6l&r||W)6`4Z%d77{`yXAb^xdFP%(JVz# zQNwf1J2O_>lZC;%i^ZfQ-=nHosl^V)Ie+}fgN{=p;{B;{U-8g-Sj5U%@7fPt@L@)C z{yb{<@_hB!ZZrFW2Lb}#m8KIwftr)J8Dl%;Yy6@`Z}DP>ONC7;spTP$S(^P{uaE*4 z0P?f53Lrm8p*BuNg#2C)F5|$)7rPo`GI9B<#h``KvzO!!NoGnDTP`E$PZ=ItD*F z5kdGo=6vs}y|WvakX-LHVU7+L<~?Qhk&}RGIggmUmeaVu_I32kdopMR*!WCTd=_i?8zbeRsK@wp75tQ`%N&Dk(-J{$G+g;}c;jV5fMzI7~%`E)@9#~H?l3u;ix=jh0) zTp71yD(@Oo1T7J2PU5|q%LqB4(VT^klm+e^hjhEzOIjzMfYt#=p?kANX{2r-4)7!+x>T;#*;?AY(fFnsjt`>X@718_W9`^Tc-P zjjlR`=f=im83B{mBirtLdCId^(;)J?(Ed}?fVU3xuDkq7ulSvdiw`vP+!3SbRW+O7 z`M^*#8z^z`$EDuU_b(57(Y@5fH11>8D4ArSx`il&hLzsc?S7Y34Ah$1s}Xp|jkU-a zuN;qdLxd?a!c;Hz)`qd{6T^=LKUJ){93!spUYi*Rx^21_^JE@k_$P4`k#DaY&bG&n z3yE)sBIT_eUA3t9FVpddj(I9m9WGJk3+`U=-+9YM;U8b>IrOuT%R zc>5h%RRk-WJ9(Kak~gHexYb1U*t$%;9GdeKgGdjs2mQpV{vslr<|$IcDd0LxApJZc z?9AUo?Th|Od;O2tC+;RjpJ%YqEB1f!sbtOPhW^?vC7i!QZQ>h@*ZHSSC3B8;rb9lQ zsn6m$L{nZU+(C9TrNiDLmPAs2T2n4Lz(Kb^w=_%sVIzRsd}i}%j4vTXF=if`%na|m z)OcfoKbS)#%lV=i`^OQIBRtK~%|5o=lfr~=KFv2F>z{HsD{e6LgG$YP+x*k3PGgOY z7t>8w?XugmYck0%(1>_ms#jONtn7BP>O)s_l*NV5H_iLx(8w7KNh)$z>)}={sGqz z;#VDaqTUptG0F@+6ZYO(&|7N`31?;=EO&B=cC2zuHnygyvtsioIu|6Zy1jzh4mAxl%`1r?o)Kbl^lR-8{a!#@3ux5CJf zXqee(rd~(i?K>tgTw0njUgpFr<9%^~>73cHr*d7g@#Ka-N*3irdvZvW81-?;`=K#8 zaPCjD1X}wz7U(#x`3$Qpp!R2L;5fE}iIO0T6|%co<%sCYi|NZirYSV=7xKyw;{uQp zsIExzEz(3-3`zd>W#ColFD+?_YG`HGWij<|6glff!3l^u&ibwwp0*pwMB{+ji)lcU zfgFHRNBlDuB*9;Q9M1 zBI+S4A&~R|zZ~Id<_cRl>E@0m(#WKn-cyTV#9%8&eY8-z>wyq;?zsaP`$k8CiyXHE z{t#0FPhDscXZv9i(#`yGK*mvAJsFPQbN;bay|&Ksrsqqno2*$ejNBE=HesbxgJEJ# zbPcSN^q>{(Lcg8!^yF3sdlr#A1lHLl;nb|O74pqvJ@rc@rA?Nz`}9i~H=RY}WPGB1 zRL|EVFAR5NEkgRu?#{D8m{9sWL{2jI^Kbdwsa-)qE+c%SRyR|fYU%F6_jslE4D^k- z@^f_4yfc+;;Zhy3jiG9l=XO@XaiF48bNKd@F(c%0HWDlOvK$kRZ{PctuM1q~8ee;w zncHa9NXvB?-%N*r!&?UnNLOc%fM#qR6Een~(zL#uv*XDls=Q>hN#B>`N{n|#$Ujen zUqk^nFADC@QoV-Ls0rqh+7kr|5pcBr0=AOf0Vs&YXlVH;LaaAM|*dEt55LBFb=n--32AW(ONLg7VGj@S0~JFUL-6< ztX&!@!mGL$3KABn=maOvKb_BsLO|5qmiuOG zc+Dtt2h(5Ro))GtxjC_s#=ebYYh!uf>q)s>%4h@Z!8pX2S>+Q$HKz%|rto=K*u5~~ z$K(DJ$L(4(2E7;|5#7=U7Cb%n2_wR*$1JjLGpuVMl3!nPm@uLm0tp_uO|3K4aqXIZUg+wG2f2Of3|i4J=nc8g-`Y@7E$g;kaR ze5ojqW!z!8^n{_sf`!T1n!)~;DrN}5fbaJNM<{Wujo@&rEyq1jfm{{h_l@Ouq`z!T z3SZ49zp*G`u+*aE>f3mlW;0E@puS@Xkm(K2Y{0zx$Y7H#2IBj>9rfDG1WRMo$? z6)wi-1ee{MaN4qiFKnmla9_iRK0TTahhS2|MTB~)t|l&u>w7x9#~CA{>OJ6vP}I*0 zdV^y8^@02@F&z~5#Og!$szZyI{zk*%xHaFmnm=TYY~9JK6Z;DO2gk9H;?V=R?vzn; zp@f#`d@FnT!Vko@FGGYbODJ}vmPA}r>BC<{OVe15TJocK0oP20h_iy!9HH8{XQ%K| z@Y7LQJ{nYYIGW2dHYeRzsrcGmku|SFv|E_9446SQ-GTE_fybkw0DmQ8o~!$b2B|)I z*;|vC7LB3)8{lf`)O~y3X2g)raJ94wMR*{54 zGsg_gH?@D6=N(Gn=wB4MXy~%^26H$3KC)wQesYV5VtRe-=s2pL$X}m^Id3eh5eBF7 zHl^7z916wRQ{sZbF_Ica;Oys9Vk%@>(k!mUj4w7|#v~{mV`;r02Df3o#b4!iYEGe6x&rN+uR|^VW(Z#h|=# zeyC9wNkvZ{&7d|#bOboEb9$}Wv|DP(m|xTQ;gFCYWzk3_!sP2DOE={mAEzmm zLb2t$aVM6znE9gg!#F$gEVQXBSLMd@ih3maIJ5mPLKYM&>O2(#?_~{m6w~9H#SyOC zNLq+CtM~+WT}{UZq99)tsJpoZS-*uKbBiq*Gcs1{5JBsbh6DDJL!UGY(_Jm*PB@j zf|Wfbf%6V@fK%y_V=?$(`wkhWf7GBMf~1LJE!66F_-SuWS+XXLQ^rBkgm|F=?edBdTNz>4f83NOUjpzEejPJ5`iYQ{R)&Q1ZEvb;3D{=}_|7j8U}+S?aCn@{ z&Q=#c?_qSpA3(lXw(+p=NWZk&y-lw@{B*vNEjt8S=P6#Q$>25NHAexw1yxMJR9ip%QdSCp4n^OV>VEjI(ji3zunD3#WRrlV&y8$EdN4BZ$Z0G zqZTHf|HjvPx=hBx@tJS?!bb8Xby7$#6ZdeHSQ7Hk_}ebRVOUZVJS?ZGHc-G646_Y< z6ls=>aN5%=FZ;b1oGP{%C=TWqbU`zG5-%UJ_J_!X7{Zr0mK{F?l?uj`>w4;`J4)?7 z?x;TBa-XzfzFj{2e>d5@$7m4Iw#3 zC|I?y=rg+bQD>S|kxS}y=v(o9JG%RF+Or|__AB^=yIWO1>cd%7^EhjqxKyuUUge?6 zjT7jJnm5*g+VX5cI3_1-Z3HoXLl-D^k?J$l#0To?;#T(WJ|>I$^7CtDI^>eJO7IGb7%y~geZ}tCmKd@NQR;7;Lo?U%&Av&;H#yUX8_w2Tk7LMQc>8Tc z#J^_bh6WttmK_7Vm4N`=^FeQlG~MG3aYorziu*{3)J|hHoYY9fD~S=79CJjci# zAu^xHAMdR61#MiWb_sS)<-LsHUa+Q$p9C;A%J^UHAt+dRYO`DkJ{);voxWfLuUdM@ zK08?==H4D#u^xqQHB%uNKFfV$b&%|aM&FoTaFdAjgXiFV$D6>ri@7gy(?_?mtQNPC zE_sD?udRQ%A`cVyB>!4Xp7Wk*JG)|heITNmFwz(%&3kJ|PZo6Ntq0WhFGm_>I;umW zJ<`Ck;_kPmvs(r@_|-|_2}v1vsdjum*x+CMZg=Q$-IU#>b6R28G4)KPW_k~&m&kbc z20Se(#u~h)u+EURDS`X00jhHYVKR7l0f7Gaps|mH{;8zJmjAwYRuLbQuFMsteB8D+ zV2Xu(atK-lq-e&NnrX&u3pb`Qe=IAC1@9u>jMJx>`LAO%rG{G^66ucDV)n;q>-~2)fJmBC2(QC7bdk~1!|S)R)L8@*i{#kJEj`^*hvPq=I|{i4waxFlyFGme zo_8Dqj%4Sy_KXV2_*nu{~vvOkgg=}y$7QmIf>(B1`G%=FYYSJ6ia@u9c1 zYMebIn!Nwyf?RmSDe#mkB1!V;4s|%GMxj79ff&cqyXrw046;3Ld=07mUd7oSB$O-e z;O#6d<-|8&UuQy0pl2r}Rk_xUlm-{Z>@lL1m1-91ja56b_u z&|2zi1Cshny;r)l!emzpc~^Z{pkMRWbsJOsph|%s{Y<^Fzw6fc8`kv60GNLKNh_Zp zWnt{C8U@SpWO5tFKvz!PJ{x_fXNyzo8m54gk;p}7N^>wDW~lmpFwKXwqhfwYVM^f- z7^i9De>O0jZiHlFtBEb#Y+qRM)iP9Ofp?3D2F$wU6j5LD-67mLwOKAK^h&W`pO_91 z{^WRy>&m{$mId+HX@_&YFM-d9CUK(^+1IosZ~(Rg%2W&xnS=6z(t(jt&5g-aWA$pK zxvTGQ)#K9bkOtcKd**#Z6B52@O56KpUCtc+Jo&E2$B(}=eZo|e_Q45dI65ITO}N7i z?y&J>BniHS$6ADfZtm-_Yd`t1664_h`}<(tmGMB8#LIaToTm*m? zj)c2V)mLXRuAqxU_?BesMbLb*sCD}HekBguR7J4(#av^+ewIMGW5c`wf_dE3DSMKd z_Lk^K<>(1YT(Fyztizqz_!o=0Dd&+8MZ7)JFyqLH@WHup1}#4N=t!aNaJi9Mac4B= zIIIf70`6|gWFmIX#^bFo`W`%W!N>*2!bg*2N&7g=^0V43aq z`_aK}1cIMxpwThdRaIV)ypq9e?*UhXzC(9{KXSZu9qx#HGF4|w^x8sDbOd+-q7KjE zJGg8F@aU)9LNB z646ILKEid`OI5V~MP{btWg9Yj_o6{uMIB6^@o%uEw@$?E^N)9m^nqXI=hb#H{qqqt zHG@6v4lI61eq1qjPpzZeBv&BgTV^}q@hM&e0YG-w>4~BrHhqPpM>h)`ZTet8 z`~zMG)nmYtzM0a-^N6e<*)iIt(NWNlPAAU---w-wKCZd|L@{> z{>uh8ls)v5$3lqr=6f=swkdYCxD3_$Pv(NhpX<8G7%fnGsOIf7ANn|#v-(IY@?4K4 z>FHC$RAk8S*)hCSz4b1MEy3=@68pS+&B_yGI9Nt=jSjut7gjGZ_hQ=FH@pB>RNNFh zNC|#a4QEI%@&asd7n141T5mS1ZC8)kxxY%?Ugmrb&)CtUtRlYPctojgWBXK0d30IQ zNe{0UnW)_coBHsohvA#}t}dYovZ|x6GL@C_KK)fGj}@1NGvnbbD=S)<&?3l|8d zfv$!}Qbc=0R=r$8ldjzArxD|$kuX8^n;=JZg6|jbnGe+aB-fPA9~}H%zYDPRX&^&~ z4FuZAC5PT|`yz3_gxtu=tleohi;1#UWA6*Mo z0Y4i7rO=6xQOHmN&rJ@f{6*AU!OhAA51hwT-SoG~i)^DfpDi}YIG0p!8`3qA(UL_O z;4M!f@*oZo)m~s-u};TKP{c}i|Iv2;8xAx1cQzj7yVXA%?OkcI(=`9=eu(-aJH$Kb z=cDsKZknqd!%?#uxl$O?4-^cWhxVD@ny(M193bBxVu^j|X|IGEQo~s)QGnI@I9n^s zrS;G?1f<5j&}bhIZDV9#`1hD39OmW5a@k!7oX=k$;?6pQ!{>W301@@ z2vp-!SROg2KaCmkiFzI()d?#2ev+?3!4Yr%fwFi;%^}fT7)pXBdX^Wb;>2R#lt_ST*r;Guoi*PyI$*R+&xAF+VS4Hu zK3M`8t4#ZPhw;`@MVA_SHE)G2TIp1Bk5RmFb-;>V7 zEWlCshXgxS*j#vM)c<2z)%Mw$Xka{=EQOS563B4_2yMPzg1!2^~#SovJ zW5;tuLPpkY%GFK9>n_;yMs$dor@#QW@$Irih=upan!H`NPvVHw9 zXlQb8mPcTbKbTxRU$c@y-HRiHA%e(DnV|+n(Nc}*b6fuV_c7O8GOX_Ku%A%vBfktq z+7#bR{QR`)$e*{`hR<2TX&DqG1u@OCa%(Zq=EaVFd6lf_LW%BB#IK2(IP&3YUDbof z!r5dJiuI0m$EU<{gMs}ru`@cs6~5!Dc$*Gr&kyXI-E*^bj$HoEsPt;Xoy#^^EGLX zOe~pa^!}XmJl@ok59=U_ZF-f0JJ!sa~3RsNt9B-+ldW6>04 z8lPv*Q)H%&8=P8lgI7TdUoU8j%t@(ps91=1sC}HGO2v(41)De=Lw1Ta!y{;GV7eWy z8h(~Ijf&|}D1&#YI7`@B@TuLrC!Zbf(*|M`w$4$DO?b^F1`(I_OE&m{){Ko@MYO+) zSY>+Xm$#FNPi*e=$O26hP^evJDwgQSavh8dViG4%)wqcKMb2hp| zdA!f?ks#z1@18zqA!<%4K|Y@4 z6v=Fey*=PW|ulNT<{;UYL`Aku2+RU$vjJq>$1WHX5HOU)+x z_0XHv)$pzL+8=>ue^Ic2n2fuEU58Bwuxj-qC{Dl;?A?n7qTtf zq38E53Et~MuDZGKUus~95TOp3pu$z*%~UiE)9zJmUL~w^eHWC4ofO)>n(weok%@Ij zZFLJBQb*7D1S=ubbV1E?V5XzW)b!Ju=mtIvmmy*+b*6m!_-newHU-|2O|)Hb_POqG zxC>#RN4})nsfgA6Gedz!tYtV}2a)(p0{?D=@eTR{yDzI)ttlor%%kh3eq2nc$0ise za}*QjT@W7Z35A5jwro@Qlu+cDEkaYbVzd){T-Ck9*qm=$G}NT&KhARJnF9Jq){Z|V zbzdR7i{ei*f5q`pbyN8Y+K#Tygx_{RTLUSi?f>!M2|Ck2>F;E1h7Ad%gua`$m2Whj zO3O20H1k0c>tmdMc-&G+WP0daD2GQg)2^7ME1W4zMhD0qCdMxCkNInk=j9yk`lMu- z^jYi=k~j22mJGlHcW}G5RDPnWPUt!=ogIu!2&Cqycj7y(s;Zg@s!etJozx$Vd%h%l z4b$17`erAx^E-E67gfn_yNo!}XuQ$r#SRg@P!yKANo?@m7hH#KON#oghx22L+?8X@ zqO!j6r${njYCJKde;YVxSHfG*4mf?b$cn{{T+cZZHMlK1rYiV7?yD84Ka0YDo{(GS z=US_RA+El}0Dk~~t^7dWgubmyac+OH10QyLe4fq*9ZJ`<0iTJi7Ur;A9+*1{R{xv! zl9xljDFyByTENg6vO>x9B{;t3Lu*V&ONlKF~vs*TEV;)CE zAkC{s+=urnqqEcE>S zO)gpUy5yJRg+T(V@g6-m$rTc`a$;mz5|}wfnLLa_!$# zX)%AfBcszPyMONu|7)5Bi?=eE$aiN7>P&1>`!0zq%?u5>e&&MF(c(F95bUu^nMx0< zcS*eS*ua9b)wATrU7;;X31ay08*Dh|8LOzf;`x4gn7+_;vJ83C-BH z3@+7;L-pN;UAN25uD4h1dJc{Ojf92Vns3Kf0N{iV8NgM(!;-pnUA^Mgn~i?*i$`Fu znxu|g+}22Nw+7a=Tlw*%*oLj=)AijnxNsbkT-}MueYX@=rz;u)cvo|NGeQF=&RlJm zI2|U|otGWvnqHt&F8U3D$;*aMq;&CYh=E_c)Ynl)f!$Gl@OGgiiO zr5ZB|404m=Lw1|hn>UHwE6hW7g*y~NahIuC-|2HFm`|o=w{Sy<8sw=B;vi$S zh2R(I`4vb1mE=O?hC;@v@fGeRem)&E%D2pbW&J|+ILT*vjCuIa`HffJel`PhhhkQy zJn{uEjQ4|U>uuTzi|H;EhO8x_x7+W`MCx4RYwqT*k-HXt2bX#ltDMhFt|pKl-p4j# zF@z5lo-tRSHyy8W5e(r+tr)h~glYVce&I3!Wu702AK)xjO-}pWm|L~Co}_Yb4IUZ7 z*d2h5R5JOg&pbHeVmb#Z{=T%6YgM#A7pw$l%G<~ItrFUeLh^_Bkfwv-!#`Nh`|^LZ z!SgYy^jCO~^D!v;7XlK;*I~}OhaNb)4}dHUf)ul4wOw7+_ul)MvFEx!4;R^Z!|`rx zeEw7dR<$yIDMAfqaL!1BX?()#T;n(kh#w+YW-IgPc7n>&HTT{Ec_%Hkmt)|Kw3K$u zSMfAJgS|F%XMsRzt0Rm|e42pZTW9!IBmusFka30>nsJ|`CD88V3Z!snOu$U-fN2=u zx`ynCsnps)@2_YLlN%3p>Ri8LZU$p(wy=p~YuSp@7km@XEWTM(;C1-@06MktkEfoW z9wHS=FAvYE9UD3?1C9RqM4)>g|yaixP9m^vf5>Hy>IqeSNVl*G9+q#TZW>iwrd)GXl7+mEu&Pdn_jI z!iS5W{Qp`J0lr9KTN1s?AR`?&l9fzCk6y9KPIL;jLbcq{r#NCgdcHQH9}{z*Or>Sy zbSt|}k2L;&DuF<~%AxDUR%)OnAiymA1GV~x?%^Ow7$bPiq2g4mt0#?Mo4;@bt7Z6= zu0}PVMJaFI=!rpDs{WT%G?w5%!34S$otZdMYnuf7bkHt$rfyp;<&UR7zDZd;HIJlL zl2r>+bjmQ6dzPp+8o6g89+|xpd|rhtfn6rWFYkydw%*=AhZbxRJhhhtsZU24mV?`c z_d-j-e(Tln28Fc5`{Ma+>b382K)6Ln0^{Xz z0G?P#2aO(;DFRob%p@bMk9`q!*YZEsKRQ2W>1FkWv%XU~%t~8RLiriZ5`=2_>~Z<~ zARJu8AGWh#$PR6u`#EUkJ@x+t7ge85B;vO_>bLFuHsEIcT+}0C_|!lUYG7$e8v(Vp+#l&G4{;rlgYwOKHhDK?LF-*;G5A2wT79C_~XL#Bw+#t$Pvvyy`6nsAK8- zTVS{q;IZDaZN#6vTeh0bI=8y!EU-cdSrVaz2f7dB!Uv=*D|W&&H=<@fbHzjhyW50G z9mJ$#{ZSr^6Ib9YOh!B8mwh?5hI+7OqcAH^V0B2 zu{)nzHiJ72Rd?2u8kKK0{|Z6vvk$#NPz^rU(ttvP6|K#*7gm{~D>&%J7q!<9%Lh8s zqqn*^#r)ZSD6cY=nZDq1sC&H=78BRmbDf9tdED7)*AadE@uouk89jXctoh-VA``ZY z>W!X1<`%Pe;1BTX+$lkbzw4_2_qQm?V4QB_q93Jw8c1--KW zT`1`*041p)u%Bbk#TLaV)YD7xIQ#REFtmaA$0pXp9w;OXJdp5S}qy#;b&TG9!=BTk?pDOk@FcvbfQBLT zl(O2q!(hCmOY*e!c)9g-SlSUFTKKxw5HhtIsdW%OptUz$-XR77<{$&&)o_yE0!SFCFHF4^40VWda51Ly)@8|KRfUj?Zk9`! zQM@wbwbJ=_viY3bro05`x%hdK8rX!Pl>eIPX;9?(3ix%eWZDbYF~@%DQViP&*Ke+F zUabkyfgKs%VJEhbi_4}OEIC!3y4p#S_0w~Q%ypXV!8gTVX8M&-s++P#r3_DU4D0aVmp?*%&4Rq_GNW= zkj>slgo6#0=Fx0}LsUZVNdSo&{CAA8W;0qy9kki|`gupMjBder%olSM|gG zPB@-GOO)`*_oxL5w(%4NAL{h1o+44P)@Id+fjF4;F?$K&^7H{olB80qz*LsTBBsn< zg<5S#2N>Z$C?3xyTD~7f$|AvAZS`!ve^NXRQZ<0?6_5yHBGY;r7ori`R)X;^O;2r$ zJ34ABrl*7zQ&{G0X0#CaGTPfnsU)Evmez#nc1-i`{n_i#31(o9W)1kC7el^DSr$)~ zH*U&$iS`e&GFMOwEbcE*``mO(py5ZG0p+e@*wqa&)7M5CuX!5(10EAzxmBmtd{uQ` z&vsd79#mTaqYSof&9|jip0d{K<}-fKaVHnfCFE!Q&ce4wq4%xKeGFf$7?)z-R!<<)`hG9UXn{uzrByzc zQ7TOAj%C7D@J==@fl6{TabE7IWf#7ULV{7B|m ztSl)IEiO{Obnm=fc zekHgFT{fTQYV1M;54Up*JKig6P`=zmSY&4I}?s;_hs$3DBn|gN_R}}-)w8H zRCI9LC27Z0ho}!o$PT;<9t4U;;0ryH8}8v`)`Z+m3e=^f=#5_E;{qoHj&2n?mFRpn z%X?l1oDrBal3+&G1D>^AwchMIZwlgBiyl@&j+`C->Q$>tp^sv$$)r(Dd}C*cZ>15) zz8B10xJr|OoE;%0iru6lFwkO|m?u$!*=3U@`y>$SNnvuEn{~GpBER(!O-I1B!?g6caazMm1loE@&R| zFa0N{qDk^sP6a6J?7fa2zX~?V&NfAnD-E*{? zQDW!EBlEhe7Enr}G=DBo7Tavd)@|?|gg5?L5x6HGjg)Wnad)sC#NNP~1qE*hj$K)OM?q(P)R7TpbtjzxEO!=3os@!RL@v(LWw zp8MZ*I2?{O7RYeDbI$ksywB%(=8rf`z(!BQ_#B@I++U2Ga(HRv}g!u-b_8>x$lWz zAC1THaKL_~pbx(5JEGb-e8pcPEBfwXI)XYMP@H&jFzM^P_e(v<4hxewvNs1>8|i`c z6jsCcI)@rbt()06Jg7~^4$B-Xl}xEErT>V-&$%q{sy75WXW#p9ZjQ4l*2t-Rf(f)^qV->Vw<-6Do zp25tj{TsXLN+i_tCf`@Sq$!n17`vgCx)Srl$2(-}rKN4KR z%W#oF7DCrQK2Rg0qJADq z)!PRo_Al(rJjg(?9OKE;k)u>M5YnzVUO`dOT=w{q945?$Q3vg3LeETL{E(zhKtx4x(B$%I))lL-s06bx=? z)%W9$V@$yd*XYJdT1nAKX?HLogVM z1qH0yqp4(qa2pvD(F{Sq@KZ)&PT~eMxlRrQ`m*c&4+{ zF-&jSbFTv}^%Vw(mj8mw0vxCNH7nE&M0|cPu+q%t`BmUD^a5tc{dqO?gpZn~tsnj$ zA|;O!5PkG|i1|oi7YH5aNcj-$O%}|8m0})_0WtYkg&y>A5;4_91fL6hxh21`L zCB8O8zTL&e)@;ORYEsoEQjk<0P+4X1p!LtzhIgb%0s zAsaIKE!o7)iAe{o?z8;CY*i!s3m#uL9$;%$%h*Vwm&#T#ZeM7(TsqPX<)?jYc%f+x zS9B9Rw5%UW{GPCrspQ0S(bJ8td-i~Pj86N>D&^r1_Rz~N25=Ch1|iObxSi{0eQ1nf z85hb+ai7eeURcN(hFS6B)*FuO&7a*|ZO;_3eMpz8{g&o7lta)AOIC&+u+pvo*Y;u) z*c-w|Gjg5qNt0|ST>s#t7^bNX%dAMvkL`54t8HlIrgxa*{><_eF2FzD`O`2YCHBXu{7+n68BMRIc46|tAg_*JICMg=W ze-?}t3vI4YaqmnNCb`3RE!^T--i%S%%(I#5FnfU)E?;=C!_i)jbN^Bj?|PU-a*D~J zco?)-y)Ib(ncGPO8&fseeENp%{tT2S1mPFVWGy*NB+SX_2aM^d}aEOcJ?{?tnnCXEmZuFuJE-)|4D>GdRKS9ro=sA98q~YprLcef51-HX zgfb`G#vQE#g{F_)oR@K)S8=1(5=nQnNKKrBxDU5{yF6}qakrk9ZD9k|OTg;r^!Gf7 zzC7?eQ~PzRyf}3t(4uWm?Tqg6Kz)X?*0XUWY&_qR)_sQJX*g|vxg&e`l>Zi=xRZF! z7U#a0qIs*w=JvhT*>ygo8O~nyDiCd@8qb8HUFB#|f5qv<+wgK~V&L-4eEpIB<*v@W z->Ik6N_3pY(&L@{Z@+WqzMC^IndlO$k)BaUy-QeI6mw)rRf^agV6&9 zhiw>ZWA?Cgq2XC>+H7!R(~#%sDi!(7;cXJmV$ec8N+Gc_64rem>fG5t+Tu8ziZ06h z&ALGIb9$#&0@G(4PKR(i7=QaQAOAwlaZtAwtKpIFfrC;g@YtGxe&9Uhx_WO`3|_xI zUs;ROamb;BoH@?f_}}uWs5#7{n%_S(1Ogzg7OosH8y{_qwvZ>knI#Uux((h)4nr=9H5I|=#_1`oWy9Y6(qYa{9#ShgZ_8cL|L?h!`?Ua17HeI z2dYQAFILGC#{q7a`LCTJ#j>f3iil_C6ZfYK zr%otY$-*Y|-9y-s*EE0#Z{3&IM_k_UEC=*nEkHyfQ8FkFtN=1ar>)nz5SQ$Nxivg7 zRs6h=`B!$;7kkk6JEnY}HwSRe9Q6|XT`$CG7pk#3WTLMfZNN40E|FELWFBa`7Azl& zXZjzpGgdTJy^*lo8Z&V0!4}Kg{iJW+A-y3k8b=3Du|a7q(@~DuO$>%Z_a|lc;H*P~x@An{1!db)nJ`55ogooG)%NO$u zsZX@Is8M__2nUuFY|JlcdU1_sQ3El>ZMIk-qs`)z-8*u@^7hi=`xLwmST(jbuPkG3 zmJ_LR4wIR&)hAV#_C0I>rCIN;D#Tp~+hz|xL(1;1qXMCX4qq$xH4<HH_-*he z>rvtb5x_Z-@-CUT>@R5sHsB0~afWm_IfLXGYPv10Vr(2jR>vZ1eJJYlTyw{~UT1km zD|_&Wb+*6fFe0=O>&Yk>e<$3r9SW~2hOdq-K~D;)!ENthrmuQ*GIoJDB-<>lc*Ghs zgz(-=)~>EY*sp}vD&V+cR1(ks22TgpK~2JMzS;@aufqD`=ox75_K}TjPQ=fry3Fys zAiewE-1z=2;AH%E3fKByaMNIEG@&&_mZ9341Ot+G$v`DS)c`KFO$`v48IC zKf=%jGOR>EKwZ5T|FG|;JGyBvQiD)IY&Le$1}23!_?X@M-CYY0U#F*w{~?<$^bKj5 zBKgl93hMo&S)98Ml8_`g6yB}u(f5K~LUtrDP#MZN$_SqC0zB-9Z-7!N^M7>!Q1(Gs zH~=Si{He`a0p#JiqUtv(oPY%bHw_!6x`BwpMC7nK=ETHGkvQ)r3T_`T)0*+r5#^ zF?%Kf`O-IFA(8!0f#}y=Tbwag8{B*ryQd0CifDN&uwXtJm#XO{{a%5S;pU#GT17qq z3phZ#JFFN&LAwZOi2;2px2NI|H?Hz4(4*uEw6Kx6DBK1#0|x_?4`ZwBUdXh7V_eRdA4 z#c?UX{TQM<-FgEPna(Y>E@kCRNM6rFEGo2WujV&!Z=_Ld_~U4x{OMyzpc(?XkT!$p zBOnvME1I1q?KXYQVfeLjWc%Qcm&U9-0H@>~vXwKqPspHGTc&NaLW1j+L*n2wLl#_@ zrAo@BUG>}&yYu~9vLas`6L-wu3oqGbZB-ad-&aAKh80~5&?|mS z=4S4b;U|Jwhzb(ishvfF#3<^lvM-M%B}^4_x)-xusiUjKs`0oMOJ0}PxO zzyy*d5nMv9Pz_WzZK9W|fSxQ77t1`H6au~`&43Q1A<^v&MW@wn>M>egw7Aq_nGfx? zqFtpL&U^L^4g|pkc4$J2|26@fzH2HD528w|{uqWWBTvIUut8&CqWTzTJu2uBV77gH zCh-I~KLFDfe<>)}-gD}Y8fibhKGmLhFGEp=f>nQA>5}tj02sUN#`zN?+t1f-?LTCZ z$#%WMW-;3bt3MHfoN00GGx~25)9u`bnO?}cI@gW|j18|i`lJ1@h>_5%zfYG&Ey+Or zD%ochg=aSWwk>)DVmL*Xxui?iV=N7OV#<@1J~LuW@p4EF$o-CFIJgCl4k9Bb5BHJ% z8j9d!=*woGdnvm}j1&bxeK0R32(~3zhZ&s>>aOUwK7;#ha#T9oA2|-f`bSJVOQff2 zlx<(>kfld6HYFby;D5ka$E{7YBAHQZcKmWcvRS&Ye~IxBk$xsnamQHx0;EYkA%?%7jazj;#cx7D9N9sN~ zcsM_2NW)s$^4-v9a^6Yd49pjO_&^}wMQ#OgZt*^`*>g2Jbe_d^v_L6p*mP?n+4!Y* z*^Xs8=Hd&N%o!w(t>rzBH16?{+qPK$s8~5aJoW9M&f@OIq!6#yMwkiYyKo80)89aE zY0hp+cFhD_lm@cTPrY`zq+-(b=5KF5$fKY6{2!6Fo`*Cu7pU@Gq8ww}eHdBtP5o?I za!t{1a|1E#b1xJd7;j*h5J#n6Bg7VVmkEnKeD#n4K?Lt|41>#lf=ga=u>5v`bC@8>a&t zP!~BtgN`TDsz@e4{GviG*R)71xMr(+Z8!<=QyTYL8Dt>?CEODSKnD5zteECxhO}$u zAdR!+7VJB90fwg7EK!>s14KULO(LJqo?l)BaMrl&k0I)gz$~6c*T~9n6}5=d^ZUld z#4Q#oBOQLb#tj6|-(ACGH8k9rptO)99bS2FwPCNOIPERJtHg<`F1a~-r|B6vLpN?# z`ealC=4Ku$3OEDOYzi$T8N`z}4#fR(PC9!towITkny)_?NaV($u=mi>h2dy%ekOUt zJu&!IC`*g#_3RML9ApRar|d762!Lgc6K8QI>^yo>EFNs8)snXanlH$bVh4^9GUjb_ zo-;9nEwYl&5OZPdYw zQw>hw=o7ZQY`v!Ta`$5VyhA|*9O<9I8L`}%9I))@sGo5EOwY)0ANu!@*1t@qEWjx} zZmvv9>t#*2m2(2ZLwf^Tvo+f19y7`Z><@OF6+_!Q8>@Ee7m3(FB6`EpaZnmBYlf@A z@M33bkU0HCCl<}frE1!W%CL$8EHrHETVK%+*I#J}ZaeGJ)Gp;E#Ypa!h|;f1aL^pK z<_~J$hW+?rD;~}feuPZqQVjvxpG4x#*RQ;dRaQ?#`32_xg_Y7!Zi83)&OVGVu`@<$ z{G@?7Q0hy?;8N|B`}ECWWOVd#aL@iBmM4$4ePh(GE@OQyS0VtOdxs`;9d#ma*ImQ# z^xn~9=8K?{co;$iskv}t)~ju;m%mfgtz5huifv6dI{_o5?K{9osqBe(db>Z$lfI)} z-1NH&oPfE}CdociO*TZ&?v0lcIirgwc2DT1tE}S@Um0h@dB=x$b!qn@%U3Q*Ocfv_ z$gGp4Z#Itfg2Irn3Hv!6*Svj}8d{CL@s2c)45*@5Fh^QjT*y(Q{_EMmvNx7Om|G&0 zZ!~%sQc-g6Pz}m)Gg3qD{inkI<>WvMFrn++(WbipkXbv5->jRo#~_uy9ftJAj_<@@ zneU$>i=*k}VX_RYY|pDOh?oHTy_eHur*O9j^lkgLFBLcTd6ys;NHTG{-mPLZNKb+M z$qc7ynz)>(C(}qfVgLm1gh7%NH>lr1_XmO}l<2x*d7x<{PK)HBRFRC~SGf0v1t+a6#1vwYhB_Md0B|M@-t*%0~s{{%p7 z`|J4|@Ds3f<}2nh^79v+zY}IpQf~5=$oTRDKi|~M$|Vc7aCX4DhYohrvVtCW$4uyk z{tEJ03(b#XtRRKSAaQ1-`1}nG4^s)9uW9iY`Qc@T?*re#@2ePL3?|d2^&X?=M$$;+ ztX}LSYNFSHgomv06t02Nn+gZP$&Y_=P-=tlBuo;wT*A|es?4Fbq8}A0^auGpmpYuT z-q8%>GceZqB_O+TV zaPya;hOc9RxBPnZ2ZSr}q4syqlGrz?=lnJ>;e3&8(zzY7!tgeGEXzzbN>GO62B`N* z;w#VHGUlD0IDcDy4Q=Cp&~n7@{&P$b)Yq0Z->~J|B5v9+Zh6RE#;5Zb!P$ zR>B%>)u44_35LT=H4-DD7GhAS5(X(6iB_;GcU`pS_?L&s-A1PbS$N@fe#H~?Jal=U*HYJ+0nR~3YYZ4}YDCzHgJ`urY>5i3wBYuvUrN5+alNK@cF|4@9-wlA|T+?fg zgiwozMy9jAjK{{OcNesE-4f+8dqhAk+{D+VKeGBoG>NO94*v}S^#YunpVnl?{*(<@ z7h}o++;+=n2T+Co&ViEQtpZG+X$mRFSO6Npfa*%!Cr~^lfKRR2*_Av-o0Xfm&_zjM zb`$n;BKEC(jBqQNaR!tAQVk&&nqS5Eof$9Hng26 zF65uOB?oM)f4rDndBZJ}{0!=z%DpMwWkx1U%d4`7{s$vkmV&i%-1~+|?KF+B)~;>= zWw$ESw;hm4)^%C+NtXtTEn83Y-+Lq#bo0vm_DeRd7iR-b!uil-!m|hP`E%8lLOQW{0ls^PZ4xA@O4{TUSOt?B21Hc@Ya2lFYmv$@w`iCp5##kV7@lD9LCc0l>5-lP_)eom3`Bnb;!Z&ZY_EcGgN) zq*VndBxKn}+s5*~^5oI0)dG zQ;_jZ$zgf=N4eEM_#-K*?Z`_1Yce$21luR{PSlZ-_ShxUi^3iu*y=4(UJn{U`D}fJ zM$)8|f{c*sEg{!>632l%8-CM%l8e#2KQNe>;CwYbWol&V;#8^5H4Tk?h5&7~j6%k}AU#H)* zR(L`6HddXewzX_u)e!^INS*-~8})*d9_3%k6L>M&b;Vp^ah@};wzGZY(q`-Yw3)rq zSI4b?$cC^NnzApLVWCY}EH|wZios!%Vfr>P`+^9X&f{xN&Ttk7ZOi1Q7J|Q-(Z%cF0qaOEcY^R|c<&1HhhvdH z*Z+D^{c|NI2k724eoQ`d z=kT-cI7g37F;&niTLX^|X>oyIHb4&u>c$W$RM2E(+bly9g|!0V@hHPTRu@9;iDTSd z5`@LhKS$V8f#1m8IB!R)#tQw0N4I>XPj79F5+3c7KHBU-x9=Hz8xH^Yj8oA5sBgoY z>^^BZZ9EcA+m}qS;6e%J)%@HTQ;mYPj!i2pljJ7?dyKd@!^C85R`uNS^Gj9SYS#!X z>GK*$}#A*n|#0e{A7sykEa~TAh6JoKgLMz`&Xia68;JZ9~GJFDonSg zIVicg{M_@wfy=jWgC638 zQA5y z%f0`sK2Nwz=b{t+sKNxYY#yXVRe+VsV-KTR@xO4#Ru& zjTzzRziog-4~QamKbcMLtVE>*6WAQP{q{h1^SMS^r^z zeCqqwIOUXVk(R_2L86cYgyX~y>#YpOmqj2Aca#SO`AAYOjRH|tMNV8%=HsMQl6L? zlDQs%8c#G;@Y^a0ivrmm=^*vQ$8=WUBf2b;PYU82K{oge*wbi+88gHb3eSPmKU~uE zJWhi~T`Ez9PyJk9N@=rPRZC>FrMrL95unOFuA8igNL#MPw+6bbg~{v0;ZZDi^PS+* zj&MT5&$v7~oG8oU^dF&6@qPwa^~)W)@EqcB*I9rEN0BUt)6;UfaHSvBQdJG4 z89)X@lzdw&arf-L2vp}n&+LNZbFSPXRYGBfh%@9gA+*($)hGZJ|B}B!oKZS zIXvA->VTupBDi7&yJk_P=YsSI*MAag9VZylz5OStTNSoTDjfdk+FdV~r-QH58I~q< zL?tirM%r+;+drPvxLk}QEm<;9KrPBRNXtY`cJBVJTcFR#9!ma? z=@t}CQT@L!WrXrJptBB{h4>|*tboswxfl1KDA?^S+{lsuETCN=?f5)O3+qT-VT941 zG$6)RYG9E)DhFQ(&z?pl0KIkaU@%p}>La!`!EUugdQ#rYS% z->w96{@B(3NZ_oz)AJ*USsV?rZR3a$AdTA!QO5N|uXoe+0 zk$5lqkt9;O4=^Y0piE)Ys*`EC2Bim}15B#JDNL?8JM~*ugO`*1 zCtp(BoZoJoteq^gid9!-?0mI%qX%;Q$Iw`Ov^l2wL)~)!i1FXFFB<@2{J(Oyn@GJX zJ==ifI0L|^fZkv8uZn!b7jk@;CMRfiU2zh0GOMaf?dXSB*dlCE(`!itG@Q1IpZqrw zSmfFIPw&f|E2&El{+3%LgtQ^l8<=OmLY*1i@Hrgc;ropyQ~aOIn}Z&D3L<-XpJPHj?Eep zfeU~h0pqlm#fl7dWc8QoD4j2UtDkJa^9BGjvWGrO!4hkc7Yoygjk6Kf#vM+{FZOmQ z*C_7?o2ACLe(6;;(bD&=zv%$+o_{-=Wj;q#Yp=8lpdUHINi*BynFMvVcI4Vr*Ii`G zCU>4$!Wunkbdmp-l7=8XI`Zi^X3<7`fvR6^~j43(jU^Z<6$|COyzw0u%mE$QD|7&-y)q$8G=PJHS|Bf zFS>wxF#~xibWOeF?nTl%mRW({E>9nh*Ttq$V101_Z_2BTl_ z-{YvCRT}^;*KF`=V^dg1of47eA4%%Ti9H`+jf|TbvAg*S9NLvJ6%og_2+v6VQ|^_n zql`Cnc%=CY;Cq7I59{bPdV}h)#uM?|wGf;WXT8H4xc-W3*AZO;U+>yUjUUT~XK`ev`VF)2&*|Nii0E;P-P}J1x z^kpwhzAuiEzC$PUFga3nS^0T`Zbxg6lc5z-L<6RL$%yjtYJBhyZM~?8FgR zy=$Gj(V8&q=-aj^dUYCtw3X|tgwCx22ON0n!al>^{r!rx*kBIj@ey{bSWMrr4VAK z(99y{+Ed}E7^^qw_vU0|{wgL9Kibz~EIvq0L*9Yfp;c-L;ES5sx$hC`Z{&84Cc(uF zWDG(|DT*|Y6QS<6b>m&x_NHR7q!|#?@#lBOB7_v%N|kt01}WJ6+X{HO?N8uE`8dD0 z!Ye=6%Q})Y-Ht_{rDed*U}KeHe$?clD3S?&^N9fySCSxKNvgv9$ik~#E`b7KSkj<$ z-*dVtD<1d~q_wVBzsJJ3&uOx}4JKJOPt4*+p%7HJ5;^~9fk)-4bq>jjldd9WprmPH zsRSkO+JCpwLk{8D3(E)kR)?LMdR`(p%?PWU#{aNuAHwKwYxQa#;v^kjMMg zf%HMYveO(r!)AtRK{Ls!Yfl1Yo(W<#C?y5%N#V?};oB9n9Tr-P1kw>M#9fdxf-{~e z8Ow+*&8s&bon%6798>YGE~#@+rso0>T#9y1-cvEsRmBluGv*C4blH_S5N(qnB>f2R z#!uhfIhD`t2zZvB_syHhAc#QQ$c{zSEM!{-RaDGwoiIrOE3r;yOOJ>zcN`ptgvg*3!HDyWV#{gSXWVZeJewS9RvU>- zGAp52EP#BZ+Wl3sAc5EQZKwH{uF;289Ecv(F$7^+Q0HcrH%H4~$~}JXJ4w_yi1gd| znTAM(Ikk50yR7-uh&GbsI4&sNvO0*!tRgY!!nU}HBED`R( z7N(IPmyl@b?_cc2yfG7ISY^&DTzItG^CXb&^`;XK8zMqzPx7UGwk-U0{eQPjl3|D# zcRInw!MmJ@q(E6yFj=lUHB2+@gtiV!xOE_m(5VFUH=P(`he0v!QpuK-8G`XULL+#I zW@zCgnU0Q~{C<;#1C1KpBAAZ=A zE$iI-V%+aiuFwfzx7)V9h5-|ri@MBeATNI0u)zuiqTvMzR+=Z|pxjWd&D0&%iE#1< z6=MM|>2=Rx=VI^3rsuL|B>otn=N)^9naNx4i%FB3GUZZe>bvN(0z9CvXov7oiAT0D zQxN7yj>Nq;%X+EPQUc&;LZL)ugxSH6B1I>*x4m>!zx1>hJUyPl8vFVhc72={bts8) z_=+cG6_pGDecya0ryuM~cJcS(Ze#TE(|06YP!o|~ zHSa0{`FkI{aaD7mWEqPvaG}N$anhC$i@mZFXhsEwZrm-+%x-^!lPsmQgp`+T$iZZq z3XL(7s4rXtW7AEMg)>mE6j!F;Mr?LQ2suU&e}Su-qQ8GUuV{;GD>ya^*GBfNn|3RebNN=z9Jl22)I9OX*0<-0f%y^THZ%b zHG0J?B$E%@;p%vNZ$sG&xncH?7Dv-S<#I%A6YuNJzj|RdrP?;Xj>hCHSD2fn~TP&L@xkIL~;HK9V|9&+c zu-WpHbMZxCP7O0hAjfH~7EDYi>2%bq5I@h-#1d;rd__N!@T zTQX~)Ve!xwc0PxEieg3NG&Qvw*-v>#ezE6-UTQ3>7hYCGIroBCu`t{w@{y6pSH62@ z>j#O=?kqE61e0dSu2Sz@N1e-7U-DJ!5#&~z5H-y{Nlf}0XLSfBuuX1L>4GlR24OUe zj(!sdQnXxZugVZRewYX(3R`C*a+vy|@yOXN#}(3<($QHlU6sM%g#8>B%fzk@7(T7a zJsNoQd(5#4crl}Fgnr1>>z2q4xQgzMlwrVUwY>yi6Nhgi1o~CZroX(hzI4+r+_ic) z^mW;AR!?{>Fq%H!ZTn1=RdGx&5#f;jR2{^7b;Ww1+(MO<*2^MqRV)02+Ezz=fFl-q z`%yEyo1BF#ZJ!O{EtSKR^@hs^<3~xYw#euS5WNxuxms8GLr4LpW3Ax?ODOuJ3@A%R zsyNP0qz`)%durgL?q;mk{b=&!2f|kgRebsuGx58?tq*b zH|8TQED#?tot55FUdv=ovdrHI=iMf^CBIr%&#iIIY2=p%sI0K(yv5Kbn`2CS2#%CV z@hGqVb4KT7MYl7f4<1a@p8QoDZTQRdpRD+I0xC%H39&w$`8XA}zOJv1**=eAU{ zLC3WKDoF;BIS(>s@Scl^8Vf2i+?paw@mQ8I5BS3zFS;hb`qq41l}~~Z9hiY$msCZR z>vYCp+GLH1^x{^NsN{R1n{X!nwnW25&+&Id+I*1EPRdncnN@UfM-5Wbc_h&V8cAc&(ygt*{zAwcQ{tPsAh)c&gG?|W zf!m}^JWgvjYZ^wR%aH(n^+WBg&atOkT6L^Yiw$QgkE6`JU(4f7+2Py#(xZei zjTYc%9N%VL{T^kbPMe?A+vM=zYn$~&>-D2kBmSVg`y-&Xf)Dv_3T20j8;9yfa{C6=y*Eph2+Y~e35;;zM+K}A58RRdvws?`b zkphctX|KOob-Obx;5S`dKh_J=J1-nBXBGu%i@&Z4SP{I5($#GG#IA9UH@zGXG4Ey+ z*TGy@OzG(@0j7rUG-jIGx|OARc+zR~oHSb}MLgf?S(uS|ipi+fY=hsBW$Yl<#NEos z5W)9}UmF->-FrDyzKs`=`cC(?CH2Jy13B(PLCXHFv!6X0gwAZOFDO1hi;Xi9CsPBRN zPkm2}@L)FQCMVt`xLIzoVppPrtE%Ja2Hu9Cs~vY-=SA}cq?)qa{xl6QwIa~DSRzYr zBjK8)au1_brVREb%*3n`S-)be@~cR?O%Koh`?ksMB;i1H1kx?&=$tS761q z4Ci8Wlsl{AcLoLrb3*5Hcael$2nG(`^*(%P@hK}5C1}i}i4V$UiB$8Gb z+s_6v9P?M9=87v*-)r&jV<4_5rsPqZ5%!&(j|f12RT zQtG@lPCh5Zz&A5_04Z}{ZsIx<%rF**Q7e14gqt<@Okit9?kvZP_c{Ga_8nvzbmmC= zwcI5>=-D+*Wq{t**lDB5>Cmj^7|xRHTbNXnzdwI(f{AmB+K*tTjZkIJ4BmI{PG?9R z8Wca>rS63zjybqqWs~}%Txoc)*iGLHHLTRbPpH|>svMnzSy!%`y&DwD@Q&oC3Lh)r zupLvk-;8~4i_0WSR3eCMQ*%EE9a28Et0#2YAxpIM-=j7$PM#B7yea2v}j5)cgBlX zz9-H~_xoC&%lwD)@4Dx$5ZRd|HE<%{io8GoY{ax`Vbez?MZQ~#Ptv8BK5TUg@2LmPAA2=vW;^vT{B zQwX=~;WeT2DwZ@|%~y`M77b7D-6SlKb508+UOw+>$yMuEmBge^2q6P z2)Tb9?^YIeFwV_BdE~oe9nzJiZ4tG_#tPn3Ho(j6&Z0+FP>%~*eO34G%kh9`_wm+lgC4pSto&UcZ~02rJ85(j(Scz$o%f2}%4DQ{ z9JJb`obsmhl>T+-{dbW*sKoP*wlNJAjaTEcyv9OpGKtBPHWe>Z(p!)3>Qbsum%^sJ z%AJ+gnaeJ>^pLCPi%UWGw|NB|#cklg7`Bat7@q+r@B}S6f-F06%dwTrGZLHZY`DIM zbiGciqbK4_A5c5rqv{^7VE_8%x*^G~t)D&qMJy-#bcd3D^)9Rz)&%ER;FDPbX2zuZ zb1+s!q==DS6yLWmx^p27yJDbxj#^CdZFzBY$X|!**Jv5Remp;M5Sd>bOu&Q%pY9Sl zZsbRXr+uD@7zi!N*{I`3vx9+rcHPo@>a%@Ywl%j96Ok!4^-L6NZgZR2dc=ArQg{sK zPKzMXU=RdyK?6yyL`nl|&e%Drr$Vb5Z?gdlWaJR(PNAwFzlcJob$vw)9(Y`Bz z$?yy7OnYf83Vnsx+t#jw6XYg*PER^A53C*62yLIErQemzP@vx=PBP_ZoJ%$pWma~C zkUW#|xPP6Rma(Q-QIxmTirus_`eJN&nR`mJYhFS;n?)dl+(%W0Q}{=92qXAK6&ZMs zPUL!zH!S05RB-SrZbt%3OT>A{Y2$}{V+6}G=dq{#c{Gdr{qw?&7h?BByoFu_@ACI- zTwC87a}S$!ucu*_aH}|kYe}HrHPEQ0b_FC2V$1n%{5TSi-Qhj>J|y$3B1X(GD{1Mi zRLydfFvM6{e#>P z$!BYZe44yS;u$Qv9BZtvs6XKE6;Gp1|K8C&|Ggu~`VvY;93}lj+ug`PXpE6I$QsdF zNF<#Q>l}klSXoRKFuvX9+w6L8)|_pIC2c;N(B?7mD0iCP+52%>3QVQo6?=86{XqJ1 zTh_4-TectM6>O1_Lbg&v^dNt7DiQ9ep8OcyGPfX0yU&^)T_+qF0`7;5>eT91D=4u^ z4{xfhbk{hXpZwoWrW_J@;6@I)_OzyCi6xQhbvs3=Jo5Dx#h6dgB)ybe4+W0%V9xO6 z{Wn>>QqSB?+N&HjQw&FRUC6}?_?sFu+jR$!7;PoFAL<4tUf0HZ7gaS}8#8;Q`)P|% zGv`Avda<3XfZf%)`?ts4S;J)aRmkcg?fBLfae2le<$l7KgAqA;r%?N#PYRL9VQtdD z{K!G9g!O7fkbQ%ephok(eSu#SWh}T6RWb`I;^>cwxp7#aWuFN$Jl!<($+0fv=wR%kU)AHJ6X7S|CtgjS_EbuJ+R;~49^8vbrKNDS zn#K{HfeI1%>X<$$xzaO~>uiU_KYgo|8tBrO;^9qpVL#@kzcnz_uKdsyys7Q;)%LSL ziX*g)3)ygfQS=LY`=>F`S=1>M*jM$t_B`+Se1vwE2E?MwcCXp0YHBK(O}~5ybk6lz zI%roI3&Eif9)!QP{#tIdA1&-0TATd_OK_>N1+9)>)Z|Tg_m9C)q9AeMpkJh)R!^gZ zTd_`K#=gmi9hK2+62+xuFc_X1eE%;;!Eim3d0)Qr0+qxEy0>J~Qw~32*CI?%EI1y% zJm1z5s9#9M@N_9XGu>YQuSY`O{`o(Rgd_hKBVkuR6`l%5;3-}-)PawTFAP>#@M^4| zhHYzFMizrZ_E}u`C+*6jJ>4AVKKfuJ)ox|w)IbLOy@s-{SGB6nCA4YQ@{W+Gr-5Sd&k*;iO1<2y{`jAwW+j{ND7Tt>z-lhiUQkfHD?h8A+ zal@U~ZX7+sFK@hDm_`#kJ>R=y2RnzpOo`YR-l<@W>W*Ff{VDISj2EaJb2JWVNTn|} zyyJGCz^6%Tm(nlee7+It6>D56~?*0X5}=M5dMeJ4CIuzhAo6H z|0Y^fh@U$Mj2xk|uLfNM4 zw*6;V0sf!MqdAvmJtSdwA9(2}R_~SrWvz@7QF}LB@fr5A=%14v+O13ZyFO8IND&`9 z-_zA~!}dur6)lZ%=t0eNn|TWM)sIU;olT)6@5L>kSI(M9lfO^efY;)Y2J5E~XRw^a zyX;yfr`4gnk_ymfy@uN7Oqxvh+r+bl#!e^Km9EyJi96&a|klx{m0 z$4r9eMP?M!#gfb`i3*Dz98823EwCS{tC}1y4UIZKZxEHgZMrgmbvhE`hHug-$j~xR za!XIPnQ@db|CN51tGuJ8^S{`8%c!UqzU%+kASEFk3P`8)P}0&V-Q7sT zP>M)Nw=_dH4BblS;4pMbHwZ&W{|7whx=vknU+1}>|BGj>^THQr;c_wao7sDR_Wr6| z+!HLhMXjavTCC)Q5h>$hxdSesi+gp(6C6xN#&bntmKGsKe5T1B#6-;dwWy(s0Ma@t zJFRkT>r)wo;{Cw%uKju_;gqgG$$<3P?bsD7UWtFE{3?c~eb?3iS1{L4F1`=NPhZZS z9*UE&6v|9tT~8u_6a{ok)4zr4n3+gw6Nr!?t~zP=g3jXa_vVVHxKM}BTW$2%Vq~0+ z`s$F)-M$|^%Inn3Es@iq^>}IUjDrfWWUBS4(G|;Zk~Y#NPo4aL916}IsUa7yUaNk= zu5ziMS-!Q>n?D4n<3SF&XoUnRShUJHUb;~6X!ak8KQuFFtu`}0V~XKU!b0m#&5$)h z>>BUrU~x)XN{}gn6;qUSD`C>IXRN`9fG~HAk`u$|wn𝔙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%0DTU>D(6=t zL~b3eF1>uxEsp#lmVos$n2N(dIbqwjmGjnnRD%qH@ncP+aPU`TFcZy)Nr`vd(` z?TyRSg~?t!UIGt`)=}@9l+#n+-4R@xGuHaIJ`5f+8>G-k%ro+=ML?Or*y8F*Xv>(z zv+uKowA%WFYgGDn;whWh`M&`hZKE@v?l{C#*$W^H*PQihE@FTa$DYlXV{Yx_B2!k$ z_4lKQuob%0$fsQ&yCDMlNL3e0YR*H>m^XL2s!k%_=^!Aw=m_ZME+>j0vE_Wa8z5hd zP-2nonGK`uWsmFHro^BBE+7zm_O7xSTvk4%I6M}#<`~oc+oXLrSSnk@ualLVyEL7? z=*$Bk@aEX4b%D~LFls-^<$S`3W}&Lz;Or&QAK}pcq&HA?W_`z#^i~nO@uqfT3NO3J z$7+zKLA{38v42SHTiV@sDJ#vc1B2(e)f& zRVQl{w^MG-_;?)pAo=RCgOuDCHoV~6dtl+%S{)W5B{d)$h6nQSLRzvYQ!kc$?^6Ws zAKl6hk?R6lgnTVd)H^imZerMF790<(U?)1FQHUbra;r99#F``$uinaUL~v?t7}*$* z#8CPZmkevh*6gE1yHT37xhrjfLU=2)ot|9>U(-?p{J(gM9}irm_cW(6oLbyUwbsY5 z%u&r3%gIGF%lgCES^%`vBr9;IMAB~)W0oIb+n7b^Om=2wbkj)0t}mRHC7sZ>J9OOR ztdmrC1HJl+n6E)Un`W;QwBkCBspVT1i`=KS-El@a7VttLG_dB@(wTBUZy7{u}3)_o97dg1U@|n*Me5S265oHO+XTpV#uDEr9hG9nQT)46k4y5oW zZ-;1P0Y9W}BeQNAE}$y9Vep+ZyrYLmfVRb7;upmYMLqB^y~5c~mec09uLh@1CHZf8 z)Ey~wt(k09EO^?#Gou@^GC%FGkBbM17%>-Hw>~x5MI^^{Qs3_w+<+U!nzi2_%f_O+ zh-y5g9@EPaI2{I|-BPv0N(VQE%fO1E@PfT~X*I_+ocliL#)aVF!5I$hZ@a5~} z?@W6Kx^zrkNpt&ArU$y%l$3?!Iolm-YQHw_nW$$6^6poo zxo0J9$y_igDz+|Hlk(f`oSv(a8u|X{(doZP;HDj&+}+&CF=wFszXvyzAId5Zu+}lF zf#c4%ip<;2Tf0#;HYs9LW;ZAZz!uW$2KHJc!9kjX)Tp(}Hq}~lq*1GGORAK72*z8xfU28)euMw`9xO>?# zT(Y2sT(&2a5NGnV(CqEka5oWpdZ7c0o(&l|9tqN zO-w4Q)k={MA4QGbGIz_uFPcTPC}FJ3%P6G?cNDIsv4ucCmtLY|*ZO720i*a6)d;6@ zJVS}lR?cSDc=zozOLL??iHWV6j2drRbcrf8}z;$ z25WMS$$k{oezT1!SmZtsqaOA^5`@7TazF80HyEwCHB%Ew90dko27~gU)#k@RsvU?yJp15h zJ&FxO?W8J=1x;u|q=QVdnKot$g)@bOHZqC7<&??5^KG-ULXAgPJt7Nb%HTB6vERxC zftHKy0qFT`QU7MmsRY^@>D5Sn4U&8j~{c z3zW(UevGihaR)Rd9rb*cbEgZD-idG@LyQOCmex~7g41-1EUafU<(Y2t?|bf`N(1kW z$hVO!Bk|ZGG3sYhGRWl&oLz_P!ACG`1%ozKQfWHp+#9ASD%PoVWI8-=42{)j#z%(a zs$Zpj7{?~1uz075jhJVB-l1TCObM9AcqZV=C>aI3PkZ_$W4! zA43mbJHqaK^Wb-QXxDfHJR@jdX}q24+0xkeR6Zyk7wC^&i*p@^DK75hbn^d!Y;LlX zVpUQ#_^dvChEQVg0^lh+f(Ph0YU<>w_)C4)#1iF&e9a`z>@zK5aS-s;H}-llkC;45;Y=<4HgOiE|O{fyGUliPqTT>PomN+!JA}d zs4yZzPN{(^)k{`+3OF<*Vg$rX3FVzdJ!3Ys=h(i0DN~+p$7Q&s_ghw{?1$H_`u^fG z($ysEjnz~%qe0MBow~t@DqCtErtje*2;$c(Qhm~ltvsre;W_l(n&SnYd4edDem})d zQZvO0QT z{BR0n(AZNsBZj=43!l-tm)-}v910)nh(x?PiKb>^1yXl#+2MTyY%fe{d9?`hO^U7Z z#`|Pf7i60%uPZvfj<`$NbwQwE2; zrpK`8;`OZ8%<|!qSI>p#!n3Jz@{ zRMb;#yVy9A=NgS4YkXj8O$rH#{KOSW7B$+T%CrX36_#ihVKq-7h-n)Ud-YOHy0ct* zFRe0Vc3U!6b#N9FyEAeu6>;I$etpl3eAO3xhC=8q(hY)iigf4b?nXtrJ4dHU7%&{hDhRUPg2}nma9%JQ5!oF8_ z;vEC1nPqypISLkQj-CFAZfdlXqM%J4WejinZCPNVG_?=S@GGbA)mp|tDy|13`2!}0 zZEzI0!zO5PXx+g0&Nq|83-0Ezx(ji*=MMEk8Dmkki|&Yo_wEOQ%oad1{yi;v%wPqRV0ag3n{e>bdaV4eR zhpz#{VUa+cc_ybrb1I^D;IWbpY{ou-=Gnu@OdA#zCIqY@B6l9u1XQf>HHy?>$I#XK z)&pwGlno`A)qBqZwo4`fX4YY(8<4-Tnq_d;V5S&D<51*Y^7{w%!Olm^Z<^%x*WYwa zIdf~n4^8L$&dmGFx^{T;)W!Iyl#kTkp3Ip|m+sAz4VYazuhF+->L%F?yG2!r{aW*_F7YPyF>Pd*;r~uja8@0U+_XlQ>y05x+|; zW=nj@co)9fw)i(-0}@o8g00~LE90mI)_cu8tKFXgz1T9VAV&Mept`T!!OnH>fw3(j z1WzL9A9ckrKcUo`pX8zHjA&+PZSp9-bqa8S@k`dDRqRji@9i)ovUHXiw%4K8e(zR6 z;+z_+_led*K!zQ{NCl3yxgLAw6Bj2M(VaX`Z!g;7^Mes;eZ(z!(lgjHoc0`h32{Sy z{kQ|RIm7_o9PZS#)Thi7pP)$^pT%!)sBw4!hLv+A66U}^fZ#j-&QJe2Jn)zb9h%f6f^;1_KLJKDAt3-O< z7E5YkRooajwPxOaY0l*&j=ZWG=rMQa5nCM{tWtW!M0Ji#zd1CDB4wo3t;_9{Mu=L`Y})v1U_8~j~TphKC7nxOc|EsW{Ot+J_!_2&O5P-sUn?dCA4mG1A0Lsc4OwFUSQ{3edS(+$fS~SToqivaJhi3Q z6QW6R7U?FA@p!GtCtWboJ7o-%UR^YeMT(_bGZtfN18}1`?$k+~xu8Rt8jn)!HNH%5 zgPd-*MbqArNbvnU2C7`Zw+L?GH_dSgC^3_q;zQ@zq!$vot3z%}qtJJ+_AgH6Rj=}Y zyWR@K*|J^Vg0y|Cm+eR^S8ujr$Qr`eD*2Mip@hixp;Cy0oo($!KBV)JibPdoA!K+~Vkpp4k6u zH0m|ku$>tew0yA>ucuCFkpo~Rs!vmeWuVR ziMMCDw?rOlivu3-jz3vYhu%B+um-KR&zGMi?CMwV?jF}YLaB!nJz4tND@)|ZLQ=Ti z6I`Y2O_2J;OZe}mO#r6;{hQzM&A0D}kB3X@Sqlau`5xldbh`p0;jM4G*967Z;7{_* zbBwuby8iovOX)wwG}k}nPu|Vjph(?4E8Q{bTRD%`C4u9h@#o(s@80^Pa2Ijw#GiinQKY_Vwk}1A2ju z5mYrL)pme%9S+SM4Abq@%eqHyh=n%4va?2+)Px%W9q;IQi_fqPaLK`4le%TkbvgI0 z_`#md2;{2bl}*7Y;-7)<^~+}I5$l2~qX~iDC-s*yJ`qDqmvZ^opRDs0ZRo_)By7S* zs{FPcEsE!0iHj$K_D{B`9n(|P15{d4kNBg!xV67n!jZ#REXvJMt8A2AY4&1kqlYn-#Kv0=c0Q!5}?s;y5Yp9!gTg{)-L zBEcHNY?9gA?bb!P)U>CzO^zU~Z^G5_d9q>Cs7;AF;G{QR+ zlUD9!IP7sT7 ztfRClLYLMe3VbrIR04(g{HvrCb&Xy@f6bJ#g_zVb$EeRsntf>*o@k>D(4E!a{Yaul z*P>gl&Y=sTJ`MaW#VWR3AJmFu)|mql2^}!XzzrxYhEvKJRrXR1zTHDBwe-UBsz5X3 zD9~-E{_UMU2UrI?uUW!pJw2BcuHa3_>!?8Vj`aL(gLL{jM$GA%j&sApHYt`De4N}X zdngX+fOkHRnsohuNTgI9J(S!Ea3j^U2Oy*x;&Y~=X-l@EF&`g=wxGNh6BQL@;Q1_# zT%i@`}~GYMfIHK^#GiOapDL9MfAx6K3u1I+v)*fJzw&y0&_0CBd)GKrgAh z^DPrKY7PRWnB%P)iWSr*ptVU)6%(us;?9*PzC4-Mnd!O`4r_lxRRyaI+7xl*8?`9f zshl$NzDiJD3(f8GCPdlkJ81-LcqG;)lzDwPF&%N+6tQ1A?cnfPv{-TNSF;vl+^3f# zB@fyIb2Z_vEzC^_^q)|tAgy9`cfKy0kR}zq`4TSdYFo$GKP#um51i?teYITJ(jcJy z2cLPGi~8IK8}z)Q^5AU?7%^&kdoyZ!N{zhm49P4!(<=`pprXe?L zzr0RJ$YgOal*)sRB&yPBV)&)=Ki)Bg+Tq%uKrHFHkcd~D^9V$W=P1oL0vE<`l^b%V zLkRb1Sr&Vm|AA1Wkkd&Q#KViT`@!5=0*U=ydDcgx1u8OlhVyJ`Lbb%w6Z@MTQ=>w^ z!<_KzT%n^E@Vr-!lRJXG51i~r3$783*$twx#|aT$2uejDnoIhd9aHvVoPfo>nDCk6 z{i>W^c5&;y^3<*&n4$+;lNgDajjc-|d?BHFM6_Kh9as z?u>el0E{6e^0MZW8yMg;|c`I*; zHb_)9^)NoISCCYCJNO`InK4`=d!k5wB`7J?S;MGFw#?dCwf$gNjYtnr%Wh|e!=caXHFl@Zf1tk|KESOKP^+QZOL<`rw&7n9ND_a_9i z^pc3%pgq=Z`B|A<2il%eDWe*eV3LT|L*&Jwn%^3pKcZ&j(YB$Rb3Ju{^80tVos~sF zDrS!I=2Q!P##6o-)nLoUgNZerv)99iL&VccgRqKBxQo>hBPPdwmq8-p)Pj#c9GVA^ z9}bO+ztXisbI6TwXoj#(k9Iv@zDoO!9l>CN;4(2cTn4ndkwPz(YfVTWF@^T+aIJXA zrG)r5nUzl@YrWlLAsPCkc(L62;ifvf$`(xlptp6Q+aa0GB@Q+c=DxfVDk$jXGZ4oEcSvGWn#f zIh1OmV@!j48xhiPQp&#U_K`ER=iMxmY&}pqEl#k>v#=K4mxsTWskDeGgnZTtBQQD3 zG^8KK=c({Y2;(xBO`mR=S9VXDmpe!*9t;?*>MUp#*zmZgV5v}FoIPrAzT7Wm9ULo= z<54DF{q^CIe5xZFF?$NBK9}KPoh{ytt=(HsRRr${6`Hv95LvNi3R-f!64k^Lr|q9v zqcQz+u*8ugyZqX8*EPV3$Ru7n)Qs2v1GV=UN*csUE3`_E6gc~ibC^!L{9)oljE_Cc z6c1tYDAPqY?~PNG;nM}?fveU5?Z4HCHO~uMDGw9#5waee15OHwGoSk2 z6)jqSeAiefvN+U1Za#S~I7Q?=mt2H}6G5jA2|v}%cB#mvqNf-y74)uWsInMzc2@#8 zHPNk7_)%~{VQ9!n*V#|0^kAnMB*EO)-DJ|CdpbDIS&FpuX>9N_yyTcn>=E2kOt82m zLonZ(?lP3oSnQU!*nB!fGi=%?XK2m)@#SWvl*b8W*z!I3bu4%v$FTen6Jvt-va$T~ zwI!p_)9tVHyB8yQCnAh+FZ*{drq;E(%R;6jIBP1}C20do76Dt_ldfUQGLJ7h#&B%| z`{`=s?sCx+d^nY%(~H88NC|r0%@PCg;1~O8-wfQ+0b4TuB*t`aykbdIvQFaj5oxR1aVYc~@gfd-ew3mpXXh$jRuCmIRFF1vvRWDH zDr3)y<^dZy+D=9_Xcz=&gR*WNz<|omrz?xyX%8)lt~L!&kHz;?zb7(e>~EsftoLx3 z(zCc0kawZ(^FizcdJGJP)Xz)PK}M8LX%_Pvfpe80L-hJ>rSA2s;L+2q$makk&@U_E zJjm`8nMk%Cn=F(ic3rsA1t8;_!6ylG9x#ly%cP$-XCt^8_d&Y#DU+F#Q@pWJU0**2 z0$Y>4V{|KK*9n(dFKdiuqd)rr5J=@;*2Fa>lqDs+L`~zP&ddacKSQUgA{GG^a%*w8k=f6H|0L)vXB6AuWq7ai7RXheTPUyU% z1L&shrlfwCVHQ}`_ajZb{w%|Ap4T!Y49i9MA9$z;=;&hpiL0~#yUq|?B^!u-G=z*5 zr5r@GYfYj$-&2}B z0g0GIm)Km^E#)}0%nC4s*h*f!Oq=;|?mj>+u!?Ly-DuoPf4Wz#xkGkx5oj7VO|{3` zUA8ejgl!YReFIi@+W!Prv;%s)B*0+Fa5MXu{oHAMcGZ)I$3AjEs?e?-S4LO3WxmG* zMx6~dzLeJ#4}K3gRiJ)IAY)E0j(}z;&J`9~*~oIT&uC~7h+4WmjNJlT8=4M@D0s!t zP+b+Bn1A8v&5OImG6j&I2wHbvJGIotN#&6&FLP{0H*AP}^Q=ciolsY5O&&`5fn;@D3}Re577g!t)>JB8s7)Y_`;O1b`ZDrAran( zh=UitH(gzx!OM(pFz(}U#4zX9ExFs4j&dC|oF$%?#!=K<54zi%j{tK_oAM9Rlt5-H zwmVMI-LWY$?V8n`5Z&8%yKsji*s~(|@?%B{(b1Sl1!olo#oX>0;0N$?9owg z*ib^`M&8UVHH6daNx=Y{bYMiYNw|2Ptf3{wgMZ$XFn>@9PY&PpQ( z(oB$$-PN^*A|8;Zj5xe|uXg0LxXkfDjIk=(L+Hmn2)0^|Lbz>EeEfSu4{r#&TwT>% z>iqad5nGcbJ|>H+4#~(zu=B=oWIRv~7#56CR6Q_pBnHoBaXqyeD&zK-yckbbb}qAY zTaE{!k?>yV$Bj#&F6LPl@#13)0@MsAot=-|Xpl#l0ZWD*=^0zjpR03ou{Sp(P+~MV znD1BtC-XJ~I_}v6ay0CCxLMss`p3yeXjxa#`q_*gyb;v+VP1X#*%K<2zLcShAH_O-OSuZ?vZGi zL>l*vt>hrK-QcAeIsd}WQgHWv#W?>vgvn3`GtH!OsWPJ{B;YA=IS?|4t*x; z5VBp@2sk`{@#xH6IKRAlo(_N8L(6`Zr!1bP+sd+^Z)@zt=1(rnGy^BXg%LLNrB=cS z8YH|IA?PaLBXWUsQ7cTPXUJ8=cGN+8BpAF8n}aGkF|!PtAAl-G^KZ}!vC%>AAhPfbyO8 zBOdLpRo-F>@SyG+OmRs!wTaHnsde-dg~DOZe=fjSm&Dm8-%-%|XR{>=u-anI!E&7y zRk!FePV{4Kyv;fya9VyJfR^h-ZgbjU>U}Pj5OIB_G?T|9C{iikx*;1X*MiCaD$3cY zypJSCI({ZrW~A$`zPS@3)1d6a6OLB0KWF+n?Cjk@2LU@r)4ttgmDRI&)sJ2YHdS;c z-?kkIUr&wfU-FbtbFoloy#(g>YHK%2hDn8K=r`m?gqNN*7;P974?)b%Pm`Ul*4=Bv zxC6#Fn(7Bd`jxDsw4SxRAU)8^(?y#ut#4UgsIfV_59mJ#Yb!rO`JuVkns~b zMCtSTQgaIs5zwO!;F;>HG|SdhaK3GuVguArdGS$W1CVRGxL-wiQqD0+c=+z zM4nOPQt+&_jd?WirqOyrx+n1KkFk>VlY`U=bXv5JuoRx{N7|sX#Nt54Y=^Ldt=coC z+G${k&Eqle=DfrF?%Ogy>=*27`{jQmVlamPl86yfNcDGmMS9B^Hw;i-`4B$ss^KIlv$1XDt z8jot?P4^MTFvQq<>F};}dYz>*?>c|BTu8Ow77sRI>lo)`*dw0K&)%=Lo|Z6qUKVGt zKjNy%s_Yv~j>r0vPF9<0C&Zk~W2I9t{AJqS@&pMui+NO+s=A{#-%}k$Rl^UheoEji zyEYK8q-F?wlrl&&RNY;4K<|ZGR^zhzJt}Ibn9Xb{en}=wvvrN1`nhl<+hyuVCmO5q zGa~%s_xuw{fe5QAGGr^~qc(0MYd1p6F@2c7b7h``fIuhxzS$Z_c0*v1}XM5kz?8Bgc(`^d?sIpE>4d_m!FLy zPMymc_XvHvxl4;>M|zj$!V~4qbSG;6H@f5&5cK#H59R>zYs?a>PjJrdzSj+%{$s23 zKVmTtFe{cu=JDU~Yne{vbP9Eiohn3(w;lY3CP_{qT|OPud+8bB?|{EH$x5u%Y9+n zepL@N#mmyD8!T2Rmr7xg&3dz%J%D8TFZKmcmNaMtJ0eL0)o&rG(Py0AwO*$0E>onc zVR)hL)axvPpfM7#d427aT1!4ZE*6<2_-M1P2w{EcYCU=h$9yxH9Hv)Rcf2N}Vj+Zw zp+D?#Es;r-83lF?>`kGo$%cDsdGQq zBR!&<`*$l^F>%x$E6<5tI#|~a$Ic)uDt*x}&>x<3Gq%|ZvVc->KUSM~xqR|X4I+9- ztTCrgn2`j)^^J2t)iV^ZuIfWN6`?cdTj)V#aR^tz4$tE%0Wp$g*cHn0 zJ7MUA6Qx>l6zZaYoZ|PIa!=hr3#b$;b81|OF;aKk!EiJj9ASg_b7LO5Jmt;p1 zELK)La4+h$*y@TCxdmpwG;08RUZ2spd<3^(8=KE>rEh0SK?RqeXL&U43pR+8PdJV& zmwRQ;iR1E5Z-(dFa9g$344-%Rsw2M9%XvG4FkXO_vvkt}M@0`bOm45~7GFtKMdcZI z*f(pIak?G87ha2ogd=pg*Du`Nd1SI8WKV!Ao}nk!d(Ym$skvEJWsVWrs?1b))y5nY zlL7SpGWM*;e?7D}Wm`!E;k$p@dx=kKo-vAahmiL;Snry?eDWU!1gi`moiU7pFxhwQ z;NyoX{zgaB&hBhwV`g=%x%x)esteU^R%6s)-wB;}OD5_n(-*gMAU1x61d zDx#^cS4x`Cy6or@U6Q^R_3hVRs5=w^;=-VxxNK{x%Ds!WMS3M;g=}^_*^*)se1`hV z;i2AYK0-cnvnuEK+Wn!o&O^b1`LzVKR}$$%7thYe0CC4V(gZyiX!jYZY&|59KgOQx*#-rek#F<_^W$)QsaNfE_MBw1yP~FH| zLs={Wzi6^n7hYNF48rk0cjK+oK+uYY6k<90==3_o7#EE;y~Yk}ECy ztjp}Zv=?ZtdtQ1uvsgr8)l?%9n@FNvX1lYH%Up?lIsx0n5<;A|)U3M^!#4xMf#By4 zMsHGz&xiA!pKH=Dz8+$53k>JyFH6%+vjUEP=cf5WcR4*?{}&chDnQ*g__HO$VczFh z4avMz58~6Cl#0cifP5=$>SL5lZ@z4MG~S1|p-*a*TR4O~Tn|o*?hGrB*mvAPc3ZQ@ zP~|{M+f_YjW*AN~f~E-WaBa-otCsI;XEW>XNBj-ymZ`UQ&Ahbsn2<@LY%y`v`4fz3 zpJQH&ExM(1Mg74`kA8sAfn}xB7VZndcUoT&{3al_AHCLKpTF9zbR?K+JeN(7kn||7 zObhP6ON z>^Di>6czL}9qJ&N`k<-|Q4j7GdX!JDfk-gK5{c-=KncfiGZ};KbT(a=xz+=s=-6_- z2bEkq_9@DzNG99cSLaazr0IMCWT0nA*EEL6<*;wOYqpYt?)&CF%xCE|&C+x~cSzsv zAa+RETNr*}Vd0OWbSpizYzdk5>{qB@3-7BQ^#?OLIe#3)z|>mIb9DDz%lp8CRE$Sv#$nTO1 z9L^f>#ap(pt9lOt5lKMXKEIkuLI_qr=K zECQQdsN(DP2Qz7Dy3sLGTtkWGX@xn}ov(S-ct)T>OU0wM$Nn!{d1PazMV!(Q)w_Sc zMpD*#0~bSF_seiU@e!5hg0)^1Zum@yQuG$98`c_U>3vF{Tch%&7wN~sqB)|!m&@>!@A}{erDhBCI5)-E>x=5 zHe0KV2m7zK%fuk{Fg3^veYD3YXEUX`CVRLma4xnA&~E35xAZzjBjlAk4rGIe!IqeR z(Z@_s$bDv<#3u0K<5@Xfo(`JXk`-p-L~ZsD^`*N4rbA{nII$?vxSQ@m5GcR^`SP{& z-?n4U|7knsIkY&q;J}JAh9umsD?qt_H*kqHp#u{@| z|6de%nO=T7m$$Y_+E!y#^x}0i67GaIkBwvA<719{peM5ih$h>xml*Z^dobqV@?U~6 z)sTDpH2Dvx*lF3#lN?)gER*)4=nrmd@ym|^!+9A$Hl1FY)Y;6N zzLuSeRb-;)tSL{jZpn+NJ$1HmptH3kZlL(GVM8%n4oI0(c@Lk_Dt^7)AbGMm3jyd- zXEj}L6gc@o^#(=?3$)T0Cj$y=9TE!Q2K@FS|6i734ksX!rR2&C`PwI)9Lk(otwwJ1 zEI3k+>CPMmEqu89HA~p!8L~u>C7BU+K|3p|)q)Hit;ga^plBRHycQPPk!|_vS~<~M zL|nm)1X6rJ{-4qpbOR$sSXq4X+nk!En0JUkj3OF2`p)ATM=Ns$DH;2TEsDq8p5f82*Leg1nNMwHwD3tq?e!)Os#cpiO{I&q~$ptJ^hlJlq0 zk(ko)wAV-75TY01U`eI3qvVlv@@@ zFW+}p|48#Tgg-Wz^b3(x)!b=59gKTQNt$LW{mjSJhVp-)mnAV=jed4hNNECM`^hH9 zZHN3-!Lp)>I^-!^IL(1&kpbibx{z6j5L*l4Qum@*02_splyx<+3E(2thY~#RVLDb% zyoU|);Ef)P;Q6sRG7)-^jBCzzK2n6;Xv1mMtMgKz_T}OGE>tTMuJDJ(se2sc*M*oU zVyxN<`>jShL?q^va8?Z<33czWq>BQh?j$?<-0LN=(uA+Vo<`l(KlOAnDG+3qnA2jE zf_nIRq<8`;=H2g{~OGoz+nvy1eI`LFr{|MdcGf-;Ahvg7JnDOM8B*Saah$npQPLQM6Y?9VftT+!6x3wjJ# zi!7Sa)RaYoCWC!?eR~5W7ur6HS&$>pVpxJ;?VO=nYV8#PH*tveP=h<@u_)qu^u0Uf z=g%ml=ffEqr!)7s-CO-#cJsx4tc|7zwn>^lYV%T~Q?pdfd|l)jb{*M^A`Iet;FVT9 z-Xw>)5-BCez5X43IPQ$g^GH8ZyTV9zI{_8qSh})@si~yI}bkPf2s9)D0y0oHHKKTyt z*Y?QSpXl+5NTz^TAVpjCyUPpfcRVX=z_m(^?L3cHM6_^`D%;7A4kQV^c60X0l5AO* zbx)i$5((8CA3xkjuRZNRjDbTqFTv?DKY?d zuU`(&Pui`Ty$=^-#i%M9AmS|Mp8K(oEC^Rs83=AxZPzYAL#D5xRbgr9bdpK>PlGT< ze-FZhVF4d~imAoDG%xqN@m%c6p==TTJn6svH#Hb;Y>tL4<<&-{v|FpSD{7;6Z$Yld zXgBMkD>?<$%kg?dloud2&x0gJ37^_vv7Zak)S<4#X>DS2P%~^Go-_MJHZuo-;cNc2*e9jb8zzFzq3l=P9Z!)}Jj8PKfF08@ub7LS#FK zdFEW9pSKs%hH)w?o-d8jav#se_E^wul=GL&#o=n>Mm!_Jm0vxM${o6gV9Q*gOtrUX zUAnAD83=)&$p4aQI=LI-HJP2t>Hl%d&+&+SnJqKkNkz9Zy8=A$gb}X z!=+$M!sl~#S~_%&GkR?8*ofwZoG>*o$Kyn&3c`MqgISY-I&S_i+?JvD{m#XbKO?*% z2g${H({-4}Qew{4r3coE@lfAbhVxIkk9(9r4e;StaiT7C(}(Z}h1q7}&?lnTtruGf z-s+mNTL`7a%5&195rIx>4|)yy+?<1K>3*V3qMKC()jMl{HPaSRygA-21 z;vwO)Cumin0+zP&=1a}KUqKeZ}jGZbVa(%ghRY>^Z4&jU!O-+4bNfT*x~ zOV+bJKJ7cQo)jW4`r_YP0ei9!#19>-xAKb;4PSSndOT|}mDk-(oBwZ8FXMwj8yVTv z7pE^7V^PnORQvDz3#Mt*U_WlqbA zW5$1!g)m$4c-$u!4JhcQG8f_yR0R)PHw^pdbm)Oo!h?{93KNMg5!g>#wsxASX==$- zyfp>pn(r!hes>DR6Ij3@oupd$bDY;+*46s=@zB#EIfoSvA)v|sF3kIcB061{X=D3q zWFex=Yb|}vQ*etxlsx-~O(W`VASaEbwVam%h|r7tUqdhTR6lqM>}2U8h5<4x7XUZW z9DN#JA`))LkG9j>xRu36Uf-~f{s0OHJuJtl7#TJ3UDwi;ms}G2I?e}d6q>7_X^R`s zb9p&-!J=7Lc{BhM1Ul~2PUiz!sS2w- zpf&b0enUIG3{<#uu)6*a1)gpj`uJOAc$24wg;_E{cQ*&{4KP{fYdXI-QyYw$D_{kb zsWK$eK0X*H#U(HCuJhdP5FgFN(VkMT=#=s;fu+frMt5np0PpWXx7R|#2=VPP-@B8> z$BSlxzc$cwouJ!p-z~$C24bNW)GFrs<6CTB4vWps!z@ULDc73xG;90PY-fjKHJQB@ z-k9Q3LJfHC?oU`bt;g2he{c~p!3k%AIh) zTJNJXbD>0VXm4&Q0ZFeEW^k!@?TT9nl2>w0pUS&eyE!^zuBhm9=N1=Hbn1KIsWrFj56E?( z5Fx~L9e%g74Scsmfm|*bf&ba^NfJVR!9vY;usHnB#h2byn~7SYzqDU!$nC4rn;rkp zoF$|$H&K8@mmDZ4HH5plIj+_`&)fm?S$_UieqDgG3cbXe8+vmkpD`^F1=i`c6^2$f z&Ab$e(J(n1t!MH{_>#}}=4im&qD+m{7i=xV3sY-zihSL51W_jNmaKmHieP<6Yk&JW zCFDcXKwY%uE3;y67D-MS68qGGV}ak}FI)|vTo@72g!=QFKe`e#YpXX$3y&EX?sgrY z=S^=Md~4)xDS@b(xlR&1@8GukBh?#9NFwpKRIl=%Q@yvhuT#B!EQ5S9lPWGOB&mJn zot4|6HLPC$sMH%uc4RH?rdw}lW0mkA_{YAe{X^i9nVU~s{7zot7dQJQsHRbx>}FF_ z8%xwNxs%PY=~|C0ybR{a%ViDDNjJ}*=aj~ta;=oUa!}0gv19sJ_uqDV#cONtOyZ1m zErs7Ki~^T?^zK6q$8$z)Z3%nsQx+BMx`k3=wY_q%c2t;W*2hr6<>7uM_T~M+c5Um)>6) z7X#|SfmYlP3cac_`VzWw28FLzh_~)9w0;PS74ey z68UYdJhh=J@8+N+BUJV>_5zj9QJV2K$2yxW9~2M!BCbSRF6xBlA?bDNj?E?Cj|=B< z9lu}r(;h}&B5r;Nh0+G$CFU+TH+@mCHu-370CGfFFcgd`f3{#+W3DZj$AynVVne2i zgGrirGlu1!6z)l74Tj(4TS$&6anpH{PCxTZBx9m<8u2L;tv06lnp1Mr28iMK`8wE3 zifF*Jt*4+50~)XTgV$MjCIWlC8|9rETlTY+T(hX*iaE2Zn<-lo*^okIMVPONlH)AX*ODb(u&Io(S?-sW_%dk$i`6Pgf{6mCb(?f6@O} z@fXdqoA`?v2hQ|D78VV9i`Lu%vyBhgFf*0J^3ty3@`nnbe2fA7xt)$5Zw$%KhWGnz zotmZYQL_xz)l0ulNdEX>l3J{;nC9@2re^34;`}N(hQ1B#RVdMesB|*Q+fVEh3ulDA zV!3@cFjVTDHlUOeAFNWHmR`o!W1KudXxp{e{8Z0~0t_vT5C6yzJvUl0`=bDp8kfEM zoSC_);TvAt^s`Px49B!yJocafS}+jm%4;~YM3uxQk>L!tRmeoVtHiP{;cE< z9Yt&GKpGxx=t2&L$9sd@p4P|V)?jPkZO`2B}_*1(Rj|Iiw=HSxzL&6O8wVD zjB~RHw^A13x5l1!E8bK*ncj;Rv}GNDeDxe;CG(TZgvsn4;wL`(MP>2`C1-9dm`9U0 z7L1$6etUCYB(;BT{ImZ{00wbT67>ece9`7~>NKS4vtv(vq8TN6oY~dHBdFV<^D?G@ zss4BtshW)xWG@G(0(W|Z;anhs>tskDkU3P{$qN3>U6-6-9|=FFL9v#c=B|SPjK(gVHs> zw;`$;aXJ!#@(^1=tHz^AwfGC?BR-!t`uhhC2QG%kn#lV*?F3Ny`LCUWh|BBh7pmEv zliur}j&+Y%(P9sJtL4Y3j}j_9w*9Otyy~su)OVZpY81x;VhwFM%`GmN>P;qEF?t*@ zxqGJ-V*YIl<{9#18Q{Na!JLnMBKj4BX;}56-Tre8rkt8D39u&A(97+=+g|3LSvMRX zbfd>WWuHs6`I?V6`i=&}>vos7J6>M_-`;SWwolISI+F_+y#%L}u7(S-mwj2y67u#S za+H0YHhB!W;S~7H+JK_UoWtw{W+8Tk08>x)sR`!+88}iTH9x ztC%C=Wmj;ku}tL z@Pt~*t-k>AKW4}aBA$bYB$l8Vd;PP$g}3HB(K_V07E~h~020ao-h^agH?ITzn?M6% zu+$=qZ|ttOEHtUZy(v&b@no~w`MT_Dg-4V98cin^%-(Fu8g!>Zbt+|IlP%R>h`PUS z3-YPhy_2eH@!Qdy&F_1qf&}|BERv&htrKsfZ1@aGB%mgWyiH=H*`sW7gWy0XcCu91 z9_Xc(YoZd{=6L$w`!U|iIh)f#9ZjlC!l1fF1r+NKNzqZn+Y3$8Y-(@0QsYhx<$l^Q z0SFsrwC~!6$yQ}uxPKGxwN+y%{OhZi!8| zcLqByU$h;MZ&k9@c19d-{Ox2V`+38)*FT94O=4t`sp>DFQ*4z0$(4^dZf+_Ar8;kc z4U++f`o11-2w}~LW3rc8UL`}$w+Gb&DZniASqJ1ML2_~MG7^@Dds}L zyl{m6lmQB!Qc(E8c0lAsX58s;m+?YQlV;rr06xPk-BSFCu=vrlJO4!&2FXLv z-dNuE!Sb67L>lOCCogru-DW-?p1FzTTdo9QG*l9hmXJuAkjk!avDL(>{);dS7LJGJ z`+w%l1lkcJLcS%))`{R>A>WBOi_Z?cCvx#2^({rxH1@T<33Qxmb9?7q#{a7_Ob%Yu z`HVYFRzwoqd3ga;-9e6iG-IxL6NPDx`aKGR06en+p$PFSb-rqU&yizXXXcVw-PwCm zj>o%&6qat8)Y}-106cu!`jb-2ct4GqUW(|VU;CvqQaV{Lj=;gAqu5a&KdXU%xL@+- zb@_4pl4xBHGb`cH!PnOPeht}-!W$A)Af-gLSmi!r7_<-d{3bsb12}v;lJ|)yC zi{CGNzt!aCz_<|cp5C|+j}n3+_4Iz;0M_ZxyisX|&OId7;J{*g8Fzs$jip`2KD4KcsuHY><5#Q8wvQcn|5 z&~#?s3wOV7fBFL{-RLC*Pcu^a(1~?9Jxw_}i^W)IV&P>z@+v@E@2fW$ZrR+ei;}f4$F7 zMN3mP7Vt7v48)7yPT+8%+`L!Bn~5mHgCUO)-|K&}c#!J%>-FK};;m*k4VfCGLE&G| ziYKXVvwgU3?@sMirC-Qg-Tn0zBL1D(#{4UH_8Z2)@DB1T9sEgQS(z8*?oBY6!It2c zM8hRTbk`*FTD$*NgDi)*(D?BXf0zC9y7t#Ii2CI9yZqyE|5PP=_ z=W$XtZ4QVZKElDl8Qt5nb7d!WZ`N^*mpK5x@w-Rt1$J`Gb5B=2tk1kCD6qF^gg2en zm5oA@1@4J*J5M|1+EY?8epIpUnfKz#HBbyU&!_Q0`RI|SlwC==Mp5roNx2YH;;mXZ zBBzNs!g2*!vT{j~WWqWQ4ap?dXi_s#(8+UH5S~H;u6!L1w%;nRr z{jhIDUx$27RC_W~TI&Z=Y~tX`c!KAv-0=MmtRxw`s&?y zL^$GHI2-HXN~NvMZzJOge@x2DNJa9z^9-X8uA`B)xFO9+YUgG=&slewP2U7BVAw;r ztY$9&GUT}j8eSEY6OYB~{ZTjVq>WHE?R^1w#~ zOD+YgWQ@kr+t$rH4lVRsEX#eY-;R^YG(4p5lRe`XygGMq<=`gu+!b=g!I&p{`aw(c z#eF=>YUTPSN^$iuT#VQT6koAhJWKaN8mFwJ!&f_B?qsD9m!tU3S2a14S|*IG&bhC% z+(t^ILY5kLxOFnI;_c>a^I4C7`9b;^rQG70I%i$dZ|Rm!_@m@o zRTQZ3N~BYsXbw$k=#&qUapaOTCu(vpiz&;HENz>}xpFvRI_*&pS}r&Sa|P|3Y2w>E zB8K`-39J*l0-M;+w+3yqU$`HSOV{sBe*^!9h2+z~?oNV*baj!ARGUIdd*r)J`I&P^ zFz^cNtq=gsEKUEDSDcwA2C$$&NKE_XmgY*bk-ATTJOg)fw{$+=*>k}s^W>;{aYG(c z^Tm~bTw15e5Jef1uzklgC)774<-78NNwtKA-Ccmrpcrxz+qM{yq??Kd?a{p9up&*1ZCmED zyMs+^=W`S&t)@W!ZbubJ02zJmW7^N zl2ORI^9}_6kGZ#simU4uv;zbSg$MUw!3zQuE+Ig$5Fl6z4X%X~9D+q~Cj?1w3JX$& zdvJFs+}&Nf$a~J|@9RFJ`=bx`P0bO##PV=oSb4;-GW|(fY8eL*7uf8y z-_^ig+#E$*RwK-hwP`43^LkwbNcl5!UOh9u2^dk>v=K8*@2Vomak z`J)*z&}gHRzGNXwJ)&Y$h(uyw`kN4X8^bH@_qjOZLGTFt!{qgz5GXw z3!R9@8On1T-L#2Vz)_>hIsE7vf_4so;4&Gz;3DsgBUkCYU89{r)wh*=a$@exqqB-( zv;!PyaX`!wr~ysJLlF215kY&bdWN&Mgr&prn!i06H}byy@@a2{?$J@y6NEXNksB9rW8OlHRlaJ zH7pH5ua)QLna-$>>b+_1g6%uKNIt7D!d-QuTG4_>AvUj_LMK~i=7L>SMj}ZhE>4+u z)Ae&Bb#xZHF3Ovmv&E7!t5RRSExxs?jL+_tRQpZ1o({@fbPeKkKI+{)1xRc;L1tmg zL}P3GdA&Ts!-0K32ioX!OOP({tME@f*CUrp-NJ2bq)|XIsGj&HyRfg>(yE6_lV{qs zoQBo^qY2XBe{a8GzYg!xUPeNx<}Aat8ovl1)td(O1hH=)ahfjd*4eI{Nyt+eefO7Q z`*I<=pRGq`yni19h@|MAJpU%jylcN5JU}zKTF2%wH`;zjZ@=cTY#)lN5ACj3$8+_+ zh+JO<4qQoz2(ov^W&miqD@DW&(_)geA7;Ik*??HIAc7BSI?93-Paz$(Hi@-LSKdTN zI2TkVuSvbjn0bqAC32$s%u03M?jiyg>3b{|z9HwPSB6dGF^**XsnNse)7&&=kdJk4jtO1*6!1a|>wElXp(oRm zQ6sG@MT#;cs;|$WA8?SgGP9#@ zFEziBh{~*I+$5#sSOCqLK3~0JZw%DT!Mp-(iQAR~QS*g#4Ai!+53kjdoNSL={c$5# zs++gd((n|f6Qm?5#(6*b-e&PC!*AZm?@CfrbfEyKJ$ALdQ$cK4bQ}{ubJaqmc?Pok zs~UfWkKJZAJ+jkD6a#S>IvSZ3*?tkx+foIZEw{bm5}BP2^?wV$*M(teS>z&g>kFzR`P`-J1yC1;z5L zO5ELNQX4Ka(R^lyk??^j`mo4_afCOVGg^g8;daKnld)tK6(|Da8+(#;ppcg@zOjZL z>6Lyct{72^?>M@47}VF9r3U}RJ{LQ?#>IUCGsq|nl?1dj=CTSgomOB7zmr>FZB4cd}e5nwX|A(t~u{S{^kO<{P!A~5LI zRxceNWET`NRK~X2Kh{ylUGqH27D;a(7iEGw7cdA=*HUB6QVda#ND&xo-&a5GL&xTC)A6u(+d+{?R z`T`Z1Gzh~$QHA|$YF3{Y&FCWUG?Ha-0fOas9~fk?SdC- zgU9Eg~I?=Z=+&fj?-Sk%3lLj%}u5y z{poOf1UaL|p__v^#MY!hc+JYvsfQPkuDJS+5GFbx$m1r_^mYVanee;zJV#|UrC~_< z!d9U0uM@(Y=+ieEB^$kbU%ncirh!K9Vvid`1E!SqzMFiiwRpsNskcjZB!O5`x^RK?V;^gE;HUVThW|S^H^$R5PUY=2fKI7nA z>a+zh^4G}lr`NZ0@9U(M*^9Q_#1uI}y0yM16Q2Vn-5V{#sE8m+GroYE^XwFq_AZY4 zY=Sw!#fS<;(-inoz2sF=sj!v|>&@MGBlI^uc_6$h!lU*Pg5hsI6-MjJVg~fO)-w?3& z+p{1P)kUtKoRHf`ZO{T&$2e|gHjbo?$9o{P(#qIt*yr2Sr$J#(ygNAAqwp_{!oZFO z)+Ot8hGI;d&t8VtrM|r{3(tL}HA@^}tgx#R23a#)xTwC#S7W=pr+2lN`Ra6j`J?;B zlkh#`T85iD?eR0r^w(*NTqx%ai=rM?E-&g10xOExhHzPDf4N|&fj!k}wQkrnWG0w?XeAi%dYb~KAyajEl7v-cWO0&??iIDSnZuI zAxn8eXkfb8`AOs2)6nM5Mz*8t8@TJN(J;4)@C&0)*+-_EdNa%2zq{}?+$-o#Pb+C8 z4R0;3Y2sNw8u*MSR5aCZhJ!F-%^j@>LsJu3Bu;CuTZO)Rx8@GadWRQ;E+NxDm-5!o z9rWl~J%k8hqJ>%w>P%V4e7(*eiRE?ebV>?XL>a{5u`R_;6?2!?{ckt!@NIW5lk=ki z*vh5atx+y!>Bv);$g6^igv5`pBVLPnoBb*Fqj$f1?c!RL93K<|5O3BhIv>P=7gyAu{m`GGHSK`-|0?-Yo$&aQ$-@KVmmpF%*`L9^MPIu{_dUY!!X;WD5l5gkCA$QR%qKp%mtncg`l!L!8j_0h>I@uqX;c3h>EMEtF8 z&)Q;k!_F>}d^BE^-=p>gRrslyHw(Mj3b>ssv#abdEA8a%L1g;bS=%kEg69Bcc!|Xj z1ZZxUkG17+8cK@y%r^6W>;O88_bW_lJp+4Ktj@Zk(oI&v&#P?dW%uy_B)}&PwMIP@ zUeMGY4729j&N5sHdW1;JcbzwYI-8~niI3xhh+q07ff65Ui`mq=|mr@D|vUQ z1{OFMTz!K1AODLU-j4^wV`G%H=^}FF|GPc=Hc!Y!`#fcF*8dlEs+)eT0MdQ#3^a5X zQMvW54_{wg#!9zUxG;sz2hZ<*S@}=?hQSE_vBR>H$BzcHP4T+uLqA*tXU{dzNYb98 z!8@F)?1ds$AI;9ExqG33s_`QlX=g*z&s@({4pJglKXRVFZRiwP*`Bi$# zz&%jRms;PK@6sh!GNO4iIn!gnGVJg0>j?Lpl`XXKsj^RWPQ0kGaE}<;DPqsYHo-S;twBAkLTfgRKtu0#U?GG zP991TWd%I6&t2iPH5h@lfq(ROVa)Q*CiL#|ffKX!DoB%JVlQyF41hNwlSoL8Curus zh3Dz$r@xm7$Gp0{DK7&U$Qxgq9!E1#wex0qcp$M7y2Gg}BN9f*Lnh;H(h z#mmB;Pep$X49~Gvm@HPqH5!zd+yIz?C8Ou{;~2KqLKSc6H$9d$gzX=9NZw|RcFeP% zO3i?sW<_YLeV&D0L4DuFH@w>t_1Gg8qpP`>Ev~&Ms^YnS@B0J}X)Af@5We0>e6I)! z{1PzVNO&$8kybJnlOj~6<~yS;pdgxk7D$CUTt6o#Vh(aRS$VEaSp&!)*|~C?ilf{6 z*1#ZMrc&`}V|l!*W?YuqVCIu}@g9hFLCA_*DdH?ZrZ|K6{YnPjB|69rH%`}DY zuWtwAYs|LuN{-E9YPvDA*dXqjnW(eUY~;K;oOvxHWLxpwJ!74H_RbXzuWL)I;Z!vk zu8@7at&R*|gzT)%807iyRVS5GI>z29G@mr&oiyUXwyV`$Zkh_#+tG$xT_xj=8KFXN zC-{d9gnUATl)b)L%=&&U5kE!o0q?&C({=AjNZNUAZ|5?dMte{CE<5ymE%94N+s!(p za{c0xgNoUFqM=-48lU80{`?F!4`&3kuVL4H4=8Y3=q_Vf)OWl+RVe6n6U^b8z4`lyTWouO|89Ph0mhIjEt2^^S}4$V>$M`iCP_^5sn6 zLFN{r*O>kFP|lkY{@6H~`_<|z{lYT4NO7C%@K$}-?GaXlxb+`LYRA*i{BqmsD03EC z-Imuao%%Y(ipeo1)xb3nU<2k`7iHt6&VHZPc@H=>ruW-kY?#&?%XR*VZU(lP!@1rGsm=D{j*zV3oF|Y9Aoy?xs_VDj=4NK&w^C{F!RmJ|gU4P@p`qOW{ zb$9t`wra(_SSMO3Q(2>kYz^in--X)I2eou0%tTHF3V)|&(qLJ@#uD3Hg!=^dV#YtP zsIg#@6-+eJy=Fo=WefBkkc6_C1Q{S{%%4v31dJrSFa|6RG}hF-Bg;_4 z$E(T!`83fezR>G2QE?i)B@vE5juxr+$Y4YgY7;;RskqZ=@` zr`e8^W^F)L{Io;s?ag~>U*aG`?=PB-&Bs{H`jshQXu%U$#aG^^)8wgae^Js{HRhI7 z@t9Xh#kI&0{|ObQ7B#{u&@dh@zxkmt^>I<>zLDmhrGSeS<`th0&ExQP#l08g8h+H4 znRCfEP`l-DvW_Yt6rjI-JV$}wxaRC`f;G*zd7@CE#^^WKs&aDjof`8}VrVovWHdVO zrDzEC25@SBOmXCRr7wqvKQc^XiGD}=2ylFcu-0_kURNwo3vh(5kAX^0cg6-Gp`hD}UxvML-1_^cQyceZ0hT`J)=J6`(_uP1Geh%^{D{Sw-KZ-j( zjSYDdTjj#|cT-H!!O5TC<(fZ*@_x5kXZ%WCK}mUWjxs9Rpi?y;JpM?>15>73mTCeM z4yts-Fm7$q(8Hlo{{YaP{+#uGT}#D~-5kuod@pYd;W!z|U7n|T{q6b|_0-kD?~PHg z1p}rJz6&*G*l6${y^C+APoOE*?pz>m7!uTYFb~Y>56h+Qp=u>!$kA-vOsQ2kQpzcr z6wdfP;lk>EJpPGt>Md=2oIF~u>9y*oqKK2}_dQK7IFyB3jH#4IvcTu>J{)=w7VnIH#scKmGOZ^It`JM=KwHdQB1KEnphE%co@aEEEx9aa6vi8G z)AqK-`nXE+`ti2@(9h{aH)P@ZeNG-0J#=>)?->45>O|+X%o#-`GUO-5r>=_QE&hC> zqM1alUh$HCEU2@v8O#9tNk(7%ClM%u(LP5T_FLNsTFme9J*b4!$P9Mf{z~UV$LC>C z>t6ft;C@SB27nUpEludA_XSbU*#JEE*cLLxnIwX0N9)34S6j)n+ME_wovS?`IqW@s z_S7hbc);Yy)EV-Q6h(ch8wN*pajqZvVX4l9J2*?0$I*I)wXh}S)Utxj0vx-&E*665vSO!I$Eyd9EtXm?M5%-R@80ZRIC+ z5%oNh5k`?0Qx&?gQKRFnZ8NjQ`AfSC)AGKW{O#6=;{%ZQvhnyX8w<8J5XEQ{+E=k# zRFb~5%~-uq#9zmyhWxB-EEh3X?v7R9Cn(C~CxPem{FD7w&H~q9?7tB*89FO6K%PiI zLSGEGOcd~8rplOT8HUGXrXW9H^XG}2PgNN?+676yu>$aQ$k2Ll%Q$J~n27>)x6$F; zvz8|qo0=4Dv=7vz&C85<=}an3OHgJ8ggM-~)>@|Pb!xc-GE$|{g~Z*BlcIt3kE$2PTt%W84x(+~XA z3Y~km88Z1)6;F0T-cg$7Ln8?gCchSiZYdPr8==DjhJg+djVAu&}^sZfS7%wqLGcT{d z%lynYe8jBVbKIQ0RHip)2bO3uY4C=!x};f*OL>6pg^m+CB*uFltGlx3 z82h%iVnNtl>2G!wW%vxFm`!ws%qXI8OpJ}CY3M>R284&Uv+1NLO&HF2;o8<87T`F` z29`lhFy=E-QS#mdH=~*U&7V$1VI;22P2-Ow3zp=IK8-mn+mjc5-^DH6DpPCTnnbel zG8AIpb58fYDW)ml(~_1vVoFaGEr@n$39PcFKWM+5imA)ImSSeUNh;Wm_1BWw48ZNe ztq$OJGb7e&J&FVVf-7@hLLEq=wYQwvG>MT-IWjYMA@@}3@ongQFo?6XZ%~^qgzOVd z$RWaiH^^4pRix=Sjuxell&tOqcGg`l59~w}u*IAdA_*h>2}QHkB}1VXeXxm8L@G`?qXRJhTH;{lu2CA`FunGFC~m#|H& zk1*qHeDEnLcIpwrS#dV|rUY*YvN<8=qf>mp58KBri9VB6@B&ZlR#h^E&7KVp_8Fzw z&F$kJKfWA{(}R~p^SDhv3qK&-?RLJDdrsAm1t+-G&J4HXV z`ifT5?^Bjj7_bIs%-K$ka;Bnugo#a6UteI-gEpSWZKlKJC5Nfuv?jUPdHvN|PRdZC zAFKYwtygpTS!sgFr|&!WqoYP7!*G-^#IQ>Zs;Rl*~w?^##gM@|3V1xGcWKlxfF<6NB<^fT+>`Ru9*mJ5msGb@h(UqfwF zG!4CZ;U{4n9qpFy+f7$VxR)geBD38zlJSX%A09z)#O1lMtd)I+iWd~^UjZDBrV;4d&Pv16L`9CN?5A^>ZK=AMm{>Ha2 z?Bf)(;fun^P!|ga2WRWzLa6RLe!T&Ym{N|1VSYqh;U0RLM zcUHMv_SL;kflO07rL+7>fzc{rpW|ln5Go*1+bDtAoF%R-eY}3V_k*XOOkw}7@F)cR zm%>8;x=jK50cbsr;hEQh=`P4U*w%xVNCiZm%YF8TlTGE5{4%c1Lmx&Lg?8?A!PpHK z3y4O1ddUy3{!yM^?a8J+Pr79_yJd@x6#IYm3>R)EWjTGV(6#`StLwwX7jAA@AeWaG$(h+SEC2@%?k05(#T1F>^5Mw5#CJKl)BbDV}yD_!*eQ zLdJG#rfhBN!@HSZ)4kiT-rfH!XWfKTXF1>B??GGcz2ef)6;zL}h3aK|-g$5hfKT7O z6Ve@?*^{Zhv`$3N3kPGuvgZoLbiae^ErD0Hu1vf=Z!rx>M@H)vChuyhL{?&8`W2^L ztfDiR2rkzu*t5%+9XL32()NpOEmffNq0{M5XbETASf7={@@~$z62qNVR`9S+N2n@Y zZjp@t7r)EjD<(m<8z#v$Jl}4PyEU$bsbVGiuCKrBDR_7huAV$QiX(_g`*)BBLB>GE zTpPA{f?4Idb1|8PTi-AhXXE?dVu`r_hZe+wK~|&m^nbI0XbM?GbpEeaP%@zX#Zqh$ zcOW3h$1SM;gJ77gSu~fTTh@|MrZC{4d&~*BF(7qRe zsm|%z?y;K|ezI64nk{%BtsovpcI{F6Oo?Y_MNTSZg_5JW3Dhbp*&1m+adclHglJ{m z>*Bi*t*J8g_?n$RY#1?_VyPB1%N)5;zb@1sha@k28l(>-_KB z;KnC1bUZZ2og)>>8s{tl>TqUPBg3oUL8@5DbFW8~fr7s|T(b`8TcoR&A;Yc(uXk41?(+D z)Eg&5RR!mf{T5Qkt3rdSd~+QsYmZsw+IC+Q>$)o$Q9+C*F_qIbk|&5`Wz()Fan7`+ z|E9U_IF7(c;9oJ$hWR2E#;-pDHU$4AA9Wf5k@68@=0QFp*DFTKM`bcTsv@Zm@)3z6 z*XHwS48jsyRFPsD3d=DBFbI7BX{;UmW}#7<5L);Y;DaeAXz^$#78hfnBGs9!(3xT* zz{rT-kGYJ8%P51W4Wh7gv-NaOdNPo1HCfiDz%jh^cD>8-2OEgtHnF+-C({Ief63g? z&EkaOE&O2S;2|8Hmt;E~Nsqs}@CyP3N3LG<6gf5~ta^xd(cdFn{5Tr#1sw(s#-)hl zCNl7azDAaQvU6#y#)M0eAtF)hr)H>%zP2okh~c!_d8xW|Q<_rfzu0pVe%Wtw0CGtz z6O+|qqfo! ztF4nJQb!@ESKod0X}3L8ez0Td4ngrzZdMD>A`TR zrvnJ9&fx}n5NYErcXwBug7t(2oQ!4d<+to7{AAQ`EoKhF^zpn7ZcpOb=lbzo|7>7y zRzx((7HQM;%v-xT7wTcuUY9dIy){1!UZoMeEM|F# zdI-L?d~oW(M>`a%_y%ZWWp4Cu1sT9KJk3ez$^2SfyQ!C8OGY3D<_~rzxU~DvSFo7Xu6Y zq^8Y?dA3u0r(Ob=^Ic6Fp#wRLFosV2`Xwidz>ojaS~C3@px1O9s3|7-o+LLx{t7iS zrhW@&uMba)4IPcJ&=bUwV_dD>NC7(;$~Jea&NW=sK50?@b<`k?Tmz^2JE~ z@b0Ui)_G(FwpC}%O0_O;sL8DB99N{FPYKz_c^cjNDLbhtcC=@=)GdKfbTmd@ZKmTAKXMVOuL>z<^d!B7FOzLMrD5PirDl>q9Na zD0m=xJyVRA!(wEG?e%bnZf17>+w&`_@R`kbp@`n9I41`(xC2#UVUhwjSa4SL?PnP$ zpG`&uSj08^J%bt4Kw#$faoWyrywO1^MSC=Z*g? z_#p|7=OY1UBP-u)L7`IFsQR+|-_(9BU5QR~_xEZMC5|z8uSgJ2l8eI3ABX)2raloK zG^QrEeM)M!LO48(F=`Z5fA8(>5IM?|M&0e)-1LCaNOq{GD8CpX1>>#@-19o3#?}C= zu;f%s@|DMXv%v+^ewOvLT!BPhu4I6K|InR=KpQ5QA&u86yP{g!Q*u9bL-h4HzSe{d zqoZ|FV;DyK1YFmTXVuZ)y5fn^fZUoKgoIjOOoegh8Dbzvu)XxDoK(oIUW4EGp!GkG zDr=v#q*HU{*aF5{s6pMAn-r_gwxpJT_Pwtrt5-=5@m)O$xG~n0JdMQm;Jm};MSk>u z{U+tIXTyRzEzhTd9Giyz>P?bSsxi3#sW(k=kl?zBFTUa4vFF5{{dMMq;b?|VIXR_E zC$Ued5wiuaSmnn5Me7DP@?2T1NQ(m~@X~Nkte5I4(lJb()mECQI0G#(t%)%j zgO68nzk7vTOFm2640w#W`kmVlc%s!EV-ayk*Vs&j>WHXH!X8Z%wcm}_ry(YxD;n%rnFZ~n~#`k^5?Ii|6 z%07aV&O%@n1+)7VmDh9#nh-@}-jQH;XXpM`YL@*l!ar5j(Bt(YgkV&5t-i(|MDuCg z@9_M!q;=C&aD=f-kXj*DZIVR_nJC?G+=znXX*0Fj)#t0nu|YbU>1ISEja%Z7yj#|F zKM2N*+vJGyV9ga&rS{_p+B(!1%~yRErxp5Xk$(AcFXy0uTM)zaLN^9u^{u%y3WleJ z4UU(exoBVCI8i(9^-lU=~ z7UKjTw^5nNuSj#o9=x_qrus=0#t$LEs`bp-YOrW9E` zhu`Uk`!tc){c-I@pz9z_QsN(~C}Dyl-fd5>LLraa0(|shVFbL_+3hGAFAvp9SJ9A~ zRuoZ`=KKh1pvS)J!nH_uGBbj+RU!(-&GFm4`BPBN2i)5l%0(8=uEC_b33?t6bWL7&;MT1{p1*Hgi~ZL?+1 zZDye|4bJ;||0!v`HJinxS-?&Aa;H}!Fr0@e!fdgyA&caU1bF18AeGy76Ezo6{*SHm z!xn=hY9h=5>c;!);bL7S*(KW#3-n>%mU~+zmxpb4Ov#-Rsz`!%5*9&YqvWVh!pwUs z%gI)l%%$umxGpH<^qoS5T@**^2ziSvY@)K5 zW4O2UEOu1?so->Q6GV?A%j=a7fkob{_e)&AI3egL8wIHr7htJ-?#Bq=l(E(jM)j%1 z%e0&!c}B1CGC^p~IiG*SB>_IECWTA8ToxC%b@u_vE}P-Q^sUIWD$wxQN`io zq5RzV!=r}r^NbgnE=d?Aw%8^#bP_%%*$Doo&^@y7!!91SS}Rt`_2k?}Q|=e4*bIq1 z;p+J(f?}*lK5G1zkJ5!|AOD9S?;*Zguuinp<~^TFX;bA|s{z}XhSB}q|~ zyu!%OFx#3>$_>-8>k>rOewqO4t{|sbg<>mUlSc)R4pRz5Ki)ca9(vuf+~Ld3JYQC zI7Lom80VFQ^zGt1an57)&wE2h{l56#_8G1&X)7)^rlhl<9wsW@(uVkK)554)_WjI! zluwAih|Uo?>{B(whAM$taU_wvG=|@0n1kJp5Xq`1p~8bNR?PGTT;>@1M4>$I43Dfz zXJh7#jCiLLn)`@B1H0a?r(N6}&kfH_35rY_sM{nJ6Qwm;@@SgLll$LN=c;~&>rSoT zwc{a*Bmr{1$SUhw_%>FcLM{JluRnG|cWkz^VTaC;A2Ybt4ei^C}5N*6|S%xn* z%{S?&6jO9(va3fqv47USx0-I(b)0$C{084Bmu-XgRMU!!=P-&o`r}3SSN(gby_@I_ z_OPA*yS!zd*gWp|CKt2#o0I+&srXa(}Knk;Y;!Jx{|%{R=e^Ui&-K0;N4a(o4sTEhAK1h2&O4-yWe2arOzBV zAyqX~q2RlK?Z#^=INo72Q%Z`2?(NxTCeQ4!(Tck((WF(ZmLUKMjnZjV3)UB&b#Kb9 zu>EgEWDlD;Wc`}ok=aX_RH&r2(?Y=~X(AR(N__lP&gx!^RO*k3QVs1CK|DBs4UQ7C z!CRc6N(Cuus)DrX3C4kS1T)xMg>+pIC9MNJFXwy|@&wb^V zd~WC%OY@gs?xT_k2shaUKj2Kh$Jf59WksE`CR(cT35Sl8vy(-bMn)|Ux|iA9gYKoT zyU{&0)~WG&s5bBm3i;1@{nFL2`muhqz_JBj(F!d7;19G#SwF;0HN8;M{*O>H|w1I_N_>*#FWH)QkSGfB3IW6M+BM zEl$$>`y86yqgs9SD%CC0|M9Ryw7;8bl;l<-sSy%Jg^pH|?0B$C?4`D2gtBcToNfnD<}p`O@?^ro)Gm`@d-X`ctLK&*x!}7sOkNS>M(PfC6eIPnN<@#s zmTN8kQ*FQN=@lW{sZ3Mk9t(ffCXuEj)9JqV#qghT_qHNmcMa1j15Z`tYl<@b$A$v~ zGid&;;1P_kAJ{zGyj1Llh{>$xjjGLT-rk$bVVCT&Id68;wc9HS*n~qd8f+ ztC`_};GY~{T9{D?MYNoCtuZPH2BqE?ayt@94%9UF0hqeh+Hp3=-&#h#Y5F~`YI~Z<8Hs3_TTRIVMP#0y zDt3;YhCh4%Y+}|AdnVD3OEMS%TGD2yYCoR;;+LJ$+}5-||M{9uen1=2r9wURTyhWk zJu6lHx)~Q`8VqSI4WRCnQ;l%S{^=^6YCZw)$+>YbtaR}-O|e7)(%YpL+USp7d6qG| zGvBX0T6xz|bYLCSa9=@cQ18XxkociYKl;V!fNzaO42!y?OSb)#$ksOUro5L8y`--- z=JpEY&}#zKfgg}HQ^C1Bqa5*x&}gcE7@+a(=D1(O6)rPOuQ>nCBuLmRV<49D%tn;~ z>|tM~uQ?+)WdGm!Tw5`$IrT2rY*& z4tlbmlM*T#d7pN(G`$TP^V};Cc;JIt(p8Mhkf-K<%54D1LMC_i1JN+DVoVuUP$Qqjk@LIZMIW$YrQ7uJ@|FeR9jQ17ZoQuc`3x%Swb% z6^BcnvHNvKdaVJk05TTfVuV+7_ozzr)R_(KJBfXTR6f3l_Ux1|WZiBSkcz9Z_?|Z) zP~Yyy+5rmq6=R#Y=N}%YCWA_ZZ$n_WX)Bk6 z@J2s|KiNvi@CDKvzFnVmV(3#AD+`Jaimolyi|1qRa5COIO15`);}K)~-xaVZ?6{^`sq19v#Uu;f)^0_g$5Jiqy|e;MFrY}KfT4(ab4UJqM>Gr)~Fb40IOxeoWC_rwOhq~tG4zgK#N zj1@I2zP|25O|sq@%NHtD91+<2gVLH-UqcJ!Ora?(1BAWW+Zt{Obge|z&*Mr0>lcb1 z7v6*n4PRuYwd#&k6w0sv&Gb@K zO9=0ebMlFwZ+?P6bETiys@I|7@GyXyO0{rqb4I>uC5xHu_l#Za+ zP*>`cKP>8U2 zs2`@TfBh5@Wn7+Gusm~2r}{s7U7$)2HI(h&pt8if%wCft;=`7F zH5FoW6)w785<-;4s3h;@OHxMsY`2 z_p?O-#i)aQr*E7K6r!1a4F~@n;fWXz(|_A9Kcd3BubJl}bNaR3bcOHu+i414x3jC2 zJ5BkL%$hlTZ9IhbA!~q*dj#?Irhvkzt?zL|DhEG<*ot@BUk9FyLhZ@^a531AWFbZu zz>n0f?|5=`Za?o602-oWli+|mJU`Ax$veb?pIB%Yy7%&esP{=kV)0DA%XD}-@J?mTZ z=(t>~PIb}>mbC0hIMU+6^M*XL)#VP(g3%V4x!2}=g$LTuU1|>DLT`Io=MTa$E&HId z8;~eWETmP{e?u&YaS_0kc#xnz3KQydf8pWv-0nCAkE8xx&>p=1?|xUZ z&hgc3?hZugZ_KMl`q$e4moClBl~i903W@))qcexC1~M;w7;;u8;S7=s0ai z?v5<7X_rMzHPc?qGhMWnWH#CX8I2-%q2nk=1BLz_rhOt>P!W$Gq&q1MmqV}p?4qE5 zG=@S4CxZ=1-r{L|vg0vWq#`k{{?st}kL#tRi<~2lsI6T$RO0QYZ`_=OW-zca@P5yK zO~M#e<-oyWeja-9%`VtHpnoK>h^CX>JAZtm<%QP;I4bUYgKBFR!o zbAlMk4BeQN0LYw{8!N;&m=Pm$_PFa*cb8&=e$5iglXiQ08RfL6kQ8$$B`a zNApLtycm3aBx9(U&hR7J&+4-c#OGrA>iI#=t9{pxj$fqijr2NFuz~)J1E6y`&%iF| zQvQmUj%4Oe4c$}(nn>*ExN3~O;6~#@W)n%B!jTW-^9fi#>&Zh1ZANeRzCOI_aT!`% zZ3TFj@FA|!*Y?v|zZvbK*t-6S=RVG^?cd^2_B&)-A$g}X35L}YR6-FaS#qKyZ(Oxju8c^*H= zQSk0r0~YksU|Fvw3qAH%C1ckM=p33{qE_0(v!3r%?r?ntjYj5p6R~;yyfi3iWFaRt zl?90rwhEg2kMq2FU9rfO$cmzTth9}LXV14%z^ddvmms7CrWc4(lhOL#BLec><)qw| z`I2RkBK3vut4g?pt?L)fE{R7I6%(p3`P2bhAH%)4K=-0oc zFt+U$5k4p$nnS#cXI09_^_xho>OvuZg+KAVpyA?!{U(KWMEKBCuQtO~zCE-<9cxhh zB|Yyy+4=snf1w6h#~D#o_*b%lBx#cc-QLPi!CLxR#>CK9P!aKV?VkxZ ze``PM!^_`gcGx>2m<%xP`a{dU2kB`&g;>n)&V0i=Wy@oxJBt(6g)5mh-Ks@Xko zzas(^h4K=!PJlTZvG0O$4t}@j054(vSn5Sfq_h#x9_-t<|agH)zzX>5-=7%<@V>B~onHsD2J7>QO zc!<*ItYkxs{#6-i3ijo8#io5%V0BCPh-;yhSazi_SH4C(?)RN2tu_J5 z(_(pVw9Qr(TPTy-KY7mGRavv3vq&yf?a7$LwkwD4m3>Wyz1e0G~e^Ze1bsi zku}TLyzCU#LL_$LKsb*j%m>K&HDAgKRo;6O(@5~!3K+S^-M!s8W_#bBzJV+3IH^HA zEF?peV4~Jj8kx;UXAKF2W_g$mXP;>G$daPsveyx4M|h1%*S#4t%0Kl?Z2>|MGIO2i3sCWp8Tns{?Zv#zlf_o%Dt`CH>2Y$_0-6<2kQ) zPMNm>pNX;m)I+?y1bxYfYk3dF{=FPB_!OFE1Q8>%`8U(sV{wKr*zi8tFsrK~=h}L6 zZ1AM+SyooLQUa-`rs6w<(*#FALye2va$IR-6j+!fILj~+4VOup3>K@lbKfOTt6)Uv zy--c(c9hIrLt&PIKW$k2j%7G0N+<-3c_B&l`|ltp{8iAVwx(oAP*P`GlgIgT6ZVfy z?#osXo_g;5vf-d+c)7bKsZ-D6yGOz zu0BlC$V}ZabN>!wui{+L6i`23e~XpyX=Y_y3kksd!9QjEgMZ3%sQ23;7hsYvA`HIZ zz|xYU(nWiQS?IZ~G~+r$WT~!HF~JKnJ?xt{HFElTGKJcN(^5|^WK7inrStkz>Wix{ zm6n`Rl*x`KNrZN8?v}_k*<^0CmN+r{+!<9uzDx^P>6BKKF%J@Q&m8&nt22j3g)A|* z;rQSU-1Z?hC4+OANjW7+lHmaK!R`2xIK`0lnvCB5mhROJ_I)Y0iJCwo+T)dsAN+I> zhc>Z6Z6vSDz3p7+tX0JLZqu(tuUrv8j%+{(FFkCVZC?x~t~BJK5Wc*U6(ia=MZ2{x zmOWI-cPbJte%cu(P9K}S4&x--!v6%XsWMb%=&v$6wWCu4XI0)gnG(n8Mb$VSx=o-x z&rP;j_DPSQJ-L2nYRPyL7u*H_ZyrNmA{|ONR==x42p39CvWrom2zXSHX5r>lWY4R$ zAvUSm{({c#m4<*H>HX7hW|Z`Yq%y1yg*wB1`~YJ@!#P6-xyjXrM}Sq*K$+Ck)cyAx z+JAIi^NC72|EB9AW%V;_@>72Wpqor+hKE^I88NEZh&j9D42;Z%Q`+W6Jo!P&K-V>= z5#E;=uLZ`L*g!bC_q`3T%m|%rS!SN;I71Hm2wJYq!Eu_}Y! zow_9B&~xjW#z?dWW0je+<-Kd^mV;zW9p)c51aPx7DFPh}e#M)Cs;oEt zm9$Ca(=9tt+_I*I!vD8^t0_#px9dVVW8Epz&l`K0!gA?||D_YBhhP2y+~cwhL$UH8S?it-_r?5pz+gOJuiAeS_jKX zXtLC??TOhYW}Vac@eE`WgOlDjDl$68odGCLD$H_jmt_vrnRK=#>1oWF%j*&86{c8e zo4`Kss@9+DDyhgw>B)bKo%pKYnsMVH6vq-gB}_PK8%6)+9DF?2{8E$(Yv&}Fto#a2 z>|sRFO}KN-mKE72n_$IDRo7&ZMo(qu`7~?6Nw{&ExVsU~`1bO|0$LN3FVTC-6M5X1 zxRtf#WOrg_!$4j-i`|SkCKEEf>f4~@Z>E8rYr3vVm&fb50qOO$rOzK*nCS(=O0-5B zpFa7ubz*pTfB=&+tWqb?rJm*!2cd1CjwK&?=pu|pYwLw8QpnbYtl63aYUjY3l>9P; zHmv9+{SrVcSC0I2;7xPA;11d;zHF4?$qxd>%=ak??vYD)JKb0yS__Dp`R+g-q`SqK zPpnYg5J6J#Ol+`GbrZCfa`R1l^G-lS^S{Vace{3`XJN|m4B-gkVP#(!MUsI8m|_H& zm%!Wu-I*#r6o$ULA+Av*r9A)e?X7E+9J~a2ur0}#m zKN9OO(lJKRYsIZy=(QG|!&JKodMy$`4J({D0ia>Wj6$)OZ7`W;Unt&M!w-<)O+3QBnVEwGFxO z5{JqhQnRkzh9ps)JAnaG4e$~Ez&8sVkxz<4S?kTWPYb!>qerfHH_ly-8ru7|5qrD`zgO-v$nEU3oWFa1{}fQ*##<(_O|T z!(DLw4{XXv=A%!dj{ePam29%#AEl4O_-_T_0cIKd#Ia9vy%4P63R5NoF_TPhR)mNq z%Wlm|e@9N_7q&@_jc@&8t=h_KN%a=AF$YuwHMdO~gpFq$l%+8?X(X9k#ZTt%xnnCG zQ?8+SwnXa74ZLru6BtmX%PeoSTlMEb+TM`DX`VdqXqWBEN1v{E$ij-@WiK%S-ex36 z*q4jYkmZW|m0BwGUYu)VG+hORrz(_!%)_H zMl!3x6(d=SQq$97X!i?Y*zV8MF+b3h_%9RB@)jBcN1?<;V|?99Y<#UfREzqa@|5$) zv$eJ@b}!+}Fbe0t#aKmFF-*-CzZnkNDTA1H4aaoJx+NDfxkMr>rQ zxKVo@4B0^!OQ?pexfn63^*vRV3ja%Eb-(l~GO;tpaG8XH^t5TO*k!*yVsLb5pRelJ zFqp%gPe!5OUjM%XsydAW>jn6N!4J*#PDfwR&+IiF<)J;3e{rY4-}Cb8g?^uwiT9c^x4tPsV`4w+_4oQCKhD&)oic>WGSqMn+it= zqcWM;>p^cW?xVC2)OB4IS9EA6{vluaR0w2m$UuMXTUHY#Zr(lp_{lJ047qF=2_6LE zJ_BEDtV-GqN_LKM`aKe)7D0ro}o*$1JeOXokBf z{wm@2^wAx|ErCASx2Yb7GB24X1W+@t+A@KkV(#$&RBx9Z+$1tTC9mh^i*Lxj;*FVE zYr?@Io+}`4^twidSe~RCt z%wfCPVKTp8UulVV6uC=60Y==Xa`ix(+yu2(c$+=|c^0O#6?L6|J~RnD|FrWm(f?%b z>@;7!9{ZixGpNiy&#zaarq& z*GH7CtcZD=`A8Z5T`rq>g7>rpBi8#Empk|u1?!$o-4vCS`wJ_GN2t+}jLjK=hjXT| zw+20XOxyVG`Z?<4eQrqOdkl_uT?bc!x&c3bVu|-wX4Bh>@^nRSC5r0S(CZ(1DUC&B zG=`&9k3Q!B#W<;V8C|qBDHG2IWBW1WqqG2etI7oeb0pZIWt39@y)Ie_qnt3gvbaV- zd#uLrkZp$y3wX-qP2CLqK93`)zMhxtcb^6U5IP=ofhX|~8V5XTgLz}h?MJS>9=%O; zn~P93Tb^Uq3|554?2N*HjgLE?xa}uno!%$Sy6kJ~3}3o660kjED>P}pegF0$!laMIrkWn1J*4KBW@DrVme#^%j7o z2-UyX|L(H8AO`*qT-MY72+Injj2s^|2rN>(G&iBL?@xi$FqJqk`yqzxzy5EIwkhT-dukF@SpLe_~qs`6PF79W-7SkS*RTbX2C@%UM zqBrFbcdN~RVtR(3iThMC;;)Mb+D^cqY!(RCDb1499vm=7Q)aB7n%js1KW}nRF!an= zESE}Z+enmJc@s35C2^6rNuFPkfs~;I8rq+SgzVux!R}iHPZ8}yCf-2HpRzgWO|lW# z`hEf{jIejN*^6oux!;Am@LxsHTa^D+Aw4_Cq8g#oOMuSpPLEgRE0>6Evr}kPUcMo1 zMdclmI(_A%yHU^{s$(1&nq^UtnV*m&c|SzjLXyyd^RpJ`4eI5bEo0}e`Eu8vjS~AL zfL^Y8%)%wuSWv9T!PG8w;hEF;yS%@@J1w*>)3S&UNL_RYU~P^kAyQ(3QeD9A2}}L{ zC;Qps{k6%dd;|hfTERWT^ydX4qS?T;7ex0?5z)=F|AdILb>a6?`kOp?1^)>((a(}y z#!yjQ^(OfzlyI|^j_w92*+0+eo>Nc}(OEK%Csyd}uaH{F-FEQ8 z?k9!uy$uV*3-08Q(|0c<6z~W@VdthBVckkS*T+iBJydx_b?oWyAG?e1(Yn^0;=$3V zabVp;;J3=V8}lt|dGT4o8mgz0`S5T4ncyKYMLcOY`YE9?Y1UTRoZ!iN^ww0XWlv}R zxiuYx#jmxX^G;Y)&*0Twu)es2Z?FFh@>%_kELY=Q{|YI>uXs!j9L;|e%3QOdIzH5T zCtvC#-l%0KZh*SgO2-$p+qsV~e=jDhI?=LwoM|!L*7HiWuASqKG!Chn1zw*v$p!r4 zu@XP=9<#jeQCu=g>8cv%+gTKsbZco5j^*5t=0*xY?%bO4ZX7l53q=Pc0iPIYPgzP>qa zRnv~NpG@LbU#}NlEO+lm2tXaf&;lC**sMV@CoZd}(jY>s6c6nR%TgoejSR*o9M^Tu zYVJUR?K<5h%OQmX7{VP#fXm*tM(??m5YBA*%%Q*9V-s0(W|_R`3yeQ-d5$bGPVXZZ{$#Js)kwtrLc2caiJO0y4_?22hSK`8k%m_D*IOeNlD_pVy$& zA#|{g7IP7|v_$a%OaSQzEe3qP;Xd}jv1yhi#bxLzvVPrzg8rjkyTwGD!0HA5_{(Y9E zHy(^Ub+~`DK7Y93*SD~n)E<5C#Oi}-QW29LUNr&fx+1CtiS&eqn-L|$?N`IOmB*xF2tRy_PY__0Y6?4v_)9|<0{ zJ7X(hwmeatzH5;yW7{ZZGH!|UsuKo*+5v(ZlmZK(ibA?HG^-85~v? z9=Uy~W>VOZx%J&S?9O%?aV)RI@@^Y1CI$|BlW6x?8l<+4NvZ(5)c2gWd}~)gl~8|f zCMGh zcwAT;J_co1WD__O>7WrvgJzZk4Ju8+r!R*%Yx4Hd5Jqdlq0Izl_gYx-WIf=71fn`o z&c6O~Xt{rctosxF^|h&%&xM(taKmKOu7jTMO(^SbNBQa6t^+E*VnCq0-p}J?sM^3} zZHCN15LcX>fL~=?7C&}J47nNidd!Hz3&;=f#-Yt;j8jK~?nW>1=V$teAI!<)J7tU~ z2SLcG=%x0tN8pBQW_tNU7?1p5W;DC%6sd(_?M1G^OoP7k9HNa3&f3i&-SLI^FHVXoB7*suQs@f$1vf zXW<_;K@MQ2y!)5ZjuoG-nZY=Dj`pZ~6%t+JR)Tr)C;rxqXDNO696i>>7gn!}Y;skT z;h41&%v}Z0D{AvU7A43l5suv2^v-!F6L+K9OA?qO)0OX3f&tMyo#N-X#|DqjM+BxI zr#r8A0Kg*wrQ<}Mya*%o?*h>xNt$aRh3p0cKKRxeP0j3M`?;MOOQd_dN47!ikZ13b z)M6&2HdP6bW^kuMs^`~z3znaXQ)kS!>Y7@(rIC@&L^R7%^t0`$O*q32x_h}jMvIXX zA(59tHMIQ9x)mz?MPzw-vwYg*NmJp2SZf`IjN{%3tpDH}O-Yq-RJZ7MN(hcbuqSIz^ea1V zTK0r62;!0^mgN&e)Es?ThVj|2(9UN+G2Oe}%Qf4#dZ9z5D)(sk0Y8)gBhI}WVv@Bj z0Ih_EL|?`6inO)s!|!jq_9#UKd~uIhUyVk?g~l@E-AiY56T?r(|%x*yUY9>7{@ zMtH0~aX6>Zi)nkOKMsm3790D4M?1^XLs|F7p(9?ND)W{7r>Bg_vub;mx^Qd0#vhA~ zs}=?|KchYDH=Ga@-{X9LQ#=C3DW+3VzKGz9AJ7~8sgFExXt!1dvZJ@liuPS$V@KMr zF;y_y8gN>FzRkms18Dh+=d9Ll;IZ1|ic}L}aEv0G(5o^Fv!u-lZ!_GXx|vox*JQ4GHQ%4!WXcXOXo%^<_or=jcX@W@uE>hKn_LM==OzZZ9qDD08jvE z*O}KqGBn9oa>LeNgc`N>~%UD52EOg$}gQ}Y%-Wzo%_8987^db>5dL*6@d928Ebi>6P$|1I@> zvjAD)VM@hZH+(;*{6k&D7%eqbggz?x&gj#`BgCSAd9aGmq>6UwaH?I#&SaHnV#Ix{ zrWg&g0k!$mjO9TU^Tr1y$MOxRH85PE%<+T5DAO!ZI?_A6pZQNYM)({zLMV(RkdJg0x<;6=HeEf`Hd{lyRnBQO;yjvO zBa{bwoIDGGIjkQKso!As2EEr((#J5po4`9ia3rPzRNbi`!Xo6o+Wm(6Rzfu5?>g$ zYRhA+*7lbTNi!QSFN)ay0%wzP_w|nsy+~)X3Z>ee#)#_I3pc9WG63_zGEKR} z2ZYpuuTP7dg%(W4BubqwIoGu1z*nbrOY8^OsV|)|nXII`BlUy=Dl^n}rt*VUB^f3` zQo_2QMho*=-Qpq>z4A{Qa_Qe|yYcTWhs@N6tuto%=dQj>EWH24thPEqH$=FfCQhR= zcvkWO7xIzx)0=17_hDVk3eRC%5Os_N58IXjMQl#Gip^R@n6ZB;m@rlBG21S8Z%52C_sp2 z^`B04lP{jPCWjtp{_gvy#~cywEyBV5_rhyR$3(=7XgE7wv!eVHqbpn+FE+ExCL!c= z9k)pSPU-}~*JN*WX*J9QfEFaEq|cHMb3qfY3bSDRw~Upw?AeBZy94vPQEcmwJGN4ER-d;a==|6Vuz`EN<{ a|7r&T_UB~S&yQwf>H5PjHu6tzy8i=Yc&jb| diff --git a/media/web_mqtt.png b/media/web_mqtt.png index fd8e83e8977d3d9aec3e9e3b39e28c3f0bf82c45..f0a7add9b97d50a9bd03925319b5f6af38ae6d3b 100644 GIT binary patch literal 81965 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

W33RLVE|QQuUzqMN)B#By-I4 zI3j1Elo2y+@P>nuXN8=z!Jbq+mwG1Utk%B84NNG2-%}3`XfI4W0$Og`gvQqJW?m$= zlin_@qjBfQ?XtwxFV@+i!`zbsi5q5)1J6eN0}Z&y)%lTQP&K=!WYs6{pN+*(mB{!< zi6a{lf0gJ=B9?B>w#Xb&GxK6+4S}T|DCH%=a=BSU>Dokgk?VD(t=HP$XCJ zw#yaW`g!4kB<+4a-oWrHFW&l|-vi5w(6?uQlRZ?PhhKDAin-9W4|ryOQp6E=EOs$k zD0^p@v1?qYTej(G(zoTv9m+ts0)>LI=30sjPEQM~x z7RpH%d&@rmFw@BhM*hTMhkt?-cjB@?A(t~PGB3x4SBI_}tub7PwN{Bp zg%j39HDF7X>>z2($`kOLiOnxBfu;GH9uuvyRkVu;U^!JvztTXVczR6Z3SLJ{ky3T$ z?O?B@OrKszGoh<&=b%~Hvgc?IHFB0t`5t^@0Xb1JwwFD94X`g#6y9xT2yE)4&RaMtU5vMq#-!Usd(}bF8$9}M|mdkoST5KIak?KLTnX&gKNQdlbhrmt zM-M8F<89W}WaCqX?eFnOdyg<3E@pJm6G>B6v{I2dA8?-Rn&cW-u$l_ej+>mH#&ICZKDy*x{s+6pD`%jD<14}} zICCBL+dBFbprb?KLzI*woEBG$i?Z;~Y{Ug`_-EUOa7XUScwv!>cg<;;EuyAy zxlpOWB%~qv5L=S%7IN!G4`pAidn8;6_?z1MSDoJz!ruREyOMf9Vd;}|xV-H9CULLH zf|v$-P_o8=Ca?p!(}sTt@20`fn&z8YT4vM+Q}Z8uSB+de*j;jyzw(mwEmY+}*o&8m zgL^Ngi!Ul$|D@qm4w;b7cPbZAqki39)kA9YXF;#jXP;UBDunAG-WIx-Np&4Prhdm* z9MF9Q>!N_v?=B*@FSr7!ppwny|6dY8TwWOVzj>Lwe8=v@{w!gI>kPM6RjgR~d9QH1 zCqLDO8CT84wzrb?Ns|v%SX;gQw`Yfa6lqk( zSvP0o)dD!>mb7EqY(-C$NvAgMOP!mF3A}U{v+(xAn%^@3W5<$@b(pJw1KB`OR!?9# zR9Ch;o;xnrO`@Rk< z*!)|r@<;zE*+O@j-!Awy(!~jXM4Orc9hyENP#EO+-K6fRO*FRB>-`oWSEqC->{Uc^ z>Tkty*4wz|sl3Ht{9}N_l>}`VQ+%@xbHY8UU94tRs>y)be~BbrK_C`7ZHH4{R&e#c zdD{tuRv!Js5KM{MvYd(@oO z_uxEEFdUH{_lkbx3h~jE9iv9EQ&$jw?mGD86sPHxj|ah)pPdFiEVb=M1uD?}wg!EN zSNu=$Iaw)b%|EGk|084jCA#B3wqCg?^b&udE4~QPzoldo{!6nt`XM@Psi0dg4byJO!X97Mc79{*L*?{ zW&z8r4pgYt|6VC!{u8hVcHa){E2b${Z>+6la(fATp$1O{F$J&PnH_QDzkToCh4U|S zc2{>La=@%yw-xy{!|6jG2?{F4p1M7u6(P`8e7`bhUj%S;ZO1xEZ0~9vAyjP(q3f;> zb9&h({3vS~yu@rYzx9%0+qqva942w$?ZQjl1-FjN;9?0ME@Ia zCrz&7#?!GLYJ@;zkf%4NiaC~hAuwL8dpiq{zO?a}1#-I8Kd>WjWQ263&X__>wm_XZ zdrP%BaS!m~#kt2TQpzzk+Fo0HAGF$F2P>G8o18~2{UGVJ@YEpoK4iW+3kTI z`klD$ZHrA!Q-|Bxt%I~X7wco4%3FN-3@zW%YQ&skeKZ??QR@Zp8-Y`GEW!6b

2c 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 diff --git a/media/web_settings.png b/media/web_settings.png index fe9fcd2f4aafd55483305ee00d84527584dee3ba..6fd91c7750c245d0c3ed63024d0cab756fca9862 100644 GIT binary patch literal 94566 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 qVG%$Vl0br}qDA6ug+8SjXkxKC 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 diff --git a/media/web_status.png b/media/web_status.png index 5957ee02d7b7fbe605e654d6d5d430c172b76fa0..0c37b96397c1f2797d51d8afa208b593613ade25 100644 GIT binary patch literal 49196 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 10" } @@ -59,62 +62,17 @@ } }, "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "string-width": "^4.1.0" } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -164,41 +122,41 @@ } }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" }, "engines": { "node": ">= 0.8" } }, "node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dependencies": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -225,9 +183,9 @@ } }, "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", "engines": { "node": ">= 0.8" } @@ -272,23 +230,29 @@ } }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chalk/node_modules/has-flag": { @@ -311,23 +275,23 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/ci-info": { @@ -370,6 +334,42 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -392,16 +392,35 @@ } }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -411,9 +430,9 @@ } }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { "node": ">= 0.6" } @@ -540,16 +559,16 @@ } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", "dependencies": { "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -563,13 +582,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -579,6 +598,30 @@ "node": ">= 0.10.0" } }, + "node_modules/express-sse": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/express-sse/-/express-sse-0.5.3.tgz", + "integrity": "sha512-DJF0nofFGq0IXJLGq95hfrryP3ZprVAVpyZUnmAk6QhHnm7zCzsHBNFP0i4FKFo2XjOf+JiYUKjT7jQhIeljpg==" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -659,14 +702,14 @@ } }, "node_modules/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dependencies": { - "ini": "1.3.7" + "ini": "2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -694,9 +737,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "node_modules/has-flag": { "version": "3.0.0", @@ -720,15 +763,15 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" @@ -767,14 +810,17 @@ } }, "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -823,9 +869,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -834,26 +880,29 @@ } }, "node_modules/is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { @@ -922,6 +971,17 @@ "node": ">=0.10.0" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -977,19 +1037,19 @@ } }, "node_modules/mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dependencies": { - "mime-db": "1.48.0" + "mime-db": "1.51.0" }, "engines": { "node": ">= 0.6" @@ -1033,21 +1093,21 @@ } }, "node_modules/nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "hasInstallScript": true, "dependencies": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "bin": { "nodemon": "bin/nodemon.js" @@ -1082,6 +1142,9 @@ }, "bin": { "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" } }, "node_modules/normalize-path": { @@ -1111,6 +1174,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1219,11 +1290,14 @@ } }, "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/range-parser": { @@ -1235,12 +1309,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -1262,10 +1336,15 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -1341,9 +1420,9 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", @@ -1352,9 +1431,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -1364,33 +1443,33 @@ } }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "node_modules/statuses": { "version": "1.5.0", @@ -1401,24 +1480,24 @@ } }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -1443,17 +1522,6 @@ "node": ">=4" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -1474,9 +1542,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -1493,11 +1561,14 @@ } }, "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { @@ -1521,12 +1592,9 @@ } }, "node_modules/undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dependencies": { - "debug": "^2.2.0" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, "node_modules/unique-string": { "version": "2.0.0", @@ -1548,31 +1616,46 @@ } }, "node_modules/update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dependencies": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -1611,6 +1694,22 @@ "node": ">=8" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -1627,6 +1726,26 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/ws": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -1634,13 +1753,18 @@ "engines": { "node": ">=8" } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } }, "dependencies": { "@msgpack/msgpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.0.tgz", - "integrity": "sha512-mlRYq9FSsOd4m+3wZWatemn3hGFZPWNJ4JQOdrir4rrMK2PyIk26idKBoUWrqF3HJJHl+5GpRU+M0wEruJwecg==" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.1.tgz", + "integrity": "sha512-ApwiSL2c9ObewdOE/sqt788P1C5lomBOHyO8nUBCr4ofErBCnYQ003NtJ8lS9OQZc11ximkbmgAZJjB8y6cCdA==" }, "@sindresorhus/is": { "version": "0.14.0", @@ -1670,52 +1794,17 @@ } }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -1750,35 +1839,35 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" } }, "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "requires": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" } }, "brace-expansion": { @@ -1799,9 +1888,9 @@ } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" }, "cacheable-request": { "version": "6.1.0", @@ -1833,14 +1922,14 @@ } }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==" }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1862,18 +1951,18 @@ } }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "ci-info": { @@ -1907,6 +1996,35 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1926,11 +2044,18 @@ } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "content-type": { @@ -1939,9 +2064,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "cookie-signature": { "version": "1.0.6", @@ -2041,16 +2166,16 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", "requires": { "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -2064,19 +2189,31 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, + "express-sse": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/express-sse/-/express-sse-0.5.3.tgz", + "integrity": "sha512-DJF0nofFGq0IXJLGq95hfrryP3ZprVAVpyZUnmAk6QhHnm7zCzsHBNFP0i4FKFo2XjOf+JiYUKjT7jQhIeljpg==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2132,11 +2269,11 @@ } }, "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "requires": { - "ini": "1.3.7" + "ini": "2.0.0" } }, "got": { @@ -2158,9 +2295,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "has-flag": { "version": "3.0.0", @@ -2178,15 +2315,15 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" } }, "iconv-lite": { @@ -2213,14 +2350,14 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" }, "ipaddr.js": { "version": "1.9.1", @@ -2254,26 +2391,26 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" }, "is-number": { "version": "7.0.0", @@ -2326,6 +2463,14 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2362,16 +2507,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "requires": { - "mime-db": "1.48.0" + "mime-db": "1.51.0" } }, "mimic-response": { @@ -2403,20 +2548,20 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "dependencies": { "debug": { @@ -2460,6 +2605,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2543,9 +2693,9 @@ } }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" }, "range-parser": { "version": "1.2.1", @@ -2553,12 +2703,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -2572,12 +2722,19 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + } } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } @@ -2637,9 +2794,9 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -2648,41 +2805,41 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" }, "dependencies": { "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "statuses": { "version": "1.5.0", @@ -2690,21 +2847,21 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-json-comments": { @@ -2720,11 +2877,6 @@ "has-flag": "^3.0.0" } }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -2739,9 +2891,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "touch": { "version": "3.1.0", @@ -2752,9 +2904,9 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" }, "type-is": { "version": "1.6.18", @@ -2774,12 +2926,9 @@ } }, "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "requires": { - "debug": "^2.2.0" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, "unique-string": { "version": "2.0.0", @@ -2795,23 +2944,34 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "url-parse-lax": { @@ -2840,6 +3000,16 @@ "string-width": "^4.0.0" } }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2856,10 +3026,21 @@ "typedarray-to-buffer": "^3.1.5" } }, + "ws": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "requires": {} + }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/mock-api/package.json b/mock-api/package.json index 709e219bc..34fcea305 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -11,8 +11,11 @@ "author": "proddy", "license": "ISC", "dependencies": { - "@msgpack/msgpack": "^2.7.0", - "express": "^4.17.1", - "nodemon": "^2.0.7" + "@msgpack/msgpack": "^2.7.1", + "compression": "^1.7.4", + "express": "^4.17.2", + "express-sse": "^0.5.3", + "nodemon": "^2.0.15", + "ws": "^8.4.2" } } diff --git a/mock-api/server.js b/mock-api/server.js index 36de77a7f..85d5f87f9 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -1,24 +1,27 @@ const express = require('express') +const compression = require('compression') +const SSE = require('express-sse') const path = require('path') const msgpack = require('@msgpack/msgpack') +const WebSocket = require('ws') // REST API -const app = express() -const port = process.env.PORT || 3080 +const rest_server = express() +const port = 3080 const REST_ENDPOINT_ROOT = '/rest/' -app.use(express.static(path.join(__dirname, '../interface/build'))) -app.use(express.json()) +rest_server.use(compression()) +rest_server.use(express.static(path.join(__dirname, '../interface/build'))) +rest_server.use(express.json()) -// ES API -const server = express() -const es_port = 3090 -const ES_ENDPOINT_ROOT = '/es/' +// API endpoint +const API_ENDPOINT_ROOT = '/api/' // LOG const LOG_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'logSettings' -const log_settings = { +log_settings = { level: 6, max_messages: 50, + compact: false, } const FETCH_LOG_ENDPOINT = REST_ENDPOINT_ROOT + 'fetchLog' @@ -73,7 +76,7 @@ const fetch_log = { const NTP_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'ntpStatus' const NTP_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'ntpSettings' const TIME_ENDPOINT = REST_ENDPOINT_ROOT + 'time' -const ntp_settings = { +ntp_settings = { enabled: true, server: 'time.google.com', tz_label: 'Europe/Amsterdam', @@ -90,13 +93,16 @@ const ntp_status = { // AP const AP_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'apSettings' const AP_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'apStatus' -const ap_settings = { +ap_settings = { provision_mode: 1, ssid: 'ems-esp', password: 'ems-esp-neo', local_ip: '192.168.4.1', gateway_ip: '192.168.4.1', subnet_mask: '255.255.255.0', + channel: 1, + ssid_hidden: true, + max_clients: 4, } const ap_status = { status: 1, @@ -110,7 +116,7 @@ const NETWORK_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'networkSettings' const NETWORK_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'networkStatus' const SCAN_NETWORKS_ENDPOINT = REST_ENDPOINT_ROOT + 'scanNetworks' const LIST_NETWORKS_ENDPOINT = REST_ENDPOINT_ROOT + 'listNetworks' -const network_settings = { +network_settings = { ssid: 'myWifi', password: 'myPassword', hostname: 'ems-esp', @@ -194,7 +200,7 @@ const list_networks = { // OTA const OTA_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'otaSettings' -const ota_settings = { +ota_settings = { enabled: true, port: 8266, password: 'ems-esp-neo', @@ -203,14 +209,14 @@ const ota_settings = { // MQTT const MQTT_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'mqttSettings' const MQTT_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'mqttStatus' -const mqtt_settings = { +mqtt_settings = { enabled: true, host: '192.168.1.4', port: 1883, - base: 'ems-esp32', + base: 'ems-esp', username: '', password: '', - client_id: 'ems-esp32', + client_id: 'ems-esp', keep_alive: 60, clean_session: true, max_topic_length: 128, @@ -222,15 +228,16 @@ const mqtt_settings = { publish_time_sensor: 10, mqtt_qos: 0, mqtt_retain: false, - ha_climate_format: 1, ha_enabled: true, nested_format: 1, + discovery_prefix: 'homeassistant', send_response: true, + publish_single: false, } const mqtt_status = { enabled: true, connected: true, - client_id: 'ems-esp32', + client_id: 'ems-esp', disconnect_reason: 0, mqtt_fails: 0, } @@ -246,7 +253,7 @@ const UPLOAD_FIRMWARE_ENDPOINT = REST_ENDPOINT_ROOT + 'uploadFirmware' const SIGN_IN_ENDPOINT = REST_ENDPOINT_ROOT + 'signIn' const GENERATE_TOKEN_ENDPOINT = REST_ENDPOINT_ROOT + 'generateToken' const system_status = { - emsesp_version: '3.x demo', + emsesp_version: '3.4.0demo', esp_platform: 'ESP32', max_alloc_heap: 113792, psram_size: 0, @@ -260,7 +267,7 @@ const system_status = { fs_used: 16384, uptime: '000+00:15:42.707', } -const security_settings = { +security_settings = { jwt_secret: 'naughty!', users: [ { username: 'admin', password: 'admin', admin: true }, @@ -283,16 +290,22 @@ const signin = { const generate_token = { token: '1234' } // EMS-ESP Project specific -const EMSESP_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'emsespSettings' -const EMSESP_DATA_ENDPOINT = REST_ENDPOINT_ROOT + 'data' +const EMSESP_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'settings' +const EMSESP_CORE_DATA_ENDPOINT = REST_ENDPOINT_ROOT + 'coreData' +const EMSESP_SENSOR_DATA_ENDPOINT = REST_ENDPOINT_ROOT + 'sensorData' +const EMSESP_DEVICES_ENDPOINT = REST_ENDPOINT_ROOT + 'devices' const EMSESP_SCANDEVICES_ENDPOINT = REST_ENDPOINT_ROOT + 'scanDevices' const EMSESP_DEVICEDATA_ENDPOINT = REST_ENDPOINT_ROOT + 'deviceData' -const EMSESP_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'emsespStatus' +const EMSESP_DEVICEENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'deviceEntities' +const EMSESP_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'status' const EMSESP_BOARDPROFILE_ENDPOINT = REST_ENDPOINT_ROOT + 'boardProfile' -const WRITE_VALUE_ENDPOINT = REST_ENDPOINT_ROOT + 'writeValue' -const WRITE_SENSOR_ENDPOINT = REST_ENDPOINT_ROOT + 'writeSensor' +const EMSESP_WRITE_VALUE_ENDPOINT = REST_ENDPOINT_ROOT + 'writeValue' +const EMSESP_WRITE_SENSOR_ENDPOINT = REST_ENDPOINT_ROOT + 'writeSensor' +const EMSESP_WRITE_ANALOG_ENDPOINT = REST_ENDPOINT_ROOT + 'writeAnalog' +const EMSESP_EXCLUDE_ENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'excludeEntities' +const EMSESP_RESET_CUSTOMIZATIONS_ENDPOINT = REST_ENDPOINT_ROOT + 'resetCustomizations' -emsesp_settings = { +settings = { tx_mode: 1, ems_bus_id: 11, syslog_enabled: false, @@ -307,65 +320,137 @@ emsesp_settings = { rx_gpio: 23, tx_gpio: 5, phy_type: 0, + eth_power: 0, + eth_phy_addr: 0, + eth_clock_mode: 0, dallas_gpio: 3, dallas_parasite: false, led_gpio: 2, hide_led: false, notoken_api: false, + readonly_mode: false, + low_clock: false, + telnet_enabled: true, analog_enabled: false, pbutton_gpio: 0, board_profile: 'S32', - dallas_format: 1, bool_format: 1, enum_format: 1, } -const emsesp_data = { + +const emsesp_devices = { devices: [ { i: 1, - t: 'Thermostat', - b: '', - n: 'RC20/Moduline 300', d: 23, p: 77, - v: '03.03', + s: 'Thermostat1', }, + { + i: 2, + d: 8, + p: 123, + s: 'Boiler', + }, + { + i: 4, + d: 16, + p: 165, + s: 'Thermostat2', + }, + ], +} + +const emsesp_coredata = { + devices: [ { i: 2, t: 'Boiler', + s: 'Boiler', b: 'Nefit', n: 'GBx72/Trendline/Cerapur/Greenstar Si/27i', d: 8, p: 123, v: '06.01', + e: 68, }, { - i: 3, - t: 'Controller', + i: 1, + t: 'Thermostat', + s: 'Thermostat1', b: '', - n: 'BC10', - d: 9, - p: 190, - v: '01.03', + n: 'RC20/Moduline 300', + d: 23, + p: 77, + v: '03.03', + e: 5, + }, + { + i: 4, + t: 'Thermostat', + s: 'Thermostat2', + b: 'Buderus', + n: 'RC100/Moduline 1000/1010', + d: 16, + p: 165, + v: '04.01', + e: 3, }, ], + active_sensors: 8, + analog_enabled: true, +} + +const emsesp_sensordata = { sensors: [ - { n: 1, i: '28-233D-9497-0C03', t: 25.7, o: 1.2 }, - { n: 2, i: '28-243D-7437-1E3A', t: 26.1, o: 0 }, + { is: '28-233D-9497-0C03', n: 'Dallas 1', t: 25.7, o: 1.2, u: 1 }, + { is: '28-243D-7437-1E3A', n: 'Dallas 2 outside', t: 26.1, o: 0, u: 1 }, + { is: '28-243E-7437-1E3B', n: 'Zolder', t: 27.1, o: 0, u: 16 }, + { is: '28-183D-1892-0C33', n: 'Roof', o: 2, u: 1 }, ], - analog: 12, + // sensors: [], + analogs: [ + { i: 36, n: 'motor', u: 0, o: 17, f: 0, t: 0 }, + { i: 37, n: 'External switch', v: 13, u: 0, o: 17, f: 0, t: 1 }, + { i: 39, n: 'Pulse count', v: 144, u: 0, o: 0, f: 0, t: 2 }, + { i: 40, n: 'Pressure', v: 16, u: 17, o: 0, f: 0, t: 3 }, + ], + // analogs: [], } -const emsesp_status = { - status: 0, - rx_received: 344, - tx_sent: 104, +const status = { + analog_fails: 0, + analog_quality: 100, + analog_reads: 203, + api_calls: 4, + api_fails: 0, + api_quality: 100, + mqtt_count: 40243, + mqtt_fails: 0, + mqtt_quality: 100, + num_analogs: 1, + num_devices: 2, + num_sensors: 1, + rx_fails: 11, rx_quality: 100, - tx_quality: 100, + rx_received: 56506, + sensor_fails: 0, + sensor_quality: 100, + sensor_reads: 15438, + status: 0, + tx_mode: 1, + tx_read_fails: 0, + tx_read_quality: 100, + tx_reads: 9026, + tx_write_fails: 2, + tx_write_quality: 95, + tx_writes: 33, + uptime: 77186, } +// Dashboard data const emsesp_devicedata_1 = { - type: 'Thermostat', + label: 'RC20/Moduline 300', data: [ { v: '(0)', @@ -401,272 +486,408 @@ const emsesp_devicedata_1 = { } const emsesp_devicedata_2 = { - type: 'Boiler', + label: 'Boiler: Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i', data: [ - { v: 'off', u: 0, n: 'heating active' }, - { v: 'off', u: 0, n: 'warm water active' }, + { u: 0, n: 'reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, + { v: 'false', u: 0, n: 'heating active' }, + { v: 'false', u: 0, n: 'tapwater active' }, { v: 5, u: 1, n: 'selected flow temperature', c: 'selflowtemp' }, - { v: 0, u: 2, n: 'burner selected max power', c: 'selburnpow' }, - { v: 0, u: 2, n: 'heating pump modulation' }, - { v: 42.9, u: 1, n: 'current flow temperature' }, - { v: 41.8, u: 1, n: 'return temperature' }, - { v: 1.6, u: 9, n: 'system pressure' }, - { v: 45, u: 1, n: 'actual boiler temperature' }, - { v: 'off', u: 0, n: 'gas' }, - { v: 0, u: 8, n: 'flame current' }, - { v: 'off', u: 0, n: 'heating pump' }, - { v: 'off', u: 0, n: 'fan' }, - { v: 'off', u: 0, n: 'ignition' }, - { - v: 'on', - u: 0, - n: 'heating activated', - c: 'heatingactivated', - l: ['off', 'on'], - }, - { v: 75, u: 1, n: 'heating temperature', c: 'heatingtemp' }, - { v: 90, u: 2, n: 'burner pump max power', c: 'pumpmodmax' }, - { v: 55, u: 2, n: 'burner pump min power', c: 'pumpmodmin' }, - { v: 1, u: 7, n: 'pump delay', c: 'pumpdelay' }, - { v: 10, u: 7, n: 'burner min period', c: 'burnminperiod' }, - { v: 0, u: 2, n: 'burner min power', c: 'burnminpower' }, - { v: 77, u: 2, n: 'burner max power', c: 'burnmaxpower' }, - { v: -6, u: 1, n: 'hysteresis on temperature', c: 'boilhyston' }, - { v: 6, u: 1, n: 'hysteresis off temperature', c: 'boilhystoff' }, - { v: 0, u: 2, n: 'burner current power' }, - { v: 317694, u: 16, n: 'burner starts' }, - { v: 524115, u: 7, n: 'total burner operating time' }, - { v: 424286, u: 7, n: 'total heat operating time' }, - { v: 4571225, u: 7, n: 'total UBA operating time' }, - { v: '1C(210) 06.06.2020 12:07', u: 0, n: 'last error code' }, + { v: 0, u: 3, n: 'burner selected max power', c: 'selburnpow' }, + { v: 0, u: 3, n: 'heating pump modulation' }, + { v: 53.4, u: 1, n: 'current flow temperature' }, + { v: 52.7, u: 1, n: 'return temperature' }, + { v: 1.3, u: 10, n: 'system pressure' }, + { v: 54.9, u: 1, n: 'actual boiler temperature' }, + { v: 'false', u: 0, n: 'gas' }, + { v: 'false', u: 0, n: 'gas stage 2' }, + { v: 0, u: 9, n: 'flame current' }, + { v: 'false', u: 0, n: 'heating pump' }, + { v: 'false', u: 0, n: 'fan' }, + { v: 'false', u: 0, n: 'ignition' }, + { v: 'false', u: 0, n: 'oil preheating' }, + { v: 'true', u: 0, n: 'heating activated', c: 'heatingactivated', l: ['off', 'on'] }, + { v: 80, u: 1, n: 'heating temperature', c: 'heatingtemp' }, + { v: 70, u: 3, n: 'burner pump max power', c: 'pumpmodmax' }, + { v: 30, u: 3, n: 'burner pump min power', c: 'pumpmodmin' }, + { v: 1, u: 8, n: 'pump delay', c: 'pumpdelay' }, + { v: 10, u: 8, n: 'burner min period', c: 'burnminperiod' }, + { v: 0, u: 3, n: 'burner min power', c: 'burnminpower' }, + { v: 50, u: 3, n: 'burner max power', c: 'burnmaxpower' }, + { v: -6, u: 2, n: 'hysteresis on temperature', c: 'boilhyston' }, + { v: 6, u: 2, n: 'hysteresis off temperature', c: 'boilhystoff' }, + { v: 0, u: 1, n: 'set flow temperature' }, + { v: 0, u: 3, n: 'burner set power' }, + { v: 0, u: 3, n: 'burner current power' }, + { v: 326323, u: 0, n: 'burner starts' }, + { v: 553437, u: 8, n: 'total burner operating time' }, + { v: 451286, u: 8, n: 'total heat operating time' }, + { v: 4672173, u: 8, n: 'total UBA operating time' }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', u: 0, n: 'last error code' }, { v: '0H', u: 0, n: 'service code' }, { v: 203, u: 0, n: 'service code number' }, - { v: ' ', u: 0, n: 'maintenance message' }, + { v: 'H00', u: 0, n: 'maintenance message' }, + { v: 'manual', u: 0, n: 'maintenance scheduled', c: 'maintenance', l: ['off', 'time', 'date', 'manual'] }, + { v: 6000, u: 7, n: 'time to next maintenance', c: 'maintenancetime' }, + { v: '01.01.2012', u: 0, n: 'next maintenance date', c: 'maintenancedate', o: 'Format: < dd.mm.yyyy >' }, + { v: 'true', u: 0, n: 'dhw turn on/off', c: 'wwtapactivated', l: ['off', 'on'] }, + { v: 62, u: 1, n: 'dhw set temperature' }, + { v: 60, u: 1, n: 'dhw selected temperature', c: 'wwseltemp' }, + { v: 'flow', u: 0, n: 'dhw type' }, + { v: 'hot', u: 0, n: 'dhw comfort', c: 'wwcomfort', l: ['hot', 'eco', 'intelligent'] }, + { v: 40, u: 2, n: 'dhw flow temperature offset', c: 'wwflowtempoffset' }, + { v: 100, u: 3, n: 'dhw max power', c: 'wwmaxpower' }, + { v: 'false', u: 0, n: 'dhw circulation pump available', c: 'wwcircpump', l: ['off', 'on'] }, + { v: '3-way valve', u: 0, n: 'dhw charging type' }, + { v: -5, u: 2, n: 'dhw hysteresis on temperature', c: 'wwhyston' }, + { v: 0, u: 2, n: 'dhw hysteresis off temperature', c: 'wwhystoff' }, + { v: 70, u: 1, n: 'dhw disinfection temperature', c: 'wwdisinfectiontemp' }, { v: 'off', u: 0, - n: 'maintenance scheduled', - c: 'maintenance', - l: ['off', 'time', 'date'], - }, - { v: 6000, u: 6, n: 'maintenance set time', c: 'maintenancetime' }, - { v: '01.01.2012', u: 0, n: 'maintenance set date', c: 'maintenancedate' }, - { v: 60, u: 1, n: 'ww selected temperature', c: 'wwseltemp' }, - { v: 62, u: 1, n: 'ww set temperature' }, - { v: 'flow', u: 0, n: 'ww type' }, - { - v: 'eco', - u: 0, - n: 'ww comfort', - c: 'wwcomfort', - l: ['hot', 'eco', 'intelligent'], - }, - { v: 40, u: 0, n: 'ww flow temperature offset', c: 'wwflowtempoffset' }, - { v: 100, u: 2, n: 'ww max power', c: 'wwmaxpower' }, - { - v: 'off', - u: 0, - n: 'ww circulation pump available', - c: 'wwcircpump', - l: ['off', 'on'], - }, - { v: '3-way valve', u: 0, n: 'ww charging type' }, - { v: -5, u: 1, n: 'ww hysteresis on temperature', c: 'wwhyston' }, - { v: 0, u: 1, n: 'ww hysteresis off temperature', c: 'wwhystoff' }, - { v: 70, u: 1, n: 'ww disinfection temperature', c: 'wwdisinfectiontemp' }, - { - v: 'off', - u: 0, - n: 'ww circulation pump frequency', + n: 'dhw circulation pump mode', c: 'wwcircmode', - l: [ - 'off', - '1x3min', - '2x3min', - '3x3min', - '4x3min', - '5x3min', - '6x3min', - 'continuous', - ], + l: ['off', '1x3min', '2x3min', '3x3min', '4x3min', '5x3min', '6x3min', 'continuous'], }, - { - v: 'off', - u: 0, - n: 'ww circulation active', - c: 'wwcirc', - l: ['off', 'on'], - }, - { v: 37.1, u: 1, n: 'ww current intern temperature' }, - { v: 0, u: 3, n: 'ww current tap water flow' }, - { v: 37.2, u: 1, n: 'ww storage intern temperature' }, - { v: 'on', u: 0, n: 'ww activated', c: 'wwactivated', l: ['off', 'on'] }, - { - v: 'off', - u: 0, - n: 'ww one time charging', - c: 'wwonetime', - l: ['off', 'on'], - }, - { - v: 'off', - u: 0, - n: 'ww disinfection', - c: 'wwdisinfect', - l: ['off', 'on'], - }, - { v: 'off', u: 0, n: 'ww charging' }, - { v: 'off', u: 0, n: 'ww recharging' }, - { v: 'on', u: 0, n: 'ww temperature ok' }, - { v: 'off', u: 0, n: 'ww active' }, - { v: 'on', u: 0, n: 'ww heating' }, - { v: 282323, u: 16, n: 'ww starts' }, - { v: 99829, u: 7, n: 'ww active time' }, + { v: 'false', u: 0, n: 'dhw circulation active', c: 'wwcirc', l: ['off', 'on'] }, + { v: 47.3, u: 1, n: 'dhw current intern temperature' }, + { v: 0, u: 4, n: 'dhw current tap water flow' }, + { v: 47.3, u: 1, n: 'dhw storage intern temperature' }, + { v: 'true', u: 0, n: 'dhw activated', c: 'wwactivated', l: ['off', 'on'] }, + { v: 'false', u: 0, n: 'dhw one time charging', c: 'wwonetime', l: ['off', 'on'] }, + { v: 'false', u: 0, n: 'dhw disinfecting', c: 'wwdisinfecting', l: ['off', 'on'] }, + { v: 'false', u: 0, n: 'dhw charging' }, + { v: 'false', u: 0, n: 'dhw recharging' }, + { v: 'true', u: 0, n: 'dhw temperature ok' }, + { v: 'false', u: 0, n: 'dhw active' }, + { v: 'true', u: 0, n: 'dhw 3way valve active' }, + { v: 0, u: 3, n: 'dhw set pump power' }, + { v: 288768, u: 0, n: 'dhw starts' }, + { v: 102151, u: 8, n: 'dhw active time' }, ], } -const emsesp_devicedata_3 = { - type: 'Controller', - data: [], +const emsesp_devicedata_4 = { + label: 'RC100/Moduline 1000/1010', + data: [ + { + v: 16, + u: 1, + n: 'hc2 selected room temperature', + c: 'hc2/seltemp', + x: false, + }, + { + v: 18.6, + u: 1, + n: 'hc2 current room temperature', + c: '', + x: true, + }, + { + v: 'off', + u: 0, + n: 'hc2 mode', + c: 'hc2/mode', + x: true, + }, + ], } +const emsesp_deviceentities_1 = [ + { + v: '(0)', + n: 'error code', + s: 'errorcode', + x: false, + i: 1, + }, + { + v: '14:54:39 06/06/2021', + n: 'date/time', + s: 'datetime', + x: false, + i: 2, + }, + { + v: 18.22, + n: 'hc1 selected room temperature', + s: 'hc1/seltemp', + x: false, + i: 3, + }, + { + v: 22.6, + n: 'hc1 current room temperature', + s: 'hc1/curtemp', + x: false, + i: 4, + }, + { + v: 'auto', + n: 'hc1 mode', + s: 'hc1/mode', + x: false, + i: 5, + }, +] + +const emsesp_deviceentities_2 = [ + { v: false, n: 'heating active', s: 'heatingactive', x: false, i: 1 }, + { v: false, n: 'tapwater active', s: 'tapwateractive', x: false, i: 2 }, + { v: 5, n: 'selected flow temperature', s: 'selflowtemp', x: false, i: 3 }, + { v: 0, n: 'burner selected max power', s: 'selburnpow', x: false, i: 4 }, + { v: 0, n: 'heating pump modulation', s: 'heatingpumpmod', x: false, i: 5 }, + { n: 'heating pump 2 modulation', s: 'heatingpump2mod', x: true, i: 6 }, + { n: 'outside temperature', s: 'outdoortemp', x: true, i: 7 }, + { v: 53, n: 'current flow temperature', s: 'curflowtemp', x: false, i: 8 }, + { v: 51.8, n: 'return temperature', s: 'rettemp', x: false, i: 9 }, + { n: 'mixing switch temperature', s: 'switchtemp', x: true, i: 10 }, + { v: 1.3, n: 'system pressure', s: 'syspress', x: false, i: 11 }, + { v: 54.6, n: 'actual boiler temperature', s: 'boiltemp', x: false, i: 12 }, + { n: 'exhaust temperature', s: 'exhausttemp', x: true, i: 13 }, + { v: false, n: 'gas', s: 'burngas', x: false, i: 14 }, + { v: false, n: 'gas stage 2', s: 'burngas2', x: false, i: 15 }, + { v: 0, n: 'flame current', s: 'flamecurr', x: false, i: 16 }, + { v: false, n: 'heating pump', s: 'heatingpump', x: false, i: 17 }, + { v: false, n: 'fan', s: 'fanwork', x: false, i: 18 }, + { v: false, n: 'ignition', s: 'ignwork', x: false, i: 19 }, + { v: false, n: 'oil preheating', s: 'oilpreheat', x: false, i: 20 }, + { v: true, n: 'heating activated', s: 'heatingactivated', x: false, i: 21 }, + { v: 80, n: 'heating temperature', s: 'heatingtemp', x: false, i: 22 }, + { v: 70, n: 'burner pump max power', s: 'pumpmodmax', x: false, i: 23 }, + { v: 30, n: 'burner pump min power', s: 'pumpmodmin', x: false, i: 24 }, + { v: 1, n: 'pump delay', s: 'pumpdelay', x: false, i: 25 }, + { v: 10, n: 'burner min period', s: 'burnminperiod', x: false, i: 26 }, + { v: 0, n: 'burner min power', s: 'burnminpower', x: false, i: 27 }, + { v: 50, n: 'burner max power', s: 'burnmaxpower', x: false, i: 28 }, + { v: -6, n: 'hysteresis on temperature', s: 'boilhyston', x: false, i: 29 }, + { v: 6, n: 'hysteresis off temperature', s: 'boilhystoff', x: false, i: 30 }, + { v: 0, n: 'set flow temperature', s: 'setflowtemp', x: false, i: 31 }, + { v: 0, n: 'burner set power', s: 'setburnpow', x: false, i: 32 }, + { v: 0, n: 'burner current power', s: 'curburnpow', x: false, i: 33 }, + { v: 326323, n: 'burner starts', s: 'burnstarts', x: false, i: 34 }, + { v: 553437, n: 'total burner operating time', s: 'burnworkmin', x: false, i: 35 }, + { v: 451286, n: 'total heat operating time', s: 'heatworkmin', x: false, i: 36 }, + { v: 4672175, n: 'total UBA operating time', s: 'ubauptime', x: false, i: 37 }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', n: 'last error code', s: 'lastcode', x: false, i: 38 }, + { v: '0H', n: 'service code', s: 'servicecode', x: false, i: 39 }, + { v: 203, n: 'service code number', s: 'servicecodenumber', x: false, i: 40 }, + { v: 'H00', n: 'maintenance message', s: 'maintenancemessage', x: false, i: 41 }, + { v: 'manual', n: 'maintenance scheduled', s: 'maintenance', x: false, i: 42 }, + { v: 6000, n: 'time to next maintenance', s: 'maintenancetime', x: false, i: 43 }, + { v: '01.01.2012', n: 'next maintenance date', s: 'maintenancedate', x: false, i: 44 }, + { v: true, n: 'dhw turn on/off', s: 'wwtapactivated', x: false, i: 45 }, + { v: 62, n: 'dhw set temperature', s: 'wwsettemp', x: false, i: 46 }, + { v: 60, n: 'dhw selected temperature', s: 'wwseltemp', x: false, i: 47 }, + { n: 'dhw selected lower temperature', s: 'wwseltemplow', x: true, i: 48 }, + { n: 'dhw selected temperature for off', s: 'wwseltempoff', x: true, i: 49 }, + { n: 'dhw single charge temperature', s: 'wwseltempsingle', x: true, i: 50 }, + { v: 'flow', n: 'dhw type', s: 'wwtype', x: false, i: 51 }, + { v: 'hot', n: 'dhw comfort', s: 'wwcomfort', x: false, i: 52 }, + { v: 40, n: 'dhw flow temperature offset', s: 'wwflowtempoffset', x: false, i: 53 }, + { v: 100, n: 'dhw max power', s: 'wwmaxpower', x: false, i: 54 }, + { v: false, n: 'dhw circulation pump available', s: 'wwcircpump', x: false, i: 55 }, + { v: '3-way valve', n: 'dhw charging type', s: 'wwchargetype', x: false, i: 56 }, + { v: -5, n: 'dhw hysteresis on temperature', s: 'wwhyston', x: false, i: 57 }, + { v: 0, n: 'dhw hysteresis off temperature', s: 'wwhystoff', x: false, i: 58 }, + { v: 70, n: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', x: false, i: 59 }, + { v: 'off', n: 'dhw circulation pump mode', s: 'wwcircmode', x: false, i: 60 }, + { v: false, n: 'dhw circulation active', s: 'wwcirc', x: false, i: 61 }, + { v: 46.4, n: 'dhw current intern temperature', s: 'wwcurtemp', x: false, i: 62 }, + { n: 'dhw current extern temperature', s: 'wwcurtemp2', x: true, i: 63 }, + { v: 0, n: 'dhw current tap water flow', s: 'wwcurflow', x: false, i: 64 }, + { v: 46.3, n: 'dhw storage intern temperature', s: 'wwstoragetemp1', x: false, i: 65 }, + { n: 'dhw storage extern temperature', s: 'wwstoragetemp2', x: true, i: 66 }, + { v: true, n: 'dhw activated', s: 'wwactivated', x: false, i: 67 }, + { v: false, n: 'dhw one time charging', s: 'wwonetime', x: false, i: 68 }, + { v: false, n: 'dhw disinfecting', s: 'wwdisinfecting', x: false, i: 69 }, + { v: false, n: 'dhw charging', s: 'wwcharging', x: false, i: 70 }, + { v: false, n: 'dhw recharging', s: 'wwrecharging', x: false, i: 71 }, + { v: true, n: 'dhw temperature ok', s: 'wwtempok', x: false, i: 72 }, + { v: false, n: 'dhw active', s: 'wwactive', x: false, i: 73 }, + { v: true, n: 'dhw 3way valve active', s: 'ww3wayvalve', x: false, i: 74 }, + { v: 0, n: 'dhw set pump power', s: 'wwsetpumppower', x: false, i: 75 }, + { n: 'dhw mixer temperature', s: 'wwmixertemp', x: true, i: 76 }, + { n: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', x: true, i: 77 }, + { v: 288768, n: 'dhw starts', s: 'wwstarts', x: false, i: 78 }, + { v: 102151, n: 'dhw active time', s: 'wwworkm', x: false, i: 79 }, +] + +const emsesp_deviceentities_4 = [ + { + v: 16, + n: 'hc2 selected room temperature', + s: 'hc2/seltemp', + x: false, + i: 1, + }, + { + n: 'hc2 current room temperature', + s: 'hc2/curtemp', + x: true, + i: 2, + }, + { + v: 'off', + n: 'hc2 mode', + s: 'hc2/mode', + x: true, + i: 3, + }, +] + // LOG -app.get(FETCH_LOG_ENDPOINT, (req, res) => { +rest_server.get(FETCH_LOG_ENDPOINT, (req, res) => { const encoded = msgpack.encode(fetch_log) res.write(encoded, 'binary') res.end(null, 'binary') }) -app.get(LOG_SETTINGS_ENDPOINT, (req, res) => { - console.log( - 'Fetching log settings ' + - log_settings.level + - ',' + - log_settings.max_messages, - ) +rest_server.get(LOG_SETTINGS_ENDPOINT, (req, res) => { res.json(log_settings) }) -app.post(LOG_SETTINGS_ENDPOINT, (req, res) => { - console.log( - 'Setting new level=' + - req.body.level + - ' max_messages=' + - req.body.max_messages, - ) - res.sendStatus(200) +rest_server.post(LOG_SETTINGS_ENDPOINT, (req, res) => { + log_settings = req.body + console.log(JSON.stringify(log_settings)) + res.json(log_settings) }) // NETWORK -app.get(NETWORK_STATUS_ENDPOINT, (req, res) => { +rest_server.get(NETWORK_STATUS_ENDPOINT, (req, res) => { res.json(network_status) }) -app.get(NETWORK_SETTINGS_ENDPOINT, (req, res) => { +rest_server.get(NETWORK_SETTINGS_ENDPOINT, (req, res) => { res.json(network_settings) }) -app.post(NETWORK_SETTINGS_ENDPOINT, (req, res) => { +rest_server.post(NETWORK_SETTINGS_ENDPOINT, (req, res) => { + network_settings = req.body + console.log(JSON.stringify(network_settings)) res.json(network_settings) }) -app.get(LIST_NETWORKS_ENDPOINT, (req, res) => { +rest_server.get(LIST_NETWORKS_ENDPOINT, (req, res) => { res.json(list_networks) }) -app.get(SCAN_NETWORKS_ENDPOINT, (req, res) => { +rest_server.get(SCAN_NETWORKS_ENDPOINT, (req, res) => { res.sendStatus(202) }) // AP -app.get(AP_SETTINGS_ENDPOINT, (req, res) => { +rest_server.get(AP_SETTINGS_ENDPOINT, (req, res) => { res.json(ap_settings) }) -app.get(AP_STATUS_ENDPOINT, (req, res) => { +rest_server.get(AP_STATUS_ENDPOINT, (req, res) => { res.json(ap_status) }) -app.post(AP_SETTINGS_ENDPOINT, (req, res) => { +rest_server.post(AP_SETTINGS_ENDPOINT, (req, res) => { + ap_status = req.body + console.log(JSON.stringify(ap_settings)) res.json(ap_settings) }) // OTA -app.get(OTA_SETTINGS_ENDPOINT, (req, res) => { +rest_server.get(OTA_SETTINGS_ENDPOINT, (req, res) => { res.json(ota_settings) }) -app.post(OTA_SETTINGS_ENDPOINT, (req, res) => { +rest_server.post(OTA_SETTINGS_ENDPOINT, (req, res) => { + ota_settings = req.body + console.log(JSON.stringify(ota_settings)) res.json(ota_settings) }) // MQTT -app.get(MQTT_SETTINGS_ENDPOINT, (req, res) => { +rest_server.get(MQTT_SETTINGS_ENDPOINT, (req, res) => { res.json(mqtt_settings) }) -app.post(MQTT_SETTINGS_ENDPOINT, (req, res) => { +rest_server.post(MQTT_SETTINGS_ENDPOINT, (req, res) => { + mqtt_settings = req.body + console.log(JSON.stringify(mqtt_settings)) res.json(mqtt_settings) }) -app.get(MQTT_STATUS_ENDPOINT, (req, res) => { +rest_server.get(MQTT_STATUS_ENDPOINT, (req, res) => { res.json(mqtt_status) }) // NTP -app.get(NTP_SETTINGS_ENDPOINT, (req, res) => { +rest_server.get(NTP_SETTINGS_ENDPOINT, (req, res) => { res.json(ntp_settings) }) -app.post(NTP_SETTINGS_ENDPOINT, (req, res) => { +rest_server.post(NTP_SETTINGS_ENDPOINT, (req, res) => { + ntp_settings = req.body + console.log(JSON.stringify(ntp_settings)) res.json(ntp_settings) }) -app.get(NTP_STATUS_ENDPOINT, (req, res) => { +rest_server.get(NTP_STATUS_ENDPOINT, (req, res) => { res.json(ntp_status) }) -app.post(TIME_ENDPOINT, (req, res) => { +rest_server.post(TIME_ENDPOINT, (req, res) => { res.sendStatus(200) }) // SYSTEM -app.get(SYSTEM_STATUS_ENDPOINT, (req, res) => { +rest_server.get(SYSTEM_STATUS_ENDPOINT, (req, res) => { res.json(system_status) }) -app.get(SECURITY_SETTINGS_ENDPOINT, (req, res) => { +rest_server.get(SECURITY_SETTINGS_ENDPOINT, (req, res) => { res.json(security_settings) }) -app.post(SECURITY_SETTINGS_ENDPOINT, (req, res) => { +rest_server.post(SECURITY_SETTINGS_ENDPOINT, (req, res) => { + security_settings = req.body + console.log(JSON.stringify(security_settings)) res.json(security_settings) }) -app.get(FEATURES_ENDPOINT, (req, res) => { +rest_server.get(FEATURES_ENDPOINT, (req, res) => { res.json(features) }) -app.get(VERIFY_AUTHORIZATION_ENDPOINT, (req, res) => { +rest_server.get(VERIFY_AUTHORIZATION_ENDPOINT, (req, res) => { res.json(verify_authentication) }) -app.post(RESTART_ENDPOINT, (req, res) => { +rest_server.post(RESTART_ENDPOINT, (req, res) => { res.sendStatus(200) }) -app.post(FACTORY_RESET_ENDPOINT, (req, res) => { +rest_server.post(FACTORY_RESET_ENDPOINT, (req, res) => { res.sendStatus(200) }) -app.post(UPLOAD_FIRMWARE_ENDPOINT, (req, res) => { +rest_server.post(UPLOAD_FIRMWARE_ENDPOINT, (req, res) => { res.sendStatus(200) }) -app.post(SIGN_IN_ENDPOINT, (req, res) => { +rest_server.post(SIGN_IN_ENDPOINT, (req, res) => { res.json(signin) }) -app.get(GENERATE_TOKEN_ENDPOINT, (req, res) => { +rest_server.get(GENERATE_TOKEN_ENDPOINT, (req, res) => { res.json(generate_token) }) // EMS-ESP Project stuff -app.get(EMSESP_SETTINGS_ENDPOINT, (req, res) => { - res.json(emsesp_settings) -}) -app.post(EMSESP_SETTINGS_ENDPOINT, (req, res) => { - console.log(req.body) - emsesp_settings = req.body - res.json(emsesp_settings) -}) -app.get(EMSESP_DATA_ENDPOINT, (req, res) => { - res.json(emsesp_data) -}) -app.post(EMSESP_SCANDEVICES_ENDPOINT, (req, res) => { +rest_server.post(EMSESP_RESET_CUSTOMIZATIONS_ENDPOINT, (req, res) => { + console.log('Removing all customizations...') res.sendStatus(200) }) -app.get(EMSESP_STATUS_ENDPOINT, (req, res) => { - res.json(emsesp_status) +rest_server.get(EMSESP_SETTINGS_ENDPOINT, (req, res) => { + console.log('Get settings: ' + JSON.stringify(settings)) + res.json(settings) }) -app.post(EMSESP_DEVICEDATA_ENDPOINT, (req, res) => { +rest_server.post(EMSESP_SETTINGS_ENDPOINT, (req, res) => { + settings = req.body + console.log('Write settings: ' + JSON.stringify(settings)) + res.status(202).json(settings) // restart needed + // res.status(200).json(settings); // no restart needed +}) +rest_server.get(EMSESP_CORE_DATA_ENDPOINT, (req, res) => { + res.json(emsesp_coredata) +}) +rest_server.get(EMSESP_SENSOR_DATA_ENDPOINT, (req, res) => { + res.json(emsesp_sensordata) +}) +rest_server.get(EMSESP_DEVICES_ENDPOINT, (req, res) => { + res.json(emsesp_devices) +}) +rest_server.post(EMSESP_SCANDEVICES_ENDPOINT, (req, res) => { + console.log('Scan devices...') + res.sendStatus(200) +}) +rest_server.get(EMSESP_STATUS_ENDPOINT, (req, res) => { + res.json(status) +}) +rest_server.post(EMSESP_DEVICEDATA_ENDPOINT, (req, res) => { const id = req.body.id if (id === 1) { const encoded = msgpack.encode(emsesp_devicedata_1) @@ -678,39 +899,113 @@ app.post(EMSESP_DEVICEDATA_ENDPOINT, (req, res) => { res.write(encoded, 'binary') res.end(null, 'binary') } - if (id === 3) { - const encoded = msgpack.encode(emsesp_devicedata_3) + if (id === 4) { + const encoded = msgpack.encode(emsesp_devicedata_4) res.write(encoded, 'binary') res.end(null, 'binary') } }) -app.post(WRITE_VALUE_ENDPOINT, (req, res) => { +rest_server.post(EMSESP_DEVICEENTITIES_ENDPOINT, (req, res) => { + const id = req.body.id + if (id === 1) { + const encoded = msgpack.encode(emsesp_deviceentities_1) + res.write(encoded, 'binary') + res.end(null, 'binary') + } + if (id === 2) { + const encoded = msgpack.encode(emsesp_deviceentities_2) + res.write(encoded, 'binary') + res.end(null, 'binary') + } + if (id === 4) { + const encoded = msgpack.encode(emsesp_deviceentities_4) + res.write(encoded, 'binary') + res.end(null, 'binary') + } +}) + +rest_server.post(EMSESP_EXCLUDE_ENTITIES_ENDPOINT, (req, res) => { + console.log('exclude list for productid ' + req.body.product_id + ' device_id ' + req.body.device_id + ' entities:') + console.log(req.body.entity_ids) + res.sendStatus(200) +}) + +rest_server.post(EMSESP_WRITE_VALUE_ENDPOINT, (req, res) => { const devicevalue = req.body.devicevalue const id = req.body.id - console.log(id) - console.log(devicevalue) + if (id === 1) { + console.log('Write device value for Thermostat: ' + JSON.stringify(devicevalue)) + objIndex = emsesp_devicedata_1.data.findIndex((obj) => obj.c == devicevalue.c) + emsesp_devicedata_1.data[objIndex] = devicevalue + } + if (id === 2) { + console.log('Write device value for Boiler: ' + JSON.stringify(devicevalue)) + objIndex = emsesp_devicedata_2.data.findIndex((obj) => obj.c == devicevalue.c) + emsesp_devicedata_2.data[objIndex] = devicevalue + } + if (id === 4) { + console.log('Write device value for Thermostat2: ' + JSON.stringify(devicevalue)) + objIndex = emsesp_devicedata_4.data.findIndex((obj) => obj.c == devicevalue.c) + emsesp_devicedata_4.data[objIndex] = devicevalue + } res.sendStatus(200) }) -app.post(WRITE_SENSOR_ENDPOINT, (req, res) => { - const sensor = req.body.sensor - console.log(sensor) +rest_server.post(EMSESP_WRITE_SENSOR_ENDPOINT, (req, res) => { + const sensor = req.body + console.log('Write sensor: ' + JSON.stringify(sensor)) + objIndex = emsesp_sensordata.sensors.findIndex((obj) => obj.is == sensor.id_str) + emsesp_sensordata.sensors[objIndex].n = sensor.name + emsesp_sensordata.sensors[objIndex].o = sensor.offset + res.sendStatus(200) +}) + +rest_server.post(EMSESP_WRITE_ANALOG_ENDPOINT, (req, res) => { + const analog = req.body + console.log('Write analog: ' + JSON.stringify(analog)) + objIndex = emsesp_sensordata.analogs.findIndex((obj) => obj.i == analog.id) + + if (objIndex === -1) { + console.log('new analog') + emsesp_sensordata.analogs.push({ + i: analog.id, + n: analog.name, + f: analog.factor, + o: analog.offset, + u: analog.uom, + t: analog.type, + }) + } else { + if (analog.type === -1) { + console.log('removing analog ' + analog.id) + emsesp_sensordata.analogs[objIndex].t = -1 + } else { + emsesp_sensordata.analogs[objIndex].n = analog.name + emsesp_sensordata.analogs[objIndex].o = analog.offset + emsesp_sensordata.analogs[objIndex].f = analog.factor + emsesp_sensordata.analogs[objIndex].u = analog.uom + emsesp_sensordata.analogs[objIndex].t = analog.type + } + } res.sendStatus(200) }) -app.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { - const board_profile = req.body.code +rest_server.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { + const board_profile = req.body.board_profile const data = { - led_gpio: 1, - dallas_gpio: 2, - rx_gpio: 3, - tx_gpio: 4, - pbutton_gpio: 5, - phy_type: 0, + led_gpio: settings.led_gpio, + dallas_gpio: settings.dallas_gpio, + rx_gpio: settings.rx_gpio, + tx_gpio: settings.tx_gpio, + pbutton_gpio: settings.pbutton_gpio, + phy_type: settings.phy_type, + eth_power: settings.eth_power, + eth_phy_addr: settings.eth_phy_addr, + eth_clock_mode: settings.eth_clock_mode, } if (board_profile == 'S32') { @@ -721,6 +1016,9 @@ app.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { data.tx_gpio = 5 data.pbutton_gpio = 0 data.phy_type = 0 + data.eth_power = 0 + data.eth_phy_addr = 0 + data.eth_clock_mode = 0 } else if (board_profile == 'E32') { // BBQKees Gateway E32 data.led_gpio = 2 @@ -729,6 +1027,9 @@ app.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { data.tx_gpio = 17 data.pbutton_gpio = 33 data.phy_type = 1 + data.eth_power = 16 + data.eth_phy_addr = 1 + data.eth_clock_mode = 0 } else if (board_profile == 'MH-ET') { // MH-ET Live D1 Mini data.led_gpio = 2 @@ -737,6 +1038,9 @@ app.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { data.tx_gpio = 5 data.pbutton_gpio = 0 data.phy_type = 0 + data.eth_power = 0 + data.eth_phy_addr = 0 + data.eth_clock_mode = 0 } else if (board_profile == 'NODEMCU') { // NodeMCU 32S data.led_gpio = 2 @@ -745,6 +1049,9 @@ app.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { data.tx_gpio = 5 data.pbutton_gpio = 0 data.phy_type = 0 + data.eth_power = 0 + data.eth_phy_addr = 0 + data.eth_clock_mode = 0 } else if (board_profile == 'LOLIN') { // Lolin D32 data.led_gpio = 2 @@ -753,6 +1060,9 @@ app.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { data.tx_gpio = 16 data.pbutton_gpio = 0 data.phy_type = 0 + data.eth_power = 0 + data.eth_phy_addr = 0 + data.eth_clock_mode = 0 } else if (board_profile == 'OLIMEX') { // Olimex ESP32-EVB (uses U1TXD/U1RXD/BUTTON, no LED or Dallas) data.led_gpio = 0 @@ -761,66 +1071,179 @@ app.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { data.tx_gpio = 4 data.pbutton_gpio = 34 data.phy_type = 1 + data.eth_power = -1 + data.eth_phy_addr = 0 + data.eth_clock_mode = 0 + } else if (board_profile == 'OLIMEXPOE') { + // Olimex ESP32-POE + data.led_gpio = 0 + data.dallas_gpio = 0 + data.rx_gpio = 36 + data.tx_gpio = 4 + data.pbutton_gpio = 34 + data.phy_type = 1 + data.eth_power = 12 + data.eth_phy_addr = 0 + data.eth_clock_mode = 3 } - res.json(data) + console.log('boardProfile POST. Sending back, profile: ' + board_profile + ', ' + 'data: ' + JSON.stringify(data)) + + res.send(data) }) -// create helper middleware so we can reuse server-sent events -const useServerSentEventsMiddleware = (req, res, next) => { +// EMS-ESP API specific +const emsesp_info = { + System: { + version: '3.x.x', + uptime: '001+06:40:34.018', + 'uptime (seconds)': 110434, + freemem: 131, + 'reset reason': 'Software reset CPU / Software reset CPU', + 'Dallas sensors': 3, + }, + Network: { + connection: 'Wired', + hostname: 'ems-esp', + MAC: 'A8:03:2A:62:64:CF', + 'IPv4 address': '192.168.1.134/255.255.255.0', + 'IPv4 gateway': '192.168.1.1', + 'IPv4 nameserver': '192.168.1.1', + }, + Status: { + 'bus status': 'connected', + 'bus protocol': 'Buderus', + 'telegrams received': 84986, + 'read requests sent': 14748, + 'write requests sent': 3, + 'incomplete telegrams': 8, + 'tx fails': 0, + 'rx line quality': 100, + 'tx line quality': 100, + MQTT: 'connected', + 'MQTT publishes': 46336, + 'MQTT publish fails': 0, + 'Dallas reads': 22086, + 'Dallas fails': 0, + }, + Devices: [ + { + type: 'Boiler', + name: 'Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i (DeviceID:0x08 ProductID:123, Version:06.01)', + handlers: + '0x10 0x11 0xC2 0x14 0x15 0x1C 0x18 0x19 0x1A 0x35 0x16 0x33 0x34 0x26 0x2A 0xD1 0xE3 0xE4 0xE5 0xE6 0xE9 0xEA', + }, + { + type: 'Thermostat', + name: 'RC20/Moduline 300 (DeviceID:0x17, ProductID:77, Version:03.03)', + handlers: '0xA3 0x06 0xA2 0x12 0x91 0xA8', + }, + ], +} + +rest_server.post(API_ENDPOINT_ROOT, (req, res) => { + console.log('Generic API POST') + console.log(req.body) + if (req.body.device === 'system') { + if (req.body.entity === 'info') { + console.log('sending system info: ' + JSON.stringify(emsesp_info)) + } else if (req.body.entity === 'settings') { + console.log('sending system settings: ' + JSON.stringify(settings)) + res.json(settings) + } else { + res.sendStatus(200) + } + } else { + res.sendStatus(200) + } +}) +rest_server.get(API_ENDPOINT_ROOT, (req, res) => { + console.log('Generic API GET') + res.sendStatus(200) +}) + +const SYSTEM_INFO_ENDPOINT = API_ENDPOINT_ROOT + 'system/info' +rest_server.post(SYSTEM_INFO_ENDPOINT, (req, res) => { + console.log('System Info POST: ' + JSON.stringify(req.body)) + res.sendStatus(200) +}) +rest_server.get(SYSTEM_INFO_ENDPOINT, (req, res) => { + console.log('System Info GET') + res.json(emsesp_info) +}) + +const SYSTEM_SETTINGS_ENDPOINT = API_ENDPOINT_ROOT + 'system/settings' +rest_server.post(SYSTEM_SETTINGS_ENDPOINT, (req, res) => { + console.log('System Settings POST: ' + JSON.stringify(req.body)) + res.sendStatus(200) +}) +rest_server.get(SYSTEM_SETTINGS_ENDPOINT, (req, res) => { + console.log('System Settings GET') + res.json(settings) +}) + +// start server +const expressServer = rest_server.listen(port, () => + console.log(`Mock server for EMS-ESP is up and running at http://localhost:${port}`), +) +console.log(`EMS-ESP Rest API listening to http://localhost:${port}/api`) + +// start websocket server +const websocketServer = new WebSocket.Server({ + noServer: true, + path: '/ws', +}) +console.log('WebSocket server is listening to /ws') + +expressServer.on('upgrade', (request, socket, head) => { + websocketServer.handleUpgrade(request, socket, head, (websocket) => { + websocketServer.emit('connection', websocket, request) + }) +}) + +websocketServer.on('connection', function connection(websocketConnection, connectionRequest) { + const [_path, params] = connectionRequest?.url?.split('?') + console.log(params) + + websocketConnection.on('message', (message) => { + const parsedMessage = JSON.parse(message) + console.log(parsedMessage) + }) +}) + +var count = 8 +var log_index = 0 +const ES_ENDPOINT_ROOT = '/es/' +const ES_LOG_ENDPOINT = ES_ENDPOINT_ROOT + 'log' +rest_server.get(ES_LOG_ENDPOINT, function (req, res) { res.setHeader('Content-Type', 'text/event-stream') res.setHeader('Cache-Control', 'no-cache') - - // only if you want anyone to access this endpoint res.setHeader('Access-Control-Allow-Origin', '*') - + res.setHeader('Connection', 'keep-alive') + // res.setHeader('Content-Encoding', 'deflate') + // res.setHeader('X-Accel-Buffering', 'no') res.flushHeaders() - const sendEventStreamData = (data) => { - const sseFormattedResponse = `data: ${JSON.stringify(data)}\n\n` - res.write(sseFormattedResponse) - } - - // we are attaching sendEventStreamData to res, so we can use it later - Object.assign(res, { - sendEventStreamData, - }) - - next() -} - -const streamLog = (req, res) => { - let interval = setInterval(function generateAndSendLog() { - count = count + 1 - + var timer = setInterval(function () { + count += 1 + log_index += 1 const data = { - time: '000+00:00:00.000', - level: 3, - name: 'system', - message: 'this is message #' + count, + t: '000+00:00:00.000', + l: 3, // error + i: count, + n: 'system', + m: 'incoming message #' + count + '/' + log_index, } + const sseFormattedResponse = `data: ${JSON.stringify(data)}\n\n` + // console.log('sending log #' + count) + res.write(sseFormattedResponse) + res.flush() // this is important - res.sendEventStreamData(data) + // if buffer full start over + if (log_index > 50) { + fetch_log.events = [] + log_index = 0 + } + fetch_log.events.push(data) // append to buffer }, 1000) - - res.on('close', () => { - clearInterval(interval) - res.end() - }) -} - -// event source, server-sent events SSE -const ES_LOG_ENDPOINT = ES_ENDPOINT_ROOT + 'log' -let count = 0 -server.get(ES_LOG_ENDPOINT, useServerSentEventsMiddleware, streamLog) -server.listen(es_port, () => - console.log( - `Mock EventSource server for EMS-ESP listening at http://localhost:${es_port}`, - ), -) - -// rest API -app.listen(port) -console.log( - `Mock RESTful API server for EMS-ESP is up and running at http://localhost:${port}`, -) +}) diff --git a/pio_local.ini_example b/pio_local.ini_example index 8d01020e6..9d7c4cd8d 100644 --- a/pio_local.ini_example +++ b/pio_local.ini_example @@ -2,24 +2,23 @@ [common] ; custom build flags -; EMSESP_DEBUG, EMSESP_UART_DEBUG, EMSESP_DEBUG_SENSOR, EMSESP_WIFI_TWEAK, EMSESP_DEFAULT_BOARD_PROFILE -; ; e.g. -DEMSESP_DEFAULT_BOARD_PROFILE=\"NODEMCU\" +; options are: EMSESP_DEBUG, EMSESP_UART_DEBUG, EMSESP_DEBUG_SENSOR, EMSESP_WIFI_TWEAK, EMSESP_DEFAULT_BOARD_PROFILE ; my_build_flags = -DEMSESP_DEBUG -DEMSESP_DEFAULT_BOARD_PROFILE=\"NODEMCU\" -my_build_flags = - -; 5=verbose, 4=debug, 3=info -debug_flags = -DCORE_DEBUG_LEVEL=5 +; my_build_flags = -DEMSESP_DEBUG_SENSOR +; my_build_flags = -DEMSESP_DEBUG -DEMSESP_USE_SERIAL +; my_build_flags = -DEMSESP_DEBUG -DCORE_DEBUG_LEVEL=5 ; 5=verbose, 4=debug, 3=info [env:esp32] ; if using OTA enter your details below -upload_protocol = espota -upload_flags = - --port=8266 - --auth=ems-esp-neo -upload_port = ems-esp.local +; upload_protocol = espota +; upload_flags = +; --port=8266 +; --auth=ems-esp-neo +; upload_port = ems-esp.local -; use this when you don't want to re-build the WebUI -extra_scripts = scripts/rename_fw.py +extra_scripts = + pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time + scripts/rename_fw.py ; pio run -e debug ; or from Visual Studio Code do PIO -> Project Tasks -> debug -> General -> Upload and Monitor diff --git a/platformio.ini b/platformio.ini index 002bf0dfa..1effc65e3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -28,6 +28,7 @@ build_flags = -D ONEWIRE_CRC16=0 -D NO_GLOBAL_ARDUINOOTA -D ARDUINOJSON_ENABLE_STD_STRING=1 + -D ARDUINOJSON_USE_DOUBLE=0 unbuild_flags = ${common.core_unbuild_flags} @@ -61,6 +62,9 @@ extra_scripts = scripts/rename_fw.py board = esp32dev platform = espressif32 +; platform_packages = +; toolchain-xtensa32@~2.80400.0 +; framework-arduinoespressif32@https://github.com/espressif/arduino-esp32.git board_build.partitions = esp32_partition_app1984k_spiffs64k.csv build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} diff --git a/scripts/api_test.http b/scripts/api_test.http new file mode 100644 index 000000000..de5d162c7 --- /dev/null +++ b/scripts/api_test.http @@ -0,0 +1,31 @@ +# testing EMS-ESP API +# use with https://marketplace.visualstudio.com/items?itemName=humao.rest-client + +@token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiYWRtaW4iOnRydWV9.2bHpWya2C7Q12WjNUBD6_7N3RCD7CMl-EGhyQVzFdDg + +GET http://ems-esp.local/api/system/info + +### + +GET http://ems-esp.local/api/thermostat/seltemp + +### + +POST http://ems-esp.local/api/thermostat/seltemp +Content-Type: application/json +Authorization: Bearer {{token}} + +{ + "value" : 21.0 +} + +### + +POST http://ems-esp.local/api/thermostat +Content-Type: application/json +Authorization: Bearer {{token}} + +{ + "entity" : "seltemp", + "value" : 21.0 +} diff --git a/scripts/bootloader_dio_40m.bin b/scripts/bootloader_dio_40m.bin index ac057886d985172a4c67cac4358fcc2846c2f7b4..3314163fc6295bf06588692fdec81e460361cc5f 100644 GIT binary patch delta 9573 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 diff --git a/scripts/build_interface.py b/scripts/build_interface.py old mode 100755 new mode 100644 index c46e5f0a0..80137780c --- a/scripts/build_interface.py +++ b/scripts/build_interface.py @@ -1,11 +1,17 @@ from pathlib import Path -from shutil import copytree -from shutil import rmtree +from shutil import copytree, rmtree, copyfileobj from subprocess import check_output, Popen, PIPE, STDOUT, CalledProcessError -from os import chdir +import os +import gzip Import("env") +def gzipFile(file): + with open(file, 'rb') as f_in: + with gzip.open(file + '.gz', 'wb') as f_out: + copyfileobj(f_in, f_out) + os.remove(file) + def flagExists(flag): buildFlags = env.ParseFlags(env["BUILD_FLAGS"]) for define in buildFlags.get("CPPDEFINES"): @@ -13,7 +19,7 @@ def flagExists(flag): return True def buildWeb(): - chdir("interface") + os.chdir("interface") print("Building interface with npm") try: env.Execute("npm install") @@ -22,10 +28,16 @@ def buildWeb(): wwwPath = Path("../data/www") if wwwPath.exists() and wwwPath.is_dir(): rmtree(wwwPath) + if not flagExists("PROGMEM_WWW"): + print("Copying interface to data directory") + copytree(buildPath, wwwPath) + for currentpath, folders, files in os.walk(wwwPath): + for file in files: + gzipFile(os.path.join(currentpath, file)) finally: - chdir("..") + os.chdir("..") if (len(BUILD_TARGETS) == 0 or "upload" in BUILD_TARGETS): buildWeb() else: - print("Skipping build interface step for target(s): " + ", ".join(BUILD_TARGETS)) + print("Skipping build interface step for target(s): " + ", ".join(BUILD_TARGETS)) \ No newline at end of file diff --git a/scripts/clang-format.py b/scripts/clang-format.py old mode 100755 new mode 100644 diff --git a/scripts/clang-tidy.py b/scripts/clang-tidy.py old mode 100755 new mode 100644 diff --git a/scripts/espota.py b/scripts/espota.py old mode 100755 new mode 100644 diff --git a/scripts/esptool.py b/scripts/esptool.py old mode 100755 new mode 100644 diff --git a/scripts/helpers.py b/scripts/helpers.py old mode 100755 new mode 100644 diff --git a/scripts/main_script.py b/scripts/main_script.py deleted file mode 100755 index b64a05069..000000000 --- a/scripts/main_script.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python -Import("env") - -class Color(object): - BLACK = '\x1b[1;30m' - RED = '\x1b[1;31m' - GREEN = '\x1b[1;32m' - YELLOW = '\x1b[1;33m' - BLUE = '\x1b[1;34m' - MAGENTA = '\x1b[1;35m' - CYAN = '\x1b[1;36m' - WHITE = '\x1b[1;37m' - LIGHT_GREY = '\x1b[0;30m' - LIGHT_RED = '\x1b[0;31m' - LIGHT_GREEN = '\x1b[0;32m' - LIGHT_YELLOW = '\x1b[0;33m' - LIGHT_BLUE = '\x1b[0;34m' - LIGHT_MAGENTA = '\x1b[0;35m' - LIGHT_CYAN = '\x1b[0;36m' - LIGHT_WHITE = '\x1b[0;37m' - - -def clr(color, text): - return color + str(text) + '\x1b[0m' - -def remove_float_support(): - flags = " ".join(env['LINKFLAGS']) - # print(clr(Color.BLUE, "LINKFLAGS = %ss" % flags)) - flags = flags.replace("-u _printf_float", "") - flags = flags.replace("-u _scanf_float", "") - newflags = flags.split() - - env.Replace( - LINKFLAGS=newflags - ) - -remove_float_support() diff --git a/scripts/rename_fw.py b/scripts/rename_fw.py old mode 100755 new mode 100644 diff --git a/scripts/upload_esp32.py b/scripts/upload_esp32.py old mode 100755 new mode 100644 diff --git a/scripts/upload_fw.py b/scripts/upload_fw.py deleted file mode 100755 index 84f03e4e8..000000000 --- a/scripts/upload_fw.py +++ /dev/null @@ -1,18 +0,0 @@ -# for calling dos upload from Window WSL2 Linux, because serial ports are not mapped yet -Import('env', "projenv") -from subprocess import call - -def upload(source, target, env): - - print("bin file: " + str(target[0])) - - # esp8266 or esp32 - platform = "esp" + env['PIOPLATFORM'].strip("espressif") - - if platform == 'esp8266': - call(["cmd.exe", "/c", "C:\\Users\\Paul\\Desktop\\ems-esp8266.bat"]) - - if platform == 'esp32': - call(["cmd.exe", "/c", "C:\\Users\\Paul\\Desktop\\ems-esp32.bat"]) - -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [upload]) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp new file mode 100644 index 000000000..85651df01 --- /dev/null +++ b/src/analogsensor.cpp @@ -0,0 +1,413 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "analogsensor.h" +#include "emsesp.h" + +namespace emsesp { + +uuid::log::Logger AnalogSensor::logger_{F_(analogsensor), uuid::log::Facility::DAEMON}; + +void AnalogSensor::start() { + reload(); // fetch the list of sensors from our customization service + + if (analog_enabled_) { + analogSetAttenuation(ADC_2_5db); // for all channels + } + + LOG_INFO(F("Starting Analog sensor service")); + + // Add API call for /info + Command::add( + EMSdevice::DeviceType::ANALOGSENSOR, + F_(info), + [&](const char * value, const int8_t id, JsonObject & output) { return command_info(value, id, output); }, + F_(info_cmd)); +} + +// load settings from the customization file, sorts them and initializes the GPIOs +void AnalogSensor::reload() { + EMSESP::webSettingsService.read([&](WebSettings & settings) { analog_enabled_ = settings.analog_enabled; }); + +#if defined(EMSESP_STANDALONE) + analog_enabled_ = true; // for local offline testing +#endif + + // load the list of analog sensors from the customization service + // and store them locally and then activate them + EMSESP::webCustomizationService.read([&](WebCustomization & settings) { + auto sensors = settings.analogCustomizations; + sensors_.clear(); // start with an empty list + if (sensors.size() != 0) { + for (auto & sensor : sensors) { + sensors_.emplace_back(sensor.id, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type); + sensors_.back().ha_registered = false; // this will trigger recrate of the HA config + } + } + return true; + }); + + // sort the list based on GPIO (id) + std::sort(sensors_.begin(), sensors_.end(), [](const Sensor & a, const Sensor & b) { return a.id() < b.id(); }); + + // activate each sensor + for (auto & sensor : sensors_) { + sensor.ha_registered = false; // force HA configs to be re-created + if (sensor.type() == AnalogType::ADC) { + LOG_DEBUG(F("Adding analog ADC sensor on GPIO%d"), sensor.id()); + // analogSetPinAttenuation does not work with analogReadMilliVolts + sensor.analog_ = 0; // initialize + sensor.last_reading_ = 0; + } else if (sensor.type() == AnalogType::COUNTER) { + LOG_DEBUG(F("Adding analog I/O Counter sensor on GPIO%d"), sensor.id()); + pinMode(sensor.id(), INPUT_PULLUP); + sensor.set_value(0); // reset count + sensor.set_uom(0); // no uom, just for safe measures + sensor.polltime_ = 0; + sensor.poll_ = digitalRead(sensor.id()); + publish_sensor(sensor); + } else if (sensor.type() == AnalogType::DIGITAL_IN) { + LOG_DEBUG(F("Adding analog Read sensor on GPIO%d"), sensor.id()); + pinMode(sensor.id(), INPUT_PULLUP); + sensor.set_value(digitalRead(sensor.id())); // initial value + sensor.set_uom(0); // no uom, just for safe measures + sensor.polltime_ = 0; + sensor.poll_ = digitalRead(sensor.id()); + publish_sensor(sensor); + } + } +} + +// measure and moving average adc +void AnalogSensor::measure() { + static uint32_t measure_last_ = 0; + + // measure interval 500ms for analog sensors + if (!measure_last_ || (uuid::get_uptime() - measure_last_) >= MEASURE_ANALOG_INTERVAL) { + measure_last_ = uuid::get_uptime(); + // go through the list of ADC sensors + for (auto & sensor : sensors_) { + if (sensor.type() == AnalogType::ADC) { + uint16_t a = analogReadMilliVolts(sensor.id()); // e.g. ADC1_CHANNEL_0_GPIO_NUM + if (!sensor.analog_) { // init first time + sensor.analog_ = a; + sensor.sum_ = a * 512; + } else { // simple moving average filter + sensor.sum_ = (sensor.sum_ * 511) / 512 + a; + sensor.analog_ = sensor.sum_ / 512; + } + // detect change with little hysteresis on raw mV value + if (sensor.last_reading_ + 1 < sensor.analog_ || sensor.last_reading_ > sensor.analog_ + 1) { + sensor.set_value(((int32_t)sensor.analog_ - sensor.offset()) * sensor.factor()); + sensor.last_reading_ = sensor.analog_; + sensorreads_++; + changed_ = true; + publish_sensor(sensor); + } + } + } + } + // poll digital io every time + // go through the list of digital sensors + for (auto & sensor : sensors_) { + if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::COUNTER) { + auto old_value = sensor.value(); // remember current value before reading + auto current_reading = digitalRead(sensor.id()); + if (sensor.poll_ != current_reading) { // check for pinchange + sensor.polltime_ = uuid::get_uptime(); + sensor.poll_ = current_reading; + } + if (uuid::get_uptime() - sensor.polltime_ >= 15) { // debounce + if (sensor.type() == AnalogType::DIGITAL_IN) { + sensor.set_value(sensor.poll_); + } else if (sensor.type() == AnalogType::COUNTER) { + // capture reading and compare with the last one to see if there is high/low change + if (sensor.poll_ != sensor.last_reading_) { + sensor.last_reading_ = sensor.poll_; + if (!sensor.poll_) { + sensor.set_value(old_value + 1); + } + } + } + // see if there is a change and increment # reads + if (old_value != sensor.value()) { + sensorreads_++; + changed_ = true; + publish_sensor(sensor); + } + } + } + } +} + +void AnalogSensor::loop() { + if (!analog_enabled_) { + return; + } + + measure(); // take the measurements +} + +// update analog information name and offset +bool AnalogSensor::update(uint8_t id, const std::string & name, uint16_t offset, float factor, uint8_t uom, int8_t type) { + boolean found_sensor = false; // see if we can find the sensor in our customization list + + EMSESP::webCustomizationService.update( + [&](WebCustomization & settings) { + for (auto & AnalogCustomization : settings.analogCustomizations) { + if (AnalogCustomization.id == id) { + found_sensor = true; // found the record + // see if it's marked for deletion + if (type == AnalogType::MARK_DELETED) { + LOG_DEBUG(F("Removing analog sensor ID %d"), id); + settings.analogCustomizations.remove(AnalogCustomization); + } else { + // update existing record + AnalogCustomization.name = name; + AnalogCustomization.offset = offset; + AnalogCustomization.factor = factor; + AnalogCustomization.uom = uom; + AnalogCustomization.type = type; + LOG_DEBUG(F("Customizing existing analog sensor ID %d"), id); + } + return StateUpdateResult::CHANGED; // persist the change + } + } + return StateUpdateResult::UNCHANGED; + }, + "local"); + + // if the sensor exists and we're using HA, delete the old HA record + if (found_sensor && Mqtt::ha_enabled()) { + remove_ha_topic(id); // id is the GPIO + } + + // we didn't find it, it's new, so create and store it + if (!found_sensor) { + EMSESP::webCustomizationService.update( + [&](WebCustomization & settings) { + AnalogCustomization newSensor = AnalogCustomization(); + newSensor.id = id; + newSensor.name = name; + newSensor.offset = offset; + newSensor.factor = factor; + newSensor.uom = uom; + newSensor.type = type; + settings.analogCustomizations.push_back(newSensor); + LOG_DEBUG(F("Adding new customization for analog sensor ID %d"), id); + return StateUpdateResult::CHANGED; // persist the change + }, + "local"); + } + + // reloads the sensors in the customizations file into the sensors list + reload(); + + return true; +} + +// check to see if values have been updated +bool AnalogSensor::updated_values() { + if (changed_) { + changed_ = false; + return true; + } + return false; +} + +// publish a single sensor to MQTT +void AnalogSensor::publish_sensor(Sensor sensor) { + if (Mqtt::publish_single()) { + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "%s/%s", read_flash_string(F_(analogsensor)).c_str(), sensor.name().c_str()); + char payload[10]; + Mqtt::publish(topic, Helpers::render_value(payload, sensor.value(), 2)); // always publish as floats + } +} + +// send empty config topic to remove the entry from HA +void AnalogSensor::remove_ha_topic(const uint8_t id) { + if (!Mqtt::ha_enabled()) { + return; + } +#ifdef EMSESP_DEBUG + LOG_DEBUG(F("Removing HA config for analog sensor ID %d"), id); +#endif + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%d/config", Mqtt::base().c_str(), id); + Mqtt::publish_ha(topic); +} + +// send all sensor values as a JSON package to MQTT +void AnalogSensor::publish_values(const bool force) { + uint8_t num_sensors = sensors_.size(); + + if (num_sensors == 0) { + return; + } + + if (force && Mqtt::publish_single()) { + for (const auto & sensor : sensors_) { + publish_sensor(sensor); + } + // return; + } + + DynamicJsonDocument doc(120 * num_sensors); + + for (auto & sensor : sensors_) { + if (sensor.type() != AnalogType::NOTUSED) { + if (Mqtt::is_nested() || Mqtt::ha_enabled()) { + // nested + char s[10]; + JsonObject dataSensor = doc.createNestedObject(Helpers::smallitoa(s, sensor.id())); + dataSensor["name"] = sensor.name(); + switch (sensor.type()) { + case AnalogType::COUNTER: + dataSensor["count"] = (uint16_t)sensor.value(); // convert to integer + break; + case AnalogType::ADC: + dataSensor["value"] = (float)sensor.value(); // float + break; + case AnalogType::DIGITAL_IN: + default: + dataSensor["value"] = (uint8_t)sensor.value(); // convert to char for 1 or 0 + break; + } + + // create HA config + if (Mqtt::ha_enabled()) { + if (!sensor.ha_registered || force) { + LOG_DEBUG(F("Recreating HA config for analog sensor ID %d"), sensor.id()); + + StaticJsonDocument config; + + char stat_t[50]; + snprintf(stat_t, sizeof(stat_t), "%s/analogsensor_data", Mqtt::base().c_str()); + config["stat_t"] = stat_t; + + char str[50]; + snprintf(str, sizeof(str), "{{value_json['%d'].value}}", sensor.id()); + config["val_tpl"] = str; + + snprintf(str, sizeof(str), "Analog Sensor %s", sensor.name().c_str()); + config["name"] = str; + + snprintf(str, sizeof(str), "analogsensor_%d", sensor.id()); + config["uniq_id"] = str; + + JsonObject dev = config.createNestedObject("dev"); + JsonArray ids = dev.createNestedArray("ids"); + ids.add("ems-esp"); + + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%d/config", Mqtt::base().c_str(), sensor.id()); + + Mqtt::publish_ha(topic, config.as()); + + sensor.ha_registered = true; + } + } + + } else { + // not nested + doc[sensor.name()] = sensor.value(); + } + } + + Mqtt::publish(F("analogsensor_data"), doc.as()); + } +} + +// called from emsesp.cpp, similar to the emsdevice->get_value_info +// searches by name +bool AnalogSensor::get_value_info(JsonObject & output, const char * cmd, const int8_t id) { + for (const auto & sensor : sensors_) { + if (strcmp(cmd, sensor.name().c_str()) == 0) { + output["id"] = sensor.id(); + output["name"] = sensor.name(); + output["type"] = sensor.type(); + output["uom"] = sensor.uom(); + output["offset"] = sensor.offset(); + output["factor"] = sensor.factor(); + output["value"] = sensor.value(); + return true; + } + } + return false; +} + +// creates JSON doc from values +// returns false if there are no sensors +bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject & output) { + if (sensors_.size() == 0) { + return false; + } + + for (const auto & sensor : sensors_) { + if (id == -1) { // show number and id + JsonObject dataSensor = output.createNestedObject(sensor.name()); + dataSensor["id"] = sensor.id(); + dataSensor["name"] = sensor.name(); + dataSensor["type"] = sensor.type(); + dataSensor["uom"] = sensor.uom(); + dataSensor["offset"] = sensor.offset(); + dataSensor["factor"] = sensor.factor(); + dataSensor["value"] = sensor.value(); + } else { + output[sensor.name()] = sensor.value(); + } + } + + return (output.size() > 0); +} + +// this creates the sensor, initializing everything +AnalogSensor::Sensor::Sensor(const uint8_t id, const std::string & name, const uint16_t offset, const float factor, const uint8_t uom, const int8_t type) + : id_(id) + , name_(name) + , offset_(offset) + , factor_(factor) + , uom_(uom) + , type_(type) { + value_ = 0; // init value to 0 always +} + +// returns name of the analog sensor or creates one if its empty +std::string AnalogSensor::Sensor::name() const { + if (name_.empty()) { + char name[50]; + snprintf(name, sizeof(name), "Analog Sensor GPIO%d", id_); + return name; + } + return name_; +} + +// hard coded tests +#ifdef EMSESP_DEBUG +void AnalogSensor::test() { + // Sensor(const uint8_t id, const std::string & name, const uint16_t offset, const float factor, const uint8_t uom, const int8_t type); + sensors_.emplace_back(36, "test12", 0, 0.1, 17, AnalogType::ADC); + sensors_.back().set_value(12.4); + + sensors_.emplace_back(37, "test13", 0, 0, 0, AnalogType::DIGITAL_IN); + sensors_.back().set_value(13); +} +#endif + +} // namespace emsesp diff --git a/src/analogsensor.h b/src/analogsensor.h new file mode 100644 index 000000000..e07191826 --- /dev/null +++ b/src/analogsensor.h @@ -0,0 +1,180 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef EMSESP_ANALOGSENSOR_H +#define EMSESP_ANALOGSENSOR_H + +#include "helpers.h" +#include "mqtt.h" +#include "console.h" + +#ifndef EMSESP_STANDALONE +#include "driver/adc.h" +#include +#endif + +#include + +namespace emsesp { + +class AnalogSensor { + public: + class Sensor { + public: + Sensor(const uint8_t id, const std::string & name, const uint16_t offset, const float factor, const uint8_t uom, const int8_t type); + ~Sensor() = default; + + void set_offset(const uint16_t offset) { + offset_ = offset; + } + + std::string name() const; + void set_name(const std::string & name) { + name_ = name; + } + + uint8_t id() const { + return id_; + } + + float value() const { + return value_; + } + + void set_value(float value) { + value_ = value; + } + + float factor() const { + return factor_; + } + + void set_factor(float factor) { + factor_ = factor; + } + + uint16_t offset() const { + return offset_; + } + + void set_uom(const uint8_t uom) { + uom_ = uom; + } + + uint8_t uom() const { + return uom_; + } + + int8_t type() const { + return type_; + } + + void set_type(int8_t type) { + type_ = type; + } + + bool ha_registered = false; + + uint16_t analog_ = 0; // ADC - average value + uint32_t sum_ = 0; // ADC - rolling sum + uint16_t last_reading_ = 0; // IO COUNTER & ADC - last reading + uint32_t polltime_ = 0; // digital IO & COUNTER debounce time + int poll_ = 0; + + private: + uint8_t id_; + std::string name_; + uint16_t offset_; + float factor_; + uint8_t uom_; + float value_; // float because of the factor is a float + int8_t type_; + }; + + AnalogSensor() = default; + ~AnalogSensor() = default; + + enum AnalogType : int8_t { + MARK_DELETED = -1, // mark for deletion + NOTUSED, // 0 - disabled + DIGITAL_IN, // 1 + COUNTER, // 2 + ADC // 3 + }; + + void start(); + void loop(); + void publish_sensor(Sensor sensor); + void publish_values(const bool force); + void reload(); + bool updated_values(); + + // return back reference to the sensor list, used by other classes + const std::vector sensors() const { + return sensors_; + } + + uint32_t reads() { + return sensorreads_; + } + + uint32_t fails() { + return sensorfails_; + } + + bool analog_enabled() { + return (analog_enabled_); + } + + bool have_sensors() { + return (sensors_.size() > 0); + } + + size_t no_sensors() { + return sensors_.size(); + } + + bool update(uint8_t id, const std::string & name, uint16_t offset, float factor, uint8_t uom, int8_t type); + bool get_value_info(JsonObject & output, const char * cmd, const int8_t id); + +#ifdef EMSESP_DEBUG + void test(); +#endif + + private: + static constexpr uint8_t MAX_SENSORS = 20; + static constexpr uint32_t MEASURE_ANALOG_INTERVAL = 500; + + static uuid::log::Logger logger_; + + void remove_ha_topic(const uint8_t id); + bool command_counter(const char * value, const int8_t id); + void measure(); + bool command_info(const char * value, const int8_t id, JsonObject & output); + + std::vector sensors_; // our list of sensors + + bool analog_enabled_; + bool changed_ = false; + uint32_t sensorfails_ = 0; + uint32_t sensorreads_ = 0; +}; + +} // namespace emsesp + +#endif \ No newline at end of file diff --git a/src/command.cpp b/src/command.cpp index 6e12d347f..6164134ed 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -52,7 +52,9 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec } } +#if defined(EMSESP_USE_SERIAL) // Serial.println(p.path().c_str()); // dump paths, for debugging +#endif // re-calculate new path // if there is only a path (URL) and no body then error! @@ -107,7 +109,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec command_p = parse_command_string(command_p, id_n); if (command_p == nullptr) { // handle dead endpoints like api/system or api/boiler - // default to 'info' for SYSTEM and DALLASENSOR, the other devices to 'values' for shortname version + // default to 'info' for SYSTEM, DALLASENSOR and ANALOGSENSOR, the other devices to 'values' for shortname version if (num_paths < 3) { if (device_type < EMSdevice::DeviceType::BOILER) { command_p = "info"; @@ -126,7 +128,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec id_n = input["hc"]; } else if (input.containsKey("wwc")) { id_n = input["wwc"]; - id_n += 7; // wwc1 has id 8 + id_n += 8; // wwc1 has id 9 } else if (input.containsKey("id")) { id_n = input["id"]; } @@ -146,7 +148,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec return_code = Command::call(device_type, command_p, data.as(), is_admin, id_n, output); } else if (data.is()) { char data_str[10]; - return_code = Command::call(device_type, command_p, Helpers::itoa(data_str, (int16_t)data.as()), is_admin, id_n, output); + return_code = Command::call(device_type, command_p, Helpers::itoa((int16_t)data.as(), data_str), is_admin, id_n, output); } else if (data.is()) { char data_str[10]; return_code = Command::call(device_type, command_p, Helpers::render_value(data_str, (float)data.as(), 2), is_admin, id_n, output); @@ -211,7 +213,7 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { if (!strncmp(command, "hc", 2) && start_pos == 4) { id = command[start_pos - 2] - '0'; } else if (!strncmp(command, "wwc", 3) && start_pos == 5) { - id = command[start_pos - 2] - '0' + 7; // wwc1 has id 8 + id = command[start_pos - 2] - '0' + 8; // wwc1 has id 9 } else { #if defined(EMSESP_DEBUG) LOG_DEBUG(F("[DEBUG] Command parse error, unknown hc/wwc in %s"), command_s); @@ -245,42 +247,48 @@ uint8_t Command::call(const uint8_t device_type, const char * cmd, const char * // check if its a call to and end-point to a device, i.e. has no value // except for system commands as this is a special device without any queryable entities (device values) - // exclude SYSTEM and DALLASSENSOR - - if ((device_type >= EMSdevice::DeviceType::BOILER) && (!value || !strlen(value))) { + // exclude SYSTEM + if ((device_type > EMSdevice::DeviceType::SYSTEM) && (!value || !strlen(value))) { if (!cf || !cf->cmdfunction_json_) { #if defined(EMSESP_DEBUG) - LOG_INFO(F("[DEBUG] Calling %s command '%s' to retrieve values"), dname.c_str(), cmd); + LOG_DEBUG(F("[DEBUG] Calling %s command '%s' to retrieve values"), dname.c_str(), cmd); #endif return EMSESP::get_device_value_info(output, cmd, id, device_type) ? CommandRet::OK : CommandRet::ERROR; // entity = cmd } } + // check if we have a matching command if (cf) { - // we have a matching command - if ((value == nullptr) || !strlen(value)) { - LOG_INFO(F("Calling %s command '%s'"), dname.c_str(), cmd); - } else if (id == -1) { - LOG_INFO(F("Calling %s command '%s', value %s, id is default"), dname.c_str(), cmd, value); - } else { - LOG_INFO(F("Calling %s command '%s', value %s, id is %d"), dname.c_str(), cmd, value, id); - } - // check permissions if (cf->has_flags(CommandFlag::ADMIN_ONLY) && !is_admin) { output["message"] = "authentication failed"; return CommandRet::NOT_ALLOWED; // command not allowed } - // call the function + if (value == nullptr) { + if (EMSESP::system_.readonly_mode()) { + LOG_INFO(F("[readonly] Calling command '%s/%s' (%s)"), dname.c_str(), cmd, read_flash_string(cf->description_).c_str()); + } else { + LOG_DEBUG(F("Calling command '%s/%s' (%s)"), dname.c_str(), cmd, read_flash_string(cf->description_).c_str()); + } + } else { + if (EMSESP::system_.readonly_mode()) { + LOG_INFO(F("[readonly] Calling command '%s/%s' (%s) with value %s"), dname.c_str(), cmd, read_flash_string(cf->description_).c_str(), value); + } else { + LOG_DEBUG(F("Calling command '%s/%s' (%s) with value %s"), dname.c_str(), cmd, read_flash_string(cf->description_).c_str(), value); + } + } + + // call the function baesed on type if (cf->cmdfunction_json_) { return_code = ((cf->cmdfunction_json_)(value, id, output)) ? CommandRet::OK : CommandRet::ERROR; } + if (cf->cmdfunction_) { return_code = ((cf->cmdfunction_)(value, id)) ? CommandRet::OK : CommandRet::ERROR; } - // report error if call failed + // report back if (return_code != CommandRet::OK) { return message(return_code, "callback function failed", output); } @@ -417,7 +425,7 @@ void Command::show(uuid::console::Shell & shell, uint8_t device_type, bool verbo } shell.print(COLOR_BRIGHT_CYAN); if (cf.has_flags(MQTT_SUB_FLAG_WW)) { - shell.print(EMSdevice::tag_to_string(TAG_DEVICE_DATA_WW)); + shell.print(EMSdevice::tag_to_string(DeviceValueTAG::TAG_DEVICE_DATA_WW)); shell.print(' '); } shell.print(read_flash_string(cf.description_)); @@ -447,7 +455,11 @@ bool Command::device_has_commands(const uint8_t device_type) { } if (device_type == EMSdevice::DeviceType::DALLASSENSOR) { - return (EMSESP::sensor_devices().size() != 0); + return (EMSESP::dallassensor_.have_sensors()); + } + + if (device_type == EMSdevice::DeviceType::ANALOGSENSOR) { + return (EMSESP::analogsensor_.have_sensors()); } for (const auto & emsdevice : EMSESP::emsdevices) { @@ -464,12 +476,16 @@ bool Command::device_has_commands(const uint8_t device_type) { return false; } +// list sensors and EMS devices void Command::show_devices(uuid::console::Shell & shell) { shell.printf("%s ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::SYSTEM).c_str()); - if (EMSESP::have_sensors()) { + if (EMSESP::dallassensor_.have_sensors()) { shell.printf("%s ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::DALLASSENSOR).c_str()); } + if (EMSESP::analogsensor_.have_sensors()) { + shell.printf("%s ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::ANALOGSENSOR).c_str()); + } for (const auto & device_class : EMSFactory::device_handlers()) { for (const auto & emsdevice : EMSESP::emsdevices) { @@ -494,14 +510,21 @@ void Command::show_all(uuid::console::Shell & shell) { shell.print(COLOR_RESET); show(shell, EMSdevice::DeviceType::SYSTEM, true); - // show sensor - if (EMSESP::have_sensors()) { + // show sensors + if (EMSESP::dallassensor_.have_sensors()) { shell.print(COLOR_BOLD_ON); shell.print(COLOR_YELLOW); shell.printf(" %s: ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::DALLASSENSOR).c_str()); shell.print(COLOR_RESET); show(shell, EMSdevice::DeviceType::DALLASSENSOR, true); } + if (EMSESP::analogsensor_.have_sensors()) { + shell.print(COLOR_BOLD_ON); + shell.print(COLOR_YELLOW); + shell.printf(" %s: ", EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::ANALOGSENSOR).c_str()); + shell.print(COLOR_RESET); + show(shell, EMSdevice::DeviceType::ANALOGSENSOR, true); + } // do this in the order of factory classes to keep a consistent order when displaying for (const auto & device_class : EMSFactory::device_handlers()) { diff --git a/src/command.h b/src/command.h index 3598684f9..6889be6c5 100644 --- a/src/command.h +++ b/src/command.h @@ -19,18 +19,10 @@ #ifndef EMSESP_COMMAND_H_ #define EMSESP_COMMAND_H_ -#include -#include - -#include -#include -#include #include #include "console.h" -#include - using uuid::console::Shell; namespace emsesp { @@ -38,7 +30,7 @@ namespace emsesp { // mqtt flags for command subscriptions enum CommandFlag : uint8_t { MQTT_SUB_FLAG_DEFAULT = 0, // 0 no flags set, always subscribe to MQTT - MQTT_SUB_FLAG_HC = (1 << 0), // 1 TAG_HC1 - TAG_HC4 + MQTT_SUB_FLAG_HC = (1 << 0), // 1 TAG_HC1 - TAG_HC8 MQTT_SUB_FLAG_WWC = (1 << 1), // 2 TAG_WWC1 - TAG_WWC4 MQTT_SUB_FLAG_NOSUB = (1 << 2), // 4 MQTT_SUB_FLAG_WW = (1 << 3), // 8 TAG_DEVICE_DATA_WW diff --git a/src/console.cpp b/src/console.cpp index b1b221055..50a9feb4d 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -76,8 +76,9 @@ void EMSESPShell::display_banner() { EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { console_hostname_ = networkSettings.hostname.c_str(); }); if (console_hostname_.empty()) { - console_hostname_.resize(16, '\0'); - snprintf(&console_hostname_[0], console_hostname_.capacity() + 1, "ems-esp"); + console_hostname_ = "ems-esp"; + // console_hostname_.resize(16, '\0'); + // snprintf(&console_hostname_[0], console_hostname_.capacity() + 1, "ems-esp"); } // load the list of commands @@ -249,7 +250,7 @@ void EMSESPShell::add_console_commands() { uint8_t device_id = Helpers::hextoint(arguments.front().c_str()); if (!EMSESP::valid_device(device_id)) { - shell.printfln(F("Invalid device ID")); + shell.printfln(F("Invalid deviceID")); return; } @@ -355,7 +356,7 @@ void EMSESPShell::add_console_commands() { if (watch_id > 0x80) { shell.printfln(F("Filtering only telegrams that match a telegram type of 0x%02X"), watch_id); } else if (watch_id != WATCH_ID_NONE) { - shell.printfln(F("Filtering only telegrams that match a device ID or telegram type of 0x%02X"), watch_id); + shell.printfln(F("Filtering only telegrams that match a deviceID or telegram type of 0x%02X"), watch_id); } }); @@ -433,6 +434,7 @@ void EMSESPShell::add_console_commands() { std::vector devices_list; devices_list.emplace_back(EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::SYSTEM)); devices_list.emplace_back(EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::DALLASSENSOR)); + devices_list.emplace_back(EMSdevice::device_type_2_device_name(EMSdevice::DeviceType::ANALOGSENSOR)); for (const auto & device_class : EMSFactory::device_handlers()) { if (Command::device_has_commands(device_class.first)) { devices_list.emplace_back(EMSdevice::device_type_2_device_name(device_class.first)); @@ -491,20 +493,21 @@ void Console::enter_custom_context(Shell & shell, unsigned int context) { // each custom context has the common commands like log, help, exit, su etc void Console::load_standard_commands(unsigned int context) { #if defined(EMSESP_DEBUG) + // create commands test and t EMSESPShell::commands->add_command(context, CommandFlags::USER, flash_string_vector{F("test")}, - flash_string_vector{F_(name_optional)}, + flash_string_vector{F_(name_optional), F_(data_optional)}, [](Shell & shell, const std::vector & arguments) { if (arguments.size() == 0) { Test::run_test(shell, "default"); - } else { + } else if (arguments.size() == 1) { Test::run_test(shell, arguments.front()); + } else { + Test::run_test(shell, arguments[0].c_str(), arguments[1].c_str()); } }); -#endif -#if defined(EMSESP_STANDALONE) EMSESPShell::commands->add_command(context, CommandFlags::USER, flash_string_vector{F("t")}, [](Shell & shell, const std::vector & arguments) { Test::run_test(shell, "default"); }); @@ -696,6 +699,16 @@ void Console::load_system_commands(unsigned int context) { shell.println("Use `wifi reconnect` to save and apply the new settings"); }); + // added by mvdp + EMSESPShell::commands->add_command(context, + CommandFlags::ADMIN, + flash_string_vector{F("mqtt"), F("subscribe")}, + flash_string_vector{F("")}, + [](Shell & shell, const std::vector & arguments) { + Mqtt::subscribe(arguments.front()); + shell.println("subscribing"); + }); + EMSESPShell::commands->add_command(context, CommandFlags::ADMIN, flash_string_vector{F_(set), F_(wifi), F_(password)}, @@ -723,72 +736,33 @@ void Console::load_system_commands(unsigned int context) { EMSESPShell::commands->add_command(context, CommandFlags::ADMIN, - flash_string_vector{F_(sensorname)}, - flash_string_vector{F_(sensorid_optional), F_(name_optional), F_(offset_optional)}, + flash_string_vector{F_(set), F_(board_profile)}, + flash_string_vector{F_(name_mandatory)}, [](Shell & shell, const std::vector & arguments) { - if (arguments.size() == 0) { - EMSESP::webSettingsService.read([&](WebSettings & settings) { - for (uint8_t i = 0; i < MAX_NUM_SENSOR_NAMES; i++) { - if (!settings.sensor[i].id.isEmpty()) { - shell.print(settings.sensor[i].id); - shell.print(" : "); - shell.print(settings.sensor[i].name); - shell.print(" : "); - char buf[10]; - shell.println(Helpers::render_value(buf, settings.sensor[i].offset, 10)); - } - } - }); + std::vector data; // led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode + std::string board_profile = Helpers::toUpper(arguments.front()); + if (!EMSESP::system_.load_board_profile(data, board_profile)) { + shell.println(F("Invalid board profile (S32, E32, MH-ET, NODEMCU, OLIMEX, OLIMEXPOE, CUSTOM)")); return; } - if (arguments.size() == 1) { - EMSESP::dallassensor_.update(arguments.front().c_str(), "", 0); - // shell.println(EMSESP::dallassensor_.get_name(arguments.front().c_str())); - return; - } - int16_t offset = 0; - float val; - if (arguments.size() == 2) { - if (Helpers::value2float(arguments.back().c_str(), val)) { - offset = (10 * val); - EMSESP::dallassensor_.update(arguments.front().c_str(), "", offset); - return; - } - } else if (arguments.size() == 3) { - if (Helpers::value2float(arguments.back().c_str(), val)) { - offset = (10 * val); - } - } - EMSESP::dallassensor_.update(arguments.front().c_str(), arguments[1].c_str(), offset); + EMSESP::webSettingsService.update( + [&](WebSettings & settings) { + settings.board_profile = board_profile.c_str(); + settings.led_gpio = data[0]; + settings.dallas_gpio = data[1]; + settings.rx_gpio = data[2]; + settings.tx_gpio = data[3]; + settings.pbutton_gpio = data[4]; + settings.phy_type = data[5]; + settings.eth_power = data[6]; // can be -1 + settings.eth_phy_addr = data[7]; + settings.eth_clock_mode = data[8]; + return StateUpdateResult::CHANGED; + }, + "local"); + shell.printfln("Loaded board profile %s", board_profile.c_str()); + EMSESP::system_.network_init(true); }); - - EMSESPShell::commands->add_command( - context, - CommandFlags::ADMIN, - flash_string_vector{F_(set), F_(board_profile)}, - flash_string_vector{F_(name_mandatory)}, - [](Shell & shell, const std::vector & arguments) { - std::vector data; // led, dallas, rx, tx, button - std::string board_profile = Helpers::toUpper(arguments.front()); - if (!EMSESP::system_.load_board_profile(data, board_profile)) { - shell.println(F("Invalid board profile (S32, E32, MH-ET, NODEMCU, OLIMEX, CUSTOM)")); - return; - } - EMSESP::webSettingsService.update( - [&](WebSettings & settings) { - settings.board_profile = board_profile.c_str(); - settings.led_gpio = data[0]; - settings.dallas_gpio = data[1]; - settings.rx_gpio = data[2]; - settings.tx_gpio = data[3]; - settings.pbutton_gpio = data[4]; - settings.phy_type = data[5]; - return StateUpdateResult::CHANGED; - }, - "local"); - shell.printfln("Loaded board profile %s (%d,%d,%d,%d,%d,%d)", board_profile.c_str(), data[0], data[1], data[2], data[3], data[4], data[5]); - EMSESP::system_.network_init(true); - }); EMSESPShell::commands->add_command(context, CommandFlags::ADMIN, flash_string_vector{F_(show), F_(users)}, @@ -853,7 +827,7 @@ EMSESPStreamConsole::EMSESPStreamConsole(Stream & stream, const IPAddress & addr ptys_[pty_] = true; } - snprintf(text.data(), text.size(), "pty%u", pty_); + snprintf(text.data(), text.size(), "pty%u", (uint16_t)pty_); name_ = text.data(); #ifndef EMSESP_STANDALONE logger().info(F("Allocated console %s for connection from [%s]:%u"), name_.c_str(), uuid::printable_to_string(addr_).c_str(), port_); @@ -876,9 +850,12 @@ std::string EMSESPStreamConsole::console_name() { // Start up telnet and logging // Log order is off, err, warning, notice, info, debug, trace, all -void Console::start() { +void Console::start(bool telnet_enabled) { + telnet_enabled_ = telnet_enabled; + + // Serial Console shell = std::make_shared(Serial, true); - shell->maximum_log_messages(100); // default was 50 + shell->maximum_log_messages(100); shell->start(); #if defined(EMSESP_DEBUG) @@ -889,13 +866,15 @@ void Console::start() { shell->add_flags(CommandFlags::ADMIN); // always start in su/admin mode when running tests #endif -// start the telnet service -// default idle is 10 minutes, default write timeout is 0 (automatic) -// note, this must be started after the network/wifi for ESP32 otherwise it'll crash + // start the telnet service + // default idle is 10 minutes, default write timeout is 0 (automatic) + // note, this must be started after the network/wifi for ESP32 otherwise it'll crash #ifndef EMSESP_STANDALONE - telnet_.start(); - telnet_.initial_idle_timeout(3600); // in sec, one hour idle timeout - telnet_.default_write_timeout(1000); // in ms, socket timeout 1 second + if (telnet_enabled) { + telnet_.start(); + telnet_.initial_idle_timeout(3600); // in sec, one hour idle timeout + telnet_.default_write_timeout(1000); // in ms, socket timeout 1 second + } #endif // turn watch off in case it was still set in the last session @@ -907,7 +886,9 @@ void Console::loop() { uuid::loop(); #ifndef EMSESP_STANDALONE - telnet_.loop(); + if (telnet_enabled_) { + telnet_.loop(); + } #endif Shell::loop_all(); diff --git a/src/console.h b/src/console.h index de9a2e5b2..bf7253b78 100644 --- a/src/console.h +++ b/src/console.h @@ -19,11 +19,6 @@ #ifndef EMSESP_CONSOLE_H #define EMSESP_CONSOLE_H -#include - -#include -#include - #include #include @@ -101,9 +96,10 @@ class EMSESPShell : virtual public uuid::console::Shell { void stopped() override; void display_banner() override; std::string hostname_text() override; - // std::string context_text() override; std::string prompt_suffix() override; void end_of_transmission() override; + + // std::string context_text() override; // bool exit_context() override; private: @@ -132,13 +128,16 @@ class EMSESPStreamConsole : public uuid::console::StreamConsole, public EMSESPSh class Console { public: void loop(); - void start(); + void start(bool telnet_enabled = true); uuid::log::Level log_level(); // static void enter_custom_context(Shell & shell, unsigned int context); static void load_standard_commands(unsigned int context); static void load_system_commands(unsigned int context); + + private: + bool telnet_enabled_; }; } // namespace emsesp diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index 72abb5a4a..ee34789ba 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -35,36 +35,38 @@ uuid::log::Logger DallasSensor::logger_{F_(dallassensor), uuid::log::Facility::D void DallasSensor::start() { reload(); - // disabled if dallas gpio is 0 - if (dallas_gpio_) { -#ifndef EMSESP_STANDALONE - bus_.begin(dallas_gpio_); -#endif - // API calls - Command::add( - EMSdevice::DeviceType::DALLASSENSOR, - F_(info), - [&](const char * value, const int8_t id, JsonObject & output) { return command_info(value, id, output); }, - F_(info_cmd)); - Command::add( - EMSdevice::DeviceType::DALLASSENSOR, - F_(commands), - [&](const char * value, const int8_t id, JsonObject & output) { return command_commands(value, id, output); }, - F_(commands_cmd)); + if (!dallas_gpio_) { + return; // disabled if dallas gpio is 0 } + +#ifndef EMSESP_STANDALONE + bus_.begin(dallas_gpio_); + LOG_INFO(F("Starting Dallas sensor service")); +#endif + + // Add API calls + Command::add( + EMSdevice::DeviceType::DALLASSENSOR, + F_(info), + [&](const char * value, const int8_t id, JsonObject & output) { return command_info(value, id, output); }, + F_(info_cmd)); + Command::add( + EMSdevice::DeviceType::DALLASSENSOR, + F_(commands), + [&](const char * value, const int8_t id, JsonObject & output) { return command_commands(value, id, output); }, + F_(commands_cmd)); } -// load the MQTT settings +// load settings void DallasSensor::reload() { + // load the service settings EMSESP::webSettingsService.read([&](WebSettings & settings) { - dallas_gpio_ = settings.dallas_gpio; - parasite_ = settings.dallas_parasite; - dallas_format_ = settings.dallas_format; + dallas_gpio_ = settings.dallas_gpio; + parasite_ = settings.dallas_parasite; }); - if (Mqtt::ha_enabled()) { - for (uint8_t i = 0; i < MAX_SENSORS; registered_ha_[i++] = false) - ; + for (auto & sensor : sensors_) { + sensor.ha_registered = false; // force HA configs to be re-created } } @@ -93,7 +95,9 @@ void DallasSensor::loop() { sensorfails_++; if (++scanretry_ > SCAN_MAX) { // every 30 sec scanretry_ = 0; +#ifdef EMSESP_DEBUG_SENSOR LOG_ERROR(F("Bus reset failed")); +#endif for (auto & sensor : sensors_) { sensor.temperature_c = EMS_VALUE_SHORT_NOTSET; } @@ -110,13 +114,17 @@ void DallasSensor::loop() { bus_.reset_search(); state_ = State::SCANNING; } else if (time_now - last_activity_ > READ_TIMEOUT_MS) { +#ifdef EMSESP_DEBUG_SENSOR LOG_WARNING(F("Dallas sensor read timeout")); +#endif state_ = State::IDLE; sensorfails_++; } } else if (state_ == State::SCANNING) { if (time_now - last_activity_ > SCAN_TIMEOUT_MS) { +#ifdef EMSESP_DEBUG_SENSOR LOG_ERROR(F("Dallas sensor scan timeout")); +#endif state_ = State::IDLE; sensorfails_++; } else { @@ -136,12 +144,13 @@ void DallasSensor::loop() { t = get_temperature_c(addr); if ((t >= -550) && (t <= 1250)) { sensorreads_++; - // check if we have this sensor already + // check if we already have this sensor bool found = false; for (auto & sensor : sensors_) { if (sensor.id() == get_id(addr)) { t += sensor.offset(); if (t != sensor.temperature_c) { + publish_sensor(sensor); changed_ |= true; } sensor.temperature_c = t; @@ -150,12 +159,17 @@ void DallasSensor::loop() { break; } } - // add new sensor + // add new sensor. this will create the id string, empty name and offset if (!found && (sensors_.size() < (MAX_SENSORS - 1))) { sensors_.emplace_back(addr); sensors_.back().temperature_c = t + sensors_.back().offset(); sensors_.back().read = true; changed_ = true; + // look in the customization service for an optional alias or offset for that particular sensor + sensors_.back().apply_customization(); + publish_sensor(sensors_.back()); // call publish single + // sort the sensors based on name + std::sort(sensors_.begin(), sensors_.end(), [](const Sensor & a, const Sensor & b) { return a.name() < b.name(); }); } } else { sensorfails_++; @@ -164,12 +178,12 @@ void DallasSensor::loop() { default: sensorfails_++; - LOG_ERROR(F("Unknown dallas sensor %s"), Sensor(addr).to_string().c_str()); + LOG_ERROR(F("Unknown dallas sensor %s"), Sensor(addr).id_str().c_str()); break; } } else { sensorfails_++; - LOG_ERROR(F("Invalid dallas sensor %s"), Sensor(addr).to_string().c_str()); + LOG_ERROR(F("Invalid dallas sensor %s"), Sensor(addr).id_str().c_str()); } } else { if (!parasite_) { @@ -187,7 +201,7 @@ void DallasSensor::loop() { scancnt_ = 0; } else if (scancnt_ == SCAN_START + 1) { // startup firstscan_ = sensors_.size(); - LOG_DEBUG(F("Adding %d dallas sensor(s) from first scan"), firstscan_); + // LOG_DEBUG(F("Adding %d dallas sensor(s) from first scan"), firstscan_); } else if ((scancnt_ <= 0) && (firstscan_ != sensors_.size())) { // check 2 times for no change of sensor # scancnt_ = SCAN_START; sensors_.clear(); // restart scaning and clear to get correct numbering @@ -213,7 +227,7 @@ bool DallasSensor::temperature_convert_complete() { int16_t DallasSensor::get_temperature_c(const uint8_t addr[]) { #ifndef EMSESP_STANDALONE if (!bus_.reset()) { - LOG_ERROR(F("Bus reset failed before reading scratchpad from %s"), Sensor(addr).to_string().c_str()); + LOG_ERROR(F("Bus reset failed before reading scratchpad from %s"), Sensor(addr).id_str().c_str()); return EMS_VALUE_SHORT_NOTSET; } YIELD; @@ -225,7 +239,7 @@ int16_t DallasSensor::get_temperature_c(const uint8_t addr[]) { YIELD; if (!bus_.reset()) { - LOG_ERROR(F("Bus reset failed after reading scratchpad from %s"), Sensor(addr).to_string().c_str()); + LOG_ERROR(F("Bus reset failed after reading scratchpad from %s"), Sensor(addr).id_str().c_str()); return EMS_VALUE_SHORT_NOTSET; } YIELD; @@ -241,7 +255,7 @@ int16_t DallasSensor::get_temperature_c(const uint8_t addr[]) { scratchpad[6], scratchpad[7], scratchpad[8], - Sensor(addr).to_string().c_str()); + Sensor(addr).id_str().c_str()); return EMS_VALUE_SHORT_NOTSET; } @@ -273,162 +287,52 @@ int16_t DallasSensor::get_temperature_c(const uint8_t addr[]) { #endif } -const std::vector DallasSensor::sensors() const { - return sensors_; -} +// update dallas information name and offset +bool DallasSensor::update(const std::string & id_str, const std::string & name, int16_t offset) { + // find the sensor + for (auto & sensor : sensors_) { + if (sensor.id_str() == id_str) { + // found a match, update the sensor object -// skip crc from id. -DallasSensor::Sensor::Sensor(const uint8_t addr[]) - : id_(((uint64_t)addr[0] << 48) | ((uint64_t)addr[1] << 40) | ((uint64_t)addr[2] << 32) | ((uint64_t)addr[3] << 24) | ((uint64_t)addr[4] << 16) - | ((uint64_t)addr[5] << 8) | ((uint64_t)addr[6])) { -} - -uint64_t DallasSensor::get_id(const uint8_t addr[]) { - return (((uint64_t)addr[0] << 48) | ((uint64_t)addr[1] << 40) | ((uint64_t)addr[2] << 32) | ((uint64_t)addr[3] << 24) | ((uint64_t)addr[4] << 16) - | ((uint64_t)addr[5] << 8) | ((uint64_t)addr[6])); -} - -uint64_t DallasSensor::Sensor::id() const { - return id_; -} - -std::string DallasSensor::Sensor::id_string() const { - std::string str(20, '\0'); - snprintf(&str[0], - str.capacity() + 1, - "%02X-%04X-%04X-%04X", - (unsigned int)(id_ >> 48) & 0xFF, - (unsigned int)(id_ >> 32) & 0xFFFF, - (unsigned int)(id_ >> 16) & 0xFFFF, - (unsigned int)(id_)&0xFFFF); - return str; -} - -std::string DallasSensor::Sensor::to_string(const bool name) const { - std::string str = id_string(); - EMSESP::webSettingsService.read([&](WebSettings & settings) { - if (settings.dallas_format == Dallas_Format::NAME || name) { - for (uint8_t i = 0; i < MAX_NUM_SENSOR_NAMES; i++) { - if (strcmp(settings.sensor[i].id.c_str(), str.c_str()) == 0) { - str = settings.sensor[i].name.c_str(); - } + // if HA is enabled then delete the old record + if (Mqtt::ha_enabled()) { + remove_ha_topic(id_str); } - } - }); - return str; -} + sensor.set_name(name); + sensor.set_offset(offset); -int16_t DallasSensor::Sensor::offset() const { - std::string str = id_string(); - int16_t offset = 0; // default value - EMSESP::webSettingsService.read([&](WebSettings & settings) { - for (uint8_t i = 0; i < MAX_NUM_SENSOR_NAMES; i++) { - if (strcmp(settings.sensor[i].id.c_str(), str.c_str()) == 0) { - offset = settings.sensor[i].offset; - } - } - }); - - return offset; -} - -// if HA enabled with MQTT Discovery, delete the old config entry by sending an empty topic -// if we're using the name in the MQTT topic name (Dallas format = NAME) -void DallasSensor::delete_ha_config(uint8_t index, const char * name) { - if (Mqtt::ha_enabled() && (dallas_format_ == Dallas_Format::NAME)) { - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - // use '_' as HA doesn't like '-' in the topic name - std::string topicname = name; - std::replace(topicname.begin(), topicname.end(), '-', '_'); - - snprintf(topic, sizeof(topic), "homeassistant/sensor/%s/dallassensor_%s/config", Mqtt::base().c_str(), topicname.c_str()); - Mqtt::publish(topic); - registered_ha_[index] = false; // forces a recreate of the HA config topic - } -} - -// update dallas information like name and offset -bool DallasSensor::update(const char * idstr, const char * name, int16_t offset) { - bool ok = false; - char id[20]; - strlcpy(id, idstr, sizeof(id)); - - // check for number and convert to id - if (strlen(id) > 0 && strlen(id) <= 2 && id[0] >= '1' && id[0] <= '9') { - uint8_t no = atoi(idstr) - 1; - if (no < sensors_.size()) { - strlcpy(id, sensors_[no].id_string().c_str(), sizeof(id)); - } - } - - // check valid id - if (strlen(id) != 17 || id[2] != '-' || id[7] != '-' || id[12] != '-') { - LOG_WARNING(F("Invalid sensor id: %s"), id); - return ok; - } - - EMSESP::webSettingsService.update( - [&](WebSettings & settings) { - // check for new name of stored id - for (uint8_t i = 0; i < MAX_NUM_SENSOR_NAMES; i++) { - if (strcmp(id, settings.sensor[i].id.c_str()) == 0) { - if (strlen(name) == 0 && offset == 0) { // delete entry if name and offset is empty - LOG_INFO(F("Deleting entry for sensor %s"), id); - delete_ha_config(i, settings.sensor[i].name.c_str()); - settings.sensor[i].id = ""; - settings.sensor[i].name = ""; - settings.sensor[i].offset = 0; - } else { - char result[10]; - LOG_INFO(F("Renaming sensor ID %s to %s with offset %s"), id, name, Helpers::render_value(result, offset, 10)); - delete_ha_config(i, settings.sensor[i].name.c_str()); // remove old name in HA - settings.sensor[i].name = (strlen(name) == 0) ? id : name; - settings.sensor[i].offset = offset; + // store the new name and offset in our configuration + EMSESP::webCustomizationService.update( + [&](WebCustomization & settings) { + // look it up to see if it exists + bool found = false; + for (auto & SensorCustomization : settings.sensorCustomizations) { + if (SensorCustomization.id_str == id_str) { + SensorCustomization.name = name; + SensorCustomization.offset = offset; + found = true; + LOG_DEBUG(F("Customizing existing sensor ID %s"), id_str.c_str()); + break; + } } - ok = true; - return StateUpdateResult::CHANGED; - } - } - - // check for free place - for (uint8_t i = 0; i < MAX_NUM_SENSOR_NAMES; i++) { - if (settings.sensor[i].id.isEmpty()) { - settings.sensor[i].id = id; - settings.sensor[i].name = (strlen(name) == 0) ? id : name; - settings.sensor[i].offset = offset; - char result[10]; - LOG_INFO(F("Adding sensor ID %s to %s with offset %s"), id, name, Helpers::render_value(result, offset, 10)); - ok = true; - return StateUpdateResult::CHANGED; - } - } - - // check if there is a unused id and overwrite it - for (uint8_t i = 0; i < MAX_NUM_SENSOR_NAMES; i++) { - bool found = false; - for (const auto & sensor : sensors_) { - if (strcmp(sensor.id_string().c_str(), settings.sensor[i].id.c_str()) == 0) { - found = true; + if (!found) { + SensorCustomization newSensor = SensorCustomization(); + newSensor.id_str = id_str; + newSensor.name = name; + newSensor.offset = offset; + settings.sensorCustomizations.push_back(newSensor); + LOG_DEBUG(F("Adding new customization for sensor ID %s"), id_str.c_str()); } - } - if (!found) { - char result[10]; - LOG_INFO(F("Renaming sensor ID %s to %s with offset %s"), id, name, Helpers::render_value(result, offset, 10)); - delete_ha_config(i, settings.sensor[i].name.c_str()); // remove old name in HA - settings.sensor[i].id = id; - settings.sensor[i].name = (strlen(name) == 0) ? id : name; - settings.sensor[i].offset = offset; - ok = true; + sensor.ha_registered = false; // it's changed so we may need to recreate the HA config return StateUpdateResult::CHANGED; - } - } + }, + "local"); + return true; + } + } - LOG_ERROR(F("No more empty sensor slots, remove one first")); - return StateUpdateResult::UNCHANGED; - }, - "local"); - return ok; + return true; // not found, nothing updated } // check to see if values have been updated @@ -446,35 +350,73 @@ bool DallasSensor::command_commands(const char * value, const int8_t id, JsonObj } // creates JSON doc from values -// returns false if empty -// e.g. dallassensor_data = {"sensor1":{"id":"28-EA41-9497-0E03-5F","temp":23.30},"sensor2":{"id":"28-233D-9497-0C03-8B","temp":24.0}} +// returns false if there are no sensors bool DallasSensor::command_info(const char * value, const int8_t id, JsonObject & output) { if (sensors_.size() == 0) { return false; } - uint8_t i = 1; // sensor count for (const auto & sensor : sensors_) { - char sensorID[10]; // sensor{1-n} - snprintf(sensorID, 10, "sensor%d", i++); if (id == -1) { // show number and id - JsonObject dataSensor = output.createNestedObject(sensorID); - dataSensor["id"] = sensor.to_string(); + JsonObject dataSensor = output.createNestedObject(sensor.name()); + dataSensor["id_str"] = sensor.id_str(); if (Helpers::hasValue(sensor.temperature_c)) { dataSensor["temp"] = (float)(sensor.temperature_c) / 10; } - } else { // show according to format - if (dallas_format_ == Dallas_Format::NUMBER && Helpers::hasValue(sensor.temperature_c)) { - output[sensorID] = (float)(sensor.temperature_c) / 10; - } else if (Helpers::hasValue(sensor.temperature_c)) { - output[sensor.to_string()] = (float)(sensor.temperature_c) / 10; - } + } else if (Helpers::hasValue(sensor.temperature_c)) { + output[sensor.name()] = (float)(sensor.temperature_c) / 10; } } return (output.size() > 0); } +// called from emsesp.cpp, similar to the emsdevice->get_value_info +bool DallasSensor::get_value_info(JsonObject & output, const char * cmd, const int8_t id) { + for (const auto & sensor : sensors_) { + if (strcmp(cmd, sensor.name().c_str()) == 0) { + output["id_str"] = sensor.id_str(); + output["name"] = sensor.name(); + if (Helpers::hasValue(sensor.temperature_c)) { + output["value"] = (float)(sensor.temperature_c) / 10; + } + output["type"] = F_(number); + output["min"] = -55; + output["max"] = 125; + output["unit"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); + output["writeable"] = false; + return true; + } + } + return false; +} + +// publish a single sensor to MQTT +void DallasSensor::publish_sensor(const Sensor & sensor) { + if (Mqtt::publish_single()) { + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "%s/%s", read_flash_string(F_(dallassensor)).c_str(), sensor.name().c_str()); + char payload[10]; + Mqtt::publish(topic, Helpers::render_value(payload, sensor.temperature_c, 10, EMSESP::system_.fahrenheit() ? 2 : 0)); + } +} + +// send empty config topic to remove the entry from HA +void DallasSensor::remove_ha_topic(const std::string & id_str) { + if (!Mqtt::ha_enabled()) { + return; + } +#ifdef EMSESP_DEBUG + LOG_DEBUG(F("Removing HA config for sensor ID %s"), id_str.c_str()); +#endif + // use '_' as HA doesn't like '-' in the topic name + std::string sensorid = id_str; + std::replace(sensorid.begin(), sensorid.end(), '-', '_'); + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "sensor/%s/dallassensor_%s/config", Mqtt::base().c_str(), sensorid.c_str()); + Mqtt::publish_ha(topic); +} + // send all dallas sensor values as a JSON package to MQTT void DallasSensor::publish_values(const bool force) { uint8_t num_sensors = sensors_.size(); @@ -483,27 +425,33 @@ void DallasSensor::publish_values(const bool force) { return; } - DynamicJsonDocument doc(100 * num_sensors); - uint8_t sensor_no = 1; + if (force && Mqtt::publish_single()) { + for (const auto & sensor : sensors_) { + publish_sensor(sensor); + } + // return; + } - for (const auto & sensor : sensors_) { - char sensorID[10]; // sensor{1-n} - snprintf(sensorID, 10, "sensor%d", sensor_no); - if (dallas_format_ == Dallas_Format::NUMBER) { - // e.g. dallassensor_data = {"sensor1":{"id":"28-EA41-9497-0E03","temp":23.3},"sensor2":{"id":"28-233D-9497-0C03","temp":24.0}} - JsonObject dataSensor = doc.createNestedObject(sensorID); - dataSensor["id"] = sensor.to_string(); - if (Helpers::hasValue(sensor.temperature_c)) { + DynamicJsonDocument doc(120 * num_sensors); + + for (auto & sensor : sensors_) { + bool has_value = Helpers::hasValue(sensor.temperature_c); + if (Mqtt::is_nested() || Mqtt::ha_enabled()) { + JsonObject dataSensor = doc.createNestedObject(sensor.id_str()); + dataSensor["name"] = sensor.name(); + if (has_value) { dataSensor["temp"] = (float)(sensor.temperature_c) / 10; } - } else if (Helpers::hasValue(sensor.temperature_c)) { - doc[sensor.to_string()] = (float)(sensor.temperature_c) / 10; + } else if (has_value) { + doc[sensor.name()] = (float)(sensor.temperature_c) / 10; } // create the HA MQTT config // to e.g. homeassistant/sensor/ems-esp/dallassensor_28-233D-9497-0C03/config if (Mqtt::ha_enabled()) { - if (!(registered_ha_[sensor_no - 1]) || force) { + if (!sensor.ha_registered || force) { + LOG_DEBUG(F("Recreating HA config for sensor ID %s"), sensor.id_str().c_str()); + StaticJsonDocument config; config["dev_cla"] = FJSON("temperature"); @@ -511,25 +459,20 @@ void DallasSensor::publish_values(const bool force) { snprintf(stat_t, sizeof(stat_t), "%s/dallassensor_data", Mqtt::base().c_str()); config["stat_t"] = stat_t; - config["unit_of_meas"] = FJSON("°C"); + if (EMSESP::system_.fahrenheit()) { + config["unit_of_meas"] = FJSON("°F"); + } else { + config["unit_of_meas"] = FJSON("°C"); + } char str[50]; - if (dallas_format_ != Dallas_Format::NUMBER) { - snprintf(str, sizeof(str), "{{value_json['%s']}}", sensor.to_string().c_str()); - } else { - snprintf(str, sizeof(str), "{{value_json.sensor%d.temp}}", sensor_no); - } + snprintf(str, sizeof(str), "{{value_json['%s'].temp}}", sensor.id_str().c_str()); config["val_tpl"] = str; - // name as sensor number not the long unique ID - if (dallas_format_ != Dallas_Format::NUMBER) { - snprintf(str, sizeof(str), "Dallas Sensor %s", sensor.to_string().c_str()); - } else { - snprintf(str, sizeof(str), "Dallas Sensor %d", sensor_no); - } + snprintf(str, sizeof(str), "Temperature Sensor %s", sensor.name().c_str()); config["name"] = str; - snprintf(str, sizeof(str), "dallasensor_%s", sensor.to_string().c_str()); + snprintf(str, sizeof(str), "dallasensor_%s", sensor.id_str().c_str()); config["uniq_id"] = str; JsonObject dev = config.createNestedObject("dev"); @@ -537,23 +480,94 @@ void DallasSensor::publish_values(const bool force) { ids.add("ems-esp"); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - if (dallas_format_ == Dallas_Format::NUMBER) { - snprintf(topic, sizeof(topic), "sensor/%s/dallassensor_%d/config", Mqtt::base().c_str(), sensor_no); - } else { - // use '_' as HA doesn't like '-' in the topic name - std::string topicname = sensor.to_string(); - std::replace(topicname.begin(), topicname.end(), '-', '_'); - snprintf(topic, sizeof(topic), "sensor/%s/dallassensor_%s/config", Mqtt::base().c_str(), topicname.c_str()); - } + // use '_' as HA doesn't like '-' in the topic name + std::string sensorid = sensor.id_str(); + std::replace(sensorid.begin(), sensorid.end(), '-', '_'); + + snprintf(topic, sizeof(topic), "sensor/%s/dallassensor_%s/config", Mqtt::base().c_str(), sensorid.c_str()); + Mqtt::publish_ha(topic, config.as()); - registered_ha_[sensor_no - 1] = true; + sensor.ha_registered = true; } } - sensor_no++; // increment sensor count } Mqtt::publish(F("dallassensor_data"), doc.as()); } + +// skip crc from id +DallasSensor::Sensor::Sensor(const uint8_t addr[]) + : id_(((uint64_t)addr[0] << 48) | ((uint64_t)addr[1] << 40) | ((uint64_t)addr[2] << 32) | ((uint64_t)addr[3] << 24) | ((uint64_t)addr[4] << 16) + | ((uint64_t)addr[5] << 8) | ((uint64_t)addr[6])) { + // create ID string + char id[20]; + snprintf(id, + sizeof(id), + "%02X-%04X-%04X-%04X", + (unsigned int)(id_ >> 48) & 0xFF, + (unsigned int)(id_ >> 32) & 0xFFFF, + (unsigned int)(id_ >> 16) & 0xFFFF, + (unsigned int)(id_)&0xFFFF); + id_str_ = std::string(id); + name_ = std::string{}; // name (alias) is empty + offset_ = 0; // 0 degrees offset +} + +uint64_t DallasSensor::get_id(const uint8_t addr[]) { + return (((uint64_t)addr[0] << 48) | ((uint64_t)addr[1] << 40) | ((uint64_t)addr[2] << 32) | ((uint64_t)addr[3] << 24) | ((uint64_t)addr[4] << 16) + | ((uint64_t)addr[5] << 8) | ((uint64_t)addr[6])); +} + +// find the name from the customization service +// if empty, return the ID as a string +std::string DallasSensor::Sensor::name() const { + if (name_.empty()) { + return id_str_; + } + return name_; +} + +// look up in customization service for a specific sensor +// and set the name and offset from that entry if it exists +bool DallasSensor::Sensor::apply_customization() { + EMSESP::webCustomizationService.read([&](WebCustomization & settings) { + auto sensors = settings.sensorCustomizations; + if (sensors.size() != 0) { + for (auto & sensor : sensors) { +#if defined(EMSESP_DEBUG) + LOG_DEBUG(F("Loading customization for dallas sensor %s"), sensor.id_str.c_str()); +#endif + if (id_str_ == sensor.id_str) { + set_name(sensor.name); + set_offset(sensor.offset); + return true; + } + } + } + return false; + }); + + return false; // not found, will use default ID as name and 0 for offset +} + +// hard coded tests +#ifdef EMSESP_DEBUG +void DallasSensor::test() { + // add 2 dallas sensors + uint8_t addr[ADDR_LEN] = {1, 2, 3, 4, 5, 6, 7, 8}; + sensors_.emplace_back(addr); + sensors_.back().temperature_c = 123; + sensors_.back().read = true; + sensors_.back().apply_customization(); + + uint8_t addr2[ADDR_LEN] = {11, 12, 13, 14, 15, 16, 17, 18}; + sensors_.emplace_back(addr2); + sensors_.back().temperature_c = 456; + sensors_.back().read = true; + sensors_.back().apply_customization(); +} +#endif + } // namespace emsesp diff --git a/src/dallassensor.h b/src/dallassensor.h index e960e6076..abb4745bf 100644 --- a/src/dallassensor.h +++ b/src/dallassensor.h @@ -21,9 +21,6 @@ #ifndef EMSESP_DALLASSENSOR_H #define EMSESP_DALLASSENSOR_H -#include -#include - #include "helpers.h" #include "mqtt.h" #include "console.h" @@ -36,8 +33,6 @@ namespace emsesp { -enum Dallas_Format : uint8_t { SENSORID = 1, NUMBER, NAME }; - class DallasSensor { public: class Sensor { @@ -45,16 +40,37 @@ class DallasSensor { Sensor(const uint8_t addr[]); ~Sensor() = default; - uint64_t id() const; - std::string id_string() const; - std::string to_string(const bool name = false) const; - int16_t offset() const; + uint64_t id() const { + return id_; + } + + std::string id_str() const { + return id_str_; + } + + int16_t offset() const { + return offset_; + } + void set_offset(const int16_t offset) { + offset_ = offset; + } + + std::string name() const; + void set_name(const std::string & name) { + name_ = name; + } + + bool apply_customization(); int16_t temperature_c = EMS_VALUE_SHORT_NOTSET; bool read = false; + bool ha_registered = false; private: - const uint64_t id_; + uint64_t id_; + std::string id_str_; + std::string name_; + int16_t offset_; }; DallasSensor() = default; @@ -62,11 +78,16 @@ class DallasSensor { void start(); void loop(); + void publish_sensor(const Sensor & sensor); void publish_values(const bool force); void reload(); bool updated_values(); + bool get_value_info(JsonObject & output, const char * cmd, const int8_t id); - const std::vector sensors() const; + // return back reference to the sensor list, used by other classes + const std::vector sensors() const { + return sensors_; + } uint32_t reads() { return sensorreads_; @@ -80,15 +101,19 @@ class DallasSensor { return (dallas_gpio_ != 0); } - uint8_t dallas_format() { - return dallas_format_; + bool have_sensors() { + return (sensors_.size() > 0); } - void dallas_format(uint8_t dallas_format) { - dallas_format_ = dallas_format; + size_t no_sensors() { + return sensors_.size(); } - bool update(const char * idstr, const char * name, int16_t offset); + bool update(const std::string & id_str, const std::string & name, int16_t offset); + +#ifdef EMSESP_DEBUG + void test(); +#endif private: static constexpr uint8_t MAX_SENSORS = 20; @@ -129,27 +154,24 @@ class DallasSensor { bool temperature_convert_complete(); int16_t get_temperature_c(const uint8_t addr[]); uint64_t get_id(const uint8_t addr[]); + void remove_ha_topic(const std::string & id_str); bool command_info(const char * value, const int8_t id, JsonObject & output); bool command_commands(const char * value, const int8_t id, JsonObject & output); - void delete_ha_config(uint8_t index, const char * name); + uint32_t last_activity_ = uuid::get_uptime(); + State state_ = State::IDLE; - uint32_t last_activity_ = uuid::get_uptime(); - State state_ = State::IDLE; - std::vector sensors_; + std::vector sensors_; // our list of active sensors - bool registered_ha_[MAX_SENSORS]; - - int8_t scancnt_ = SCAN_START; - uint8_t firstscan_ = 0; - uint8_t dallas_gpio_ = 0; - bool parasite_ = false; - bool changed_ = false; - uint32_t sensorfails_ = 0; - uint32_t sensorreads_ = 0; - int8_t scanretry_ = 0; - uint8_t dallas_format_ = 0; + int8_t scancnt_ = SCAN_START; + uint8_t firstscan_ = 0; + uint8_t dallas_gpio_ = 0; + bool parasite_ = false; + bool changed_ = false; + uint32_t sensorfails_ = 0; + uint32_t sensorreads_ = 0; + int8_t scanretry_ = 0; }; } // namespace emsesp diff --git a/src/default_settings.h b/src/default_settings.h index f35839d26..702289957 100644 --- a/src/default_settings.h +++ b/src/default_settings.h @@ -88,6 +88,10 @@ #define EMSESP_DEFAULT_ANALOG_ENABLED false #endif +#ifndef EMSESP_DEFAULT_TELNET_ENABLED +#define EMSESP_DEFAULT_TELNET_ENABLED false +#endif + #ifndef EMSESP_DEFAULT_BOARD_PROFILE #define EMSESP_DEFAULT_BOARD_PROFILE "S32" // Gateway S32 #endif @@ -124,10 +128,6 @@ #define EMSESP_DEFAULT_BOOL_FORMAT 1 // on/off #endif -#ifndef EMSESP_DEFAULT_DALLAS_FORMAT -#define EMSESP_DEFAULT_DALLAS_FORMAT 1 // sensorid -#endif - #ifndef EMSESP_DEFAULT_HA_CLIMATE_FORMAT #define EMSESP_DEFAULT_HA_CLIMATE_FORMAT 1 // current temp #endif @@ -152,6 +152,14 @@ #define EMSESP_DEFAULT_NESTED_FORMAT 1 #endif +#ifndef EMSESP_DEFAULT_DISCOVERY_PREFIX +#define EMSESP_DEFAULT_DISCOVERY_PREFIX "homeassistant" +#endif + +#ifndef EMSESP_DEFAULT_PUBLISH_SINGLE +#define EMSESP_DEFAULT_PUBLISH_SINGLE false +#endif + #ifndef EMSESP_DEFAULT_SEND_RESPONSE #define EMSESP_DEFAULT_SEND_RESPONSE false #endif @@ -164,6 +172,14 @@ #define EMSESP_DEFAULT_SENSOR_NAME "" #endif +#ifndef EMSESP_DEFAULT_ANALOG_NAME +#define EMSESP_DEFAULT_ANALOG_NAME "" +#endif + +#ifndef EMSESP_DEFAULT_ANALOG_UOM +#define EMSESP_DEFAULT_ANALOG_UOM "mV" +#endif + #ifndef EMSESP_DEFAULT_WEBLOG_LEVEL #define EMSESP_DEFAULT_WEBLOG_LEVEL 6 // INFO #endif @@ -176,4 +192,24 @@ #define EMSESP_DEFAULT_WEBLOG_COMPACT true #endif +// matches Web UI settings +enum { + + BOOL_FORMAT_ONOFF_STR = 1, + BOOL_FORMAT_ONOFF_STR_CAP, + BOOL_FORMAT_TRUEFALSE_STR, + BOOL_FORMAT_TRUEFALSE, + BOOL_FORMAT_10_STR, + BOOL_FORMAT_10 + +}; + +enum { + + ENUM_FORMAT_VALUE = 1, + ENUM_FORMAT_INDEX // 2 + +}; + + #endif diff --git a/src/device_library.h b/src/device_library.h index 3b4ab0b60..937b2e0f6 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -26,12 +26,14 @@ // Boilers - 0x08 { 64, DeviceType::BOILER, F("BK13/BK15/Smartline/GB1x2"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, { 72, DeviceType::BOILER, F("GB125/MC10"), DeviceFlags::EMS_DEVICE_FLAG_EMS}, +{ 81, DeviceType::BOILER, F("Cascade CM10"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, { 84, DeviceType::BOILER, F("Logamax Plus GB022"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, { 95, DeviceType::BOILER, F("Condens 2500/Logamax/Logomatic/Cerapur Top/Greenstar/Generic HT3"), DeviceFlags::EMS_DEVICE_FLAG_HT3}, {115, DeviceType::BOILER, F("Topline/GB162"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {122, DeviceType::BOILER, F("Proline"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {123, DeviceType::BOILER, F("GBx72/Trendline/Cerapur/Greenstar Si/27i"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {131, DeviceType::BOILER, F("GB212"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{132, DeviceType::BOILER, F("GC7000F"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {133, DeviceType::BOILER, F("Logano GB125/KB195i/Logamatic MC110"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {167, DeviceType::BOILER, F("Cerapur Aero"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {170, DeviceType::BOILER, F("Logano GB212"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, @@ -42,11 +44,12 @@ {208, DeviceType::BOILER, F("Logamax Plus/GB192/Condens GC9000"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {210, DeviceType::BOILER, F("Cascade MC400"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {211, DeviceType::BOILER, F("EasyControl Adapter"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, -{234, DeviceType::BOILER, F("Logamax Plus GB122"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{234, DeviceType::BOILER, F("Logamax Plus GB122/Condense 2300"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {206, DeviceType::BOILER, F("Ecomline Excellent"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Controllers - 0x09 / 0x10 / 0x50 { 68, DeviceType::CONTROLLER, F("BC10/RFM20"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 +{ 81, DeviceType::CONTROLLER, F("CM10"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, { 84, DeviceType::CONTROLLER, F("GB022"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, { 89, DeviceType::CONTROLLER, F("BC10 GB142"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 { 95, DeviceType::CONTROLLER, F("HT3"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 @@ -61,6 +64,7 @@ {209, DeviceType::CONTROLLER, F("ErP"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {218, DeviceType::CONTROLLER, F("M200/RFM200"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x50 {224, DeviceType::CONTROLLER, F("9000i"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 +{229, DeviceType::CONTROLLER, F("8700i"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {230, DeviceType::CONTROLLER, F("BC Base"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {240, DeviceType::CONTROLLER, F("Rego 3000"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {241, DeviceType::CONTROLLER, F("Condens 5000i"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 @@ -80,7 +84,7 @@ { 90, DeviceType::THERMOSTAT, F("RC10/Moduline 100"), DeviceFlags::EMS_DEVICE_FLAG_RC20_N}, // 0x17 { 93, DeviceType::THERMOSTAT, F("RC20RF"), DeviceFlags::EMS_DEVICE_FLAG_RC20}, // 0x19 { 94, DeviceType::THERMOSTAT, F("RFM20 Remote"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x18 -{151, DeviceType::THERMOSTAT, F("RC25"), DeviceFlags::EMS_DEVICE_FLAG_RC20_N}, // 0x17 +{151, DeviceType::THERMOSTAT, F("RC25"), DeviceFlags::EMS_DEVICE_FLAG_RC25}, // 0x17 {157, DeviceType::THERMOSTAT, F("RC200/CW100"), DeviceFlags::EMS_DEVICE_FLAG_RC100}, // 0x18 {158, DeviceType::THERMOSTAT, F("RC300/RC310/Moduline 3000/1010H/CW400/Sense II"), DeviceFlags::EMS_DEVICE_FLAG_RC300}, // 0x10 {165, DeviceType::THERMOSTAT, F("RC100/Moduline 1000/1010"), DeviceFlags::EMS_DEVICE_FLAG_RC100}, // 0x18, 0x38 @@ -109,13 +113,13 @@ {163, DeviceType::SOLAR, F("SM100/MS100"), DeviceFlags::EMS_DEVICE_FLAG_SM100}, {164, DeviceType::SOLAR, F("SM200/MS200"), DeviceFlags::EMS_DEVICE_FLAG_SM100}, -// Mixer Modules - 0x20-0x27 for HC, 0x28-0x29 for WWC +// Mixer Modules - 0x20-0x27 for HC, 0x28-0x29 for WWC and 0x11 for the MP100 { 69, DeviceType::MIXER, F("MM10"), DeviceFlags::EMS_DEVICE_FLAG_MM10}, {102, DeviceType::MIXER, F("IPM"), DeviceFlags::EMS_DEVICE_FLAG_IPM}, {159, DeviceType::MIXER, F("MM50"), DeviceFlags::EMS_DEVICE_FLAG_MMPLUS}, {160, DeviceType::MIXER, F("MM100"), DeviceFlags::EMS_DEVICE_FLAG_MMPLUS}, {161, DeviceType::MIXER, F("MM200"), DeviceFlags::EMS_DEVICE_FLAG_MMPLUS}, -{204, DeviceType::MIXER, F("MP100"), DeviceFlags::EMS_DEVICE_FLAG_MP}, +{204, DeviceType::MIXER, F("MP100"), DeviceFlags::EMS_DEVICE_FLAG_MP}, // pool // Heat Pumps - 0x38 {200, DeviceType::HEATPUMP, F("HP Module"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, @@ -126,7 +130,7 @@ {205, DeviceType::CONNECT, F("Moduline Easy Connect"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {206, DeviceType::CONNECT, F("Easy Connect"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, -// wireless sensor base- 0x50 +// Wireless sensor base - 0x50 {236, DeviceType::CONNECT, F("Wireless sensor base"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Switches - 0x11 @@ -135,7 +139,7 @@ // Gateways - 0x48 {189, DeviceType::GATEWAY, F("KM200/MB LAN 2"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, -// generic - 0x40 or other with no product-id and no version +// Generic - 0x40 or other with no product-id and no version {0, DeviceType::GENERIC, F("unknown"), DeviceFlags::EMS_DEVICE_FLAG_NONE} // clang-format on diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index c942f5009..b143e8dbb 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -24,27 +24,27 @@ REGISTER_FACTORY(Boiler, EMSdevice::DeviceType::BOILER) uuid::log::Logger Boiler::logger_{F_(boiler), uuid::log::Facility::CONSOLE}; -Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { // cascaded heatingsources, only some values per individual heatsource (hs) if (device_id != EMSdevice::EMS_DEVICE_ID_BOILER) { uint8_t hs = device_id - EMSdevice::EMS_DEVICE_ID_BOILER_1; // heating source id, count from 0 // Runtime of each heatingsource in 0x06DC, ff register_telegram_type(0x6DC + hs, F("CascadeMessage"), false, MAKE_PF_CB(process_CascadeMessage)); - register_device_value(TAG_HS1 + hs, &burnWorkMin_, DeviceValueType::TIME, nullptr, FL_(burnWorkMin), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &burnWorkMin_, DeviceValueType::TIME, nullptr, FL_(burnWorkMin), DeviceValueUOM::MINUTES); // selBurnpower in D2 and E4 // register_telegram_type(0xD2, F("CascadePowerMessage"), false, MAKE_PF_CB(process_CascadePowerMessage)); // individual Flowtemps and powervalues for each heatingsource in E4 register_telegram_type(0xE4, F("UBAMonitorFastPlus"), false, MAKE_PF_CB(process_UBAMonitorFastPlus)); - register_device_value(TAG_HS1 + hs, &selFlowTemp_, DeviceValueType::UINT, nullptr, FL_(selFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_HS1 + hs, &selBurnPow_, DeviceValueType::UINT, nullptr, FL_(selBurnPow), DeviceValueUOM::PERCENT); - register_device_value(TAG_HS1 + hs, &curFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(curFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_HS1 + hs, &curBurnPow_, DeviceValueType::UINT, nullptr, FL_(curBurnPow), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selFlowTemp_, DeviceValueType::UINT, nullptr, FL_(selFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selBurnPow_, DeviceValueType::UINT, nullptr, FL_(selBurnPow), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &curFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(curFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &curBurnPow_, DeviceValueType::UINT, nullptr, FL_(curBurnPow), DeviceValueUOM::PERCENT); return; } // register values for master boiler/cascade module - reserve_telgram_functions(25); // reserve some space for the telegram registries, to avoid memory fragmentation + // reserve_telegram_functions(25); // reserve some space for the telegram registries, to avoid memory fragmentation // the telegram handlers... // common for all boilers @@ -88,213 +88,296 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x48A, F("HpPool"), true, MAKE_PF_CB(process_HpPool)); } - // MQTT commands for boiler topic + // reset is a command uses a dummy variable which is always zero, shown as blank, but provides command enum options + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &reset_, DeviceValueType::CMD, FL_(enum_reset), FL_(reset), DeviceValueUOM::NONE, MAKE_CF_CB(set_reset)); + has_update(reset_, 0); - register_device_value(TAG_BOILER_DATA, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); - id_ = product_id; // note, must set the value after it has been initialized to have affect - - // first commands - register_device_value(TAG_BOILER_DATA, - &wwTapActivated_, - DeviceValueType::CMD, - FL_(enum_bool), - FL_(wwtapactivated), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_tapwarmwater_activated)); - - // reset is a command, so uses a dummy variable which is unused. It will not be shown in MQTT, Web or Console - register_device_value(TAG_BOILER_DATA, &dummy8u_, DeviceValueType::CMD, FL_(enum_reset), FL_(reset), DeviceValueUOM::NONE, MAKE_CF_CB(set_reset)); - - register_device_value(TAG_BOILER_DATA, &heatingActive_, DeviceValueType::BOOL, nullptr, FL_(heatingActive), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &tapwaterActive_, DeviceValueType::BOOL, nullptr, FL_(tapwaterActive), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &selFlowTemp_, DeviceValueType::UINT, nullptr, FL_(selFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flow_temp)); - register_device_value(TAG_BOILER_DATA, &selBurnPow_, DeviceValueType::UINT, nullptr, FL_(selBurnPow), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_burn_power)); - register_device_value(TAG_BOILER_DATA, &heatingPumpMod_, DeviceValueType::UINT, nullptr, FL_(heatingPumpMod), DeviceValueUOM::PERCENT); - register_device_value(TAG_BOILER_DATA, &heatingPump2Mod_, DeviceValueType::UINT, nullptr, FL_(heatingPump2Mod), DeviceValueUOM::PERCENT); - register_device_value(TAG_BOILER_DATA, &outdoorTemp_, DeviceValueType::SHORT, FL_(div10), FL_(outdoorTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &curFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(curFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &retTemp_, DeviceValueType::USHORT, FL_(div10), FL_(retTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &switchTemp_, DeviceValueType::USHORT, FL_(div10), FL_(switchTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &sysPress_, DeviceValueType::UINT, FL_(div10), FL_(sysPress), DeviceValueUOM::BAR); - register_device_value(TAG_BOILER_DATA, &boilTemp_, DeviceValueType::USHORT, FL_(div10), FL_(boilTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &exhaustTemp_, DeviceValueType::USHORT, FL_(div10), FL_(exhaustTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &burnGas_, DeviceValueType::BOOL, nullptr, FL_(burnGas), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &flameCurr_, DeviceValueType::USHORT, FL_(div10), FL_(flameCurr), DeviceValueUOM::UA); - register_device_value(TAG_BOILER_DATA, &heatingPump_, DeviceValueType::BOOL, nullptr, FL_(heatingPump), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &fanWork_, DeviceValueType::BOOL, nullptr, FL_(fanWork), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &ignWork_, DeviceValueType::BOOL, nullptr, FL_(ignWork), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatingActive_, DeviceValueType::BOOL, nullptr, FL_(heatingActive), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &tapwaterActive_, DeviceValueType::BOOL, nullptr, FL_(tapwaterActive), DeviceValueUOM::NONE); register_device_value( - TAG_BOILER_DATA, &heatingActivated_, DeviceValueType::BOOL, nullptr, FL_(heatingActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_heating_activated)); - register_device_value(TAG_BOILER_DATA, &heatingTemp_, DeviceValueType::UINT, nullptr, FL_(heatingTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_heating_temp)); - register_device_value(TAG_BOILER_DATA, &pumpModMax_, DeviceValueType::UINT, nullptr, FL_(pumpModMax), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_pump)); - register_device_value(TAG_BOILER_DATA, &pumpModMin_, DeviceValueType::UINT, nullptr, FL_(pumpModMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_pump)); - register_device_value(TAG_BOILER_DATA, &pumpDelay_, DeviceValueType::UINT, nullptr, FL_(pumpDelay), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_pump_delay)); - register_device_value(TAG_BOILER_DATA, &burnMinPeriod_, DeviceValueType::UINT, nullptr, FL_(burnMinPeriod), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_burn_period)); - register_device_value(TAG_BOILER_DATA, &burnMinPower_, DeviceValueType::UINT, nullptr, FL_(burnMinPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_power)); - register_device_value(TAG_BOILER_DATA, &burnMaxPower_, DeviceValueType::UINT, nullptr, FL_(burnMaxPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_power)); - register_device_value(TAG_BOILER_DATA, &boilHystOn_, DeviceValueType::INT, nullptr, FL_(boilHystOn), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_hyst_on)); - register_device_value(TAG_BOILER_DATA, &boilHystOff_, DeviceValueType::INT, nullptr, FL_(boilHystOff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_hyst_off)); - register_device_value(TAG_BOILER_DATA, &setFlowTemp_, DeviceValueType::UINT, nullptr, FL_(setFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &setBurnPow_, DeviceValueType::UINT, nullptr, FL_(setBurnPow), DeviceValueUOM::PERCENT); - register_device_value(TAG_BOILER_DATA, &curBurnPow_, DeviceValueType::UINT, nullptr, FL_(curBurnPow), DeviceValueUOM::PERCENT); - register_device_value(TAG_BOILER_DATA, &burnStarts_, DeviceValueType::ULONG, nullptr, FL_(burnStarts), DeviceValueUOM::TIMES); - register_device_value(TAG_BOILER_DATA, &burnWorkMin_, DeviceValueType::TIME, nullptr, FL_(burnWorkMin), DeviceValueUOM::MINUTES); - register_device_value(TAG_BOILER_DATA, &heatWorkMin_, DeviceValueType::TIME, nullptr, FL_(heatWorkMin), DeviceValueUOM::MINUTES); - register_device_value(TAG_BOILER_DATA, &UBAuptime_, DeviceValueType::TIME, nullptr, FL_(UBAuptime), DeviceValueUOM::MINUTES); - register_device_value(TAG_BOILER_DATA, &lastCode_, DeviceValueType::STRING, nullptr, FL_(lastCode), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &serviceCode_, DeviceValueType::STRING, nullptr, FL_(serviceCode), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &serviceCodeNumber_, DeviceValueType::USHORT, nullptr, FL_(serviceCodeNumber), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &maintenanceMessage_, DeviceValueType::STRING, nullptr, FL_(maintenanceMessage), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, + DeviceValueTAG::TAG_BOILER_DATA, &selFlowTemp_, DeviceValueType::UINT, nullptr, FL_(selFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flow_temp)); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA, &selBurnPow_, DeviceValueType::UINT, nullptr, FL_(selBurnPow), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_burn_power)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatingPumpMod_, DeviceValueType::UINT, nullptr, FL_(heatingPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatingPump2Mod_, DeviceValueType::UINT, nullptr, FL_(heatingPump2Mod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &outdoorTemp_, DeviceValueType::SHORT, FL_(div10), FL_(outdoorTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &curFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(curFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &retTemp_, DeviceValueType::USHORT, FL_(div10), FL_(retTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &switchTemp_, DeviceValueType::USHORT, FL_(div10), FL_(switchTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &sysPress_, DeviceValueType::UINT, FL_(div10), FL_(sysPress), DeviceValueUOM::BAR); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &boilTemp_, DeviceValueType::USHORT, FL_(div10), FL_(boilTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &exhaustTemp_, DeviceValueType::USHORT, FL_(div10), FL_(exhaustTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &burnGas_, DeviceValueType::BOOL, nullptr, FL_(burnGas), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &burnGas2_, DeviceValueType::BOOL, nullptr, FL_(burnGas2), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &flameCurr_, DeviceValueType::USHORT, FL_(div10), FL_(flameCurr), DeviceValueUOM::UA); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatingPump_, DeviceValueType::BOOL, nullptr, FL_(heatingPump), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &fanWork_, DeviceValueType::BOOL, nullptr, FL_(fanWork), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &ignWork_, DeviceValueType::BOOL, nullptr, FL_(ignWork), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &oilPreHeat_, DeviceValueType::BOOL, nullptr, FL_(oilPreHeat), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &heatingActivated_, + DeviceValueType::BOOL, + nullptr, + FL_(heatingActivated), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_heating_activated)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &heatingTemp_, + DeviceValueType::UINT, + nullptr, + FL_(heatingTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_heating_temp)); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA, &pumpModMax_, DeviceValueType::UINT, nullptr, FL_(pumpModMax), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_pump)); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA, &pumpModMin_, DeviceValueType::UINT, nullptr, FL_(pumpModMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_pump)); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA, &pumpDelay_, DeviceValueType::UINT, nullptr, FL_(pumpDelay), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_pump_delay)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &burnMinPeriod_, + DeviceValueType::UINT, + nullptr, + FL_(burnMinPeriod), + DeviceValueUOM::MINUTES, + MAKE_CF_CB(set_burn_period)); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA, &burnMinPower_, DeviceValueType::UINT, nullptr, FL_(burnMinPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_power)); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA, &burnMaxPower_, DeviceValueType::UINT, nullptr, FL_(burnMaxPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_power)); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA, &boilHystOn_, DeviceValueType::INT, nullptr, FL_(boilHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_hyst_on)); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA, &boilHystOff_, DeviceValueType::INT, nullptr, FL_(boilHystOff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_hyst_off)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &setFlowTemp_, DeviceValueType::UINT, nullptr, FL_(setFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &setBurnPow_, DeviceValueType::UINT, nullptr, FL_(setBurnPow), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &curBurnPow_, DeviceValueType::UINT, nullptr, FL_(curBurnPow), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &burnStarts_, DeviceValueType::ULONG, nullptr, FL_(burnStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &burnWorkMin_, DeviceValueType::TIME, nullptr, FL_(burnWorkMin), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatWorkMin_, DeviceValueType::TIME, nullptr, FL_(heatWorkMin), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &UBAuptime_, DeviceValueType::TIME, nullptr, FL_(UBAuptime), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &lastCode_, DeviceValueType::STRING, nullptr, FL_(lastCode), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &serviceCode_, DeviceValueType::STRING, nullptr, FL_(serviceCode), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &serviceCodeNumber_, DeviceValueType::USHORT, nullptr, FL_(serviceCodeNumber), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &maintenanceMessage_, DeviceValueType::STRING, nullptr, FL_(maintenanceMessage), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &maintenanceType_, DeviceValueType::ENUM, - FL_(enum_off_time_date), + FL_(enum_off_time_date_manual), FL_(maintenanceType), DeviceValueUOM::NONE, MAKE_CF_CB(set_maintenance)); - register_device_value( - TAG_BOILER_DATA, &maintenanceTime_, DeviceValueType::USHORT, nullptr, FL_(maintenanceTime), DeviceValueUOM::HOURS, MAKE_CF_CB(set_maintenancetime)); - register_device_value( - TAG_BOILER_DATA, &maintenanceDate_, DeviceValueType::STRING, nullptr, FL_(maintenanceDate), DeviceValueUOM::NONE, MAKE_CF_CB(set_maintenancedate)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &maintenanceTime_, + DeviceValueType::USHORT, + nullptr, + FL_(maintenanceTime), + DeviceValueUOM::HOURS, + MAKE_CF_CB(set_maintenancetime)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &maintenanceDate_, + DeviceValueType::STRING, + FL_(tpl_date), + FL_(maintenanceDate), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_maintenancedate)); + // heatpump info if (model() == EMS_DEVICE_FLAG_HEATPUMP) { - register_device_value(TAG_BOILER_DATA, &upTimeControl_, DeviceValueType::TIME, FL_(div60), FL_(upTimeControl), DeviceValueUOM::MINUTES); - register_device_value(TAG_BOILER_DATA, &upTimeCompHeating_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompHeating), DeviceValueUOM::MINUTES); - register_device_value(TAG_BOILER_DATA, &upTimeCompCooling_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompCooling), DeviceValueUOM::MINUTES); - register_device_value(TAG_BOILER_DATA, &upTimeCompWw_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompWw), DeviceValueUOM::MINUTES); - register_device_value(TAG_BOILER_DATA, &upTimeCompPool_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompPool), DeviceValueUOM::MINUTES); - register_device_value(TAG_BOILER_DATA, &totalCompStarts_, DeviceValueType::ULONG, nullptr, FL_(totalcompStarts), DeviceValueUOM::TIMES); - register_device_value(TAG_BOILER_DATA, &heatingStarts_, DeviceValueType::ULONG, nullptr, FL_(heatingStarts), DeviceValueUOM::TIMES); - register_device_value(TAG_BOILER_DATA, &coolingStarts_, DeviceValueType::ULONG, nullptr, FL_(coolingStarts), DeviceValueUOM::TIMES); - register_device_value(TAG_BOILER_DATA, &wwStarts2_, DeviceValueType::ULONG, nullptr, FL_(wwStarts2), DeviceValueUOM::TIMES); - register_device_value(TAG_BOILER_DATA, &poolStarts_, DeviceValueType::ULONG, nullptr, FL_(poolStarts), DeviceValueUOM::TIMES); - register_device_value(TAG_BOILER_DATA, &nrgConsTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgConsTotal), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgConsCompTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompTotal), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgConsCompHeating_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompHeating), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgConsCompWw_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompWw), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgConsCompCooling_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompCooling), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgConsCompPool_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompPool), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &auxElecHeatNrgConsTotal_, DeviceValueType::ULONG, nullptr, FL_(auxElecHeatNrgConsTotal), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &auxElecHeatNrgConsHeating_, DeviceValueType::ULONG, nullptr, FL_(auxElecHeatNrgConsHeating), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &auxElecHeatNrgConsWW_, DeviceValueType::ULONG, nullptr, FL_(auxElecHeatNrgConsWW), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &auxElecHeatNrgConsPool_, DeviceValueType::ULONG, nullptr, FL_(auxElecHeatNrgConsPool), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgSuppTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppTotal), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgSuppHeating_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppHeating), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgSuppWw_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppWw), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgSuppCooling_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppCooling), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &nrgSuppPool_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppPool), DeviceValueUOM::KWH); - register_device_value(TAG_BOILER_DATA, &hpPower_, DeviceValueType::UINT, FL_(div10), FL_(hpPower), DeviceValueUOM::KW); - register_device_value(TAG_BOILER_DATA, &hpCompOn_, DeviceValueType::BOOL, nullptr, FL_(hpCompOn), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &hpActivity_, DeviceValueType::ENUM, FL_(enum_hpactivity), FL_(hpActivity), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &hpHeatingOn_, DeviceValueType::BOOL, nullptr, FL_(hpHeatingOn), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &hpCoolingOn_, DeviceValueType::BOOL, nullptr, FL_(hpCoolingOn), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &hpWwOn_, DeviceValueType::BOOL, nullptr, FL_(hpWwOn), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &hpPoolOn_, DeviceValueType::BOOL, nullptr, FL_(hpPoolOn), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &hpBrinePumpSpd_, DeviceValueType::UINT, nullptr, FL_(hpBrinePumpSpd), DeviceValueUOM::PERCENT); - register_device_value(TAG_BOILER_DATA, &hpSwitchValve_, DeviceValueType::BOOL, nullptr, FL_(hpSwitchValve), DeviceValueUOM::NONE); - register_device_value(TAG_BOILER_DATA, &hpCompSpd_, DeviceValueType::UINT, nullptr, FL_(hpCompSpd), DeviceValueUOM::PERCENT); - register_device_value(TAG_BOILER_DATA, &hpCircSpd_, DeviceValueType::UINT, nullptr, FL_(hpCircSpd), DeviceValueUOM::PERCENT); - register_device_value(TAG_BOILER_DATA, &hpBrineIn_, DeviceValueType::SHORT, FL_(div10), FL_(hpBrineIn), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpBrineOut_, DeviceValueType::SHORT, FL_(div10), FL_(hpBrineOut), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpSuctionGas_, DeviceValueType::SHORT, FL_(div10), FL_(hpSuctionGas), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpHotGas_, DeviceValueType::SHORT, FL_(div10), FL_(hpHotGas), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTc0_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc0), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTc1_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc1), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTc3_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc3), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTr3_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr3), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTr4_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr4), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTr5_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr5), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTr6_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr6), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTr7_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr7), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpTl2_, DeviceValueType::SHORT, FL_(div10), FL_(hpTl2), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpPl1_, DeviceValueType::SHORT, FL_(div10), FL_(hpPl1), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &hpPh1_, DeviceValueType::SHORT, FL_(div10), FL_(hpPh1), DeviceValueUOM::DEGREES); - register_device_value(TAG_BOILER_DATA, &poolSetTemp_, DeviceValueType::UINT, FL_(div2), FL_(poolSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_pool_temp)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &upTimeControl_, DeviceValueType::TIME, FL_(div60), FL_(upTimeControl), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &upTimeCompHeating_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompHeating), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &upTimeCompCooling_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompCooling), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &upTimeCompWw_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompWw), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &upTimeCompPool_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompPool), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &totalCompStarts_, DeviceValueType::ULONG, nullptr, FL_(totalCompStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatingStarts_, DeviceValueType::ULONG, nullptr, FL_(heatingStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &coolingStarts_, DeviceValueType::ULONG, nullptr, FL_(coolingStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &wwStarts2_, DeviceValueType::ULONG, nullptr, FL_(wwStarts2), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &poolStarts_, DeviceValueType::ULONG, nullptr, FL_(poolStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgConsTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgConsTotal), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgConsCompTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompTotal), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgConsCompHeating_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompHeating), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgConsCompWw_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompWw), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgConsCompCooling_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompCooling), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgConsCompPool_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompPool), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &auxElecHeatNrgConsTotal_, + DeviceValueType::ULONG, + nullptr, + FL_(auxElecHeatNrgConsTotal), + DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &auxElecHeatNrgConsHeating_, + DeviceValueType::ULONG, + nullptr, + FL_(auxElecHeatNrgConsHeating), + DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &auxElecHeatNrgConsWW_, + DeviceValueType::ULONG, + nullptr, + FL_(auxElecHeatNrgConsWW), + DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &auxElecHeatNrgConsPool_, + DeviceValueType::ULONG, + nullptr, + FL_(auxElecHeatNrgConsPool), + DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgSuppTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppTotal), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgSuppHeating_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppHeating), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgSuppWw_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppWw), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgSuppCooling_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppCooling), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgSuppPool_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppPool), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpPower_, DeviceValueType::UINT, FL_(div10), FL_(hpPower), DeviceValueUOM::KW); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpCompOn_, DeviceValueType::BOOL, nullptr, FL_(hpCompOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpActivity_, DeviceValueType::ENUM, FL_(enum_hpactivity), FL_(hpActivity), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpHeatingOn_, DeviceValueType::BOOL, nullptr, FL_(hpHeatingOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpCoolingOn_, DeviceValueType::BOOL, nullptr, FL_(hpCoolingOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpWwOn_, DeviceValueType::BOOL, nullptr, FL_(hpWwOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpPoolOn_, DeviceValueType::BOOL, nullptr, FL_(hpPoolOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpBrinePumpSpd_, DeviceValueType::UINT, nullptr, FL_(hpBrinePumpSpd), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpSwitchValve_, DeviceValueType::BOOL, nullptr, FL_(hpSwitchValve), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpCompSpd_, DeviceValueType::UINT, nullptr, FL_(hpCompSpd), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpCircSpd_, DeviceValueType::UINT, nullptr, FL_(hpCircSpd), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpBrineIn_, DeviceValueType::SHORT, FL_(div10), FL_(hpBrineIn), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpBrineOut_, DeviceValueType::SHORT, FL_(div10), FL_(hpBrineOut), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpSuctionGas_, DeviceValueType::SHORT, FL_(div10), FL_(hpSuctionGas), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpHotGas_, DeviceValueType::SHORT, FL_(div10), FL_(hpHotGas), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTc0_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc0), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTc1_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTc3_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc3), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTr3_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr3), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTr4_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr4), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTr5_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr5), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTr6_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr6), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTr7_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr7), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpTl2_, DeviceValueType::SHORT, FL_(div10), FL_(hpTl2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpPl1_, DeviceValueType::SHORT, FL_(div10), FL_(hpPl1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &hpPh1_, DeviceValueType::SHORT, FL_(div10), FL_(hpPh1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &poolSetTemp_, + DeviceValueType::UINT, + FL_(div2), + FL_(poolSetTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_pool_temp)); } - // warm water - boiler_data_ww topic - register_device_value(TAG_DEVICE_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_temp)); - register_device_value(TAG_DEVICE_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwSelTempLow_, DeviceValueType::UINT, nullptr, FL_(wwSelTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_temp_low)); - register_device_value(TAG_DEVICE_DATA_WW, &wwSelTempOff_, DeviceValueType::UINT, nullptr, FL_(wwSelTempOff), DeviceValueUOM::DEGREES); + // dhw - boiler_data_ww topic + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwTapActivated_, + DeviceValueType::BOOL, + nullptr, + FL_(wwtapactivated), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_tapwarmwater_activated)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES); register_device_value( - TAG_DEVICE_DATA_WW, &wwSelTempSingle_, DeviceValueType::UINT, nullptr, FL_(wwSelTempSingle), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_temp_single)); - register_device_value(TAG_DEVICE_DATA_WW, &wwType_, DeviceValueType::ENUM, FL_(enum_flow), FL_(wwType), DeviceValueUOM::NONE); - register_device_value(TAG_DEVICE_DATA_WW, &wwComfort_, DeviceValueType::ENUM, FL_(enum_comfort), FL_(wwComfort), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_mode)); + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_temp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwSelTempLow_, + DeviceValueType::UINT, + nullptr, + FL_(wwSelTempLow), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_ww_temp_low)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSelTempOff_, DeviceValueType::UINT, nullptr, FL_(wwSelTempOff), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwSelTempSingle_, + DeviceValueType::UINT, + nullptr, + FL_(wwSelTempSingle), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_ww_temp_single)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwType_, DeviceValueType::ENUM, FL_(enum_flow), FL_(wwType), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwComfort_, + DeviceValueType::ENUM, + FL_(enum_comfort), + FL_(wwComfort), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_mode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwFlowTempOffset_, + DeviceValueType::UINT, + nullptr, + FL_(wwFlowTempOffset), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_ww_flowTempOffset)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwMaxPower_, + DeviceValueType::UINT, + nullptr, + FL_(wwMaxPower), + DeviceValueUOM::PERCENT, + MAKE_CF_CB(set_ww_maxpower)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircPump_, + DeviceValueType::BOOL, + nullptr, + FL_(wwCircPump), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_circulation_pump)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwChargeType_, DeviceValueType::ENUM, FL_(enum_charge), FL_(wwChargeType), DeviceValueUOM::NONE); register_device_value( - TAG_DEVICE_DATA_WW, &wwFlowTempOffset_, DeviceValueType::UINT, nullptr, FL_(wwFlowTempOffset), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_flowTempOffset)); - register_device_value(TAG_DEVICE_DATA_WW, &wwMaxPower_, DeviceValueType::UINT, nullptr, FL_(wwMaxPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_ww_maxpower)); + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwHystOn_, DeviceValueType::INT, nullptr, FL_(wwHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_ww_hyst_on)); register_device_value( - TAG_DEVICE_DATA_WW, &wwCircPump_, DeviceValueType::BOOL, nullptr, FL_(wwCircPump), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_circulation_pump)); - register_device_value(TAG_DEVICE_DATA_WW, &wwChargeType_, DeviceValueType::ENUM, FL_(enum_charge), FL_(wwChargeType), DeviceValueUOM::NONE); - register_device_value(TAG_DEVICE_DATA_WW, &wwHystOn_, DeviceValueType::INT, nullptr, FL_(wwHystOn), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_hyst_on)); - register_device_value(TAG_DEVICE_DATA_WW, &wwHystOff_, DeviceValueType::INT, nullptr, FL_(wwHystOff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_hyst_off)); - register_device_value(TAG_DEVICE_DATA_WW, + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwHystOff_, DeviceValueType::INT, nullptr, FL_(wwHystOff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_ww_hyst_off)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectionTemp_, DeviceValueType::UINT, nullptr, FL_(wwDisinfectionTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_disinfect_temp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircMode_, + DeviceValueType::ENUM, + FL_(enum_freq), + FL_(wwCircMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_circulation_mode)); register_device_value( - TAG_DEVICE_DATA_WW, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_freq), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_circulation_mode)); - register_device_value(TAG_DEVICE_DATA_WW, &wwCirc_, DeviceValueType::BOOL, nullptr, FL_(wwCirc), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_circulation)); - register_device_value(TAG_DEVICE_DATA_WW, &wwCurTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwCurTemp2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwCurFlow_, DeviceValueType::UINT, FL_(div10), FL_(wwCurFlow), DeviceValueUOM::LMIN); - register_device_value(TAG_DEVICE_DATA_WW, &wwStorageTemp1_, DeviceValueType::USHORT, FL_(div10), FL_(wwStorageTemp1), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwStorageTemp2_, DeviceValueType::USHORT, FL_(div10), FL_(wwStorageTemp2), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwActivated_, DeviceValueType::BOOL, nullptr, FL_(wwActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_activated)); - register_device_value(TAG_DEVICE_DATA_WW, &wwOneTime_, DeviceValueType::BOOL, nullptr, FL_(wwOneTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_onetime)); - register_device_value(TAG_DEVICE_DATA_WW, &wwDisinfect_, DeviceValueType::BOOL, nullptr, FL_(wwDisinfect), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_disinfect)); - register_device_value(TAG_DEVICE_DATA_WW, &wwCharging_, DeviceValueType::BOOL, nullptr, FL_(wwCharging), DeviceValueUOM::NONE); - register_device_value(TAG_DEVICE_DATA_WW, &wwRecharging_, DeviceValueType::BOOL, nullptr, FL_(wwRecharging), DeviceValueUOM::NONE); - register_device_value(TAG_DEVICE_DATA_WW, &wwTempOK_, DeviceValueType::BOOL, nullptr, FL_(wwTempOK), DeviceValueUOM::NONE); - register_device_value(TAG_DEVICE_DATA_WW, &wwActive_, DeviceValueType::BOOL, nullptr, FL_(wwActive), DeviceValueUOM::NONE); - register_device_value(TAG_DEVICE_DATA_WW, &wwHeat_, DeviceValueType::BOOL, nullptr, FL_(wwHeat), DeviceValueUOM::NONE); - register_device_value(TAG_DEVICE_DATA_WW, &wwSetPumpPower_, DeviceValueType::UINT, nullptr, FL_(wwSetPumpPower), DeviceValueUOM::PERCENT); - register_device_value(TAG_DEVICE_DATA_WW, &wwMixerTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwMixerTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwTankMiddleTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwTankMiddleTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwStarts_, DeviceValueType::ULONG, nullptr, FL_(wwStarts), DeviceValueUOM::TIMES); - register_device_value(TAG_DEVICE_DATA_WW, &wwWorkM_, DeviceValueType::TIME, nullptr, FL_(wwWorkM), DeviceValueUOM::MINUTES); + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCirc_, DeviceValueType::BOOL, nullptr, FL_(wwCirc), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_circulation)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCurTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCurTemp2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCurFlow_, DeviceValueType::UINT, FL_(div10), FL_(wwCurFlow), DeviceValueUOM::LMIN); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwStorageTemp1_, DeviceValueType::USHORT, FL_(div10), FL_(wwStorageTemp1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwStorageTemp2_, DeviceValueType::USHORT, FL_(div10), FL_(wwStorageTemp2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwActivated_, + DeviceValueType::BOOL, + nullptr, + FL_(wwActivated), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_activated)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwOneTime_, DeviceValueType::BOOL, nullptr, FL_(wwOneTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_onetime)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfect_, + DeviceValueType::BOOL, + nullptr, + FL_(wwDisinfecting), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_disinfect)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCharging_, DeviceValueType::BOOL, nullptr, FL_(wwCharging), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwRecharging_, DeviceValueType::BOOL, nullptr, FL_(wwRecharging), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTempOK_, DeviceValueType::BOOL, nullptr, FL_(wwTempOK), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwActive_, DeviceValueType::BOOL, nullptr, FL_(wwActive), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &ww3wayValve_, DeviceValueType::BOOL, nullptr, FL_(ww3wayValve), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetPumpPower_, DeviceValueType::UINT, nullptr, FL_(wwSetPumpPower), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMixerTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwMixerTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCylMiddleTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwCylMiddleTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwStarts_, DeviceValueType::ULONG, nullptr, FL_(wwStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwWorkM_, DeviceValueType::TIME, nullptr, FL_(wwWorkM), DeviceValueUOM::MINUTES); // fetch some initial data EMSESP::send_read_request(0x10, device_id); // read last errorcode on start (only published on errors) EMSESP::send_read_request(0x11, device_id); // read last errorcode on start (only published on errors) - EMSESP::send_read_request(0xC2, device_id); // read last errorcode on start (only published on errors) EMSESP::send_read_request(0x15, device_id); // read maintenace data on start (only published on change) EMSESP::send_read_request(0x1C, device_id); // read maintenace status on start (only published on change) -} - -// publish HA config -bool Boiler::publish_ha_device_config() { - StaticJsonDocument doc; - doc["uniq_id"] = F_(boiler); - doc["ic"] = F_(icondevice); - - char stat_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(stat_t, sizeof(stat_t), "%s/%s", Mqtt::base().c_str(), Mqtt::tag_to_topic(device_type(), DeviceValueTAG::TAG_NONE).c_str()); - doc["stat_t"] = stat_t; - - char name_s[40]; - snprintf(name_s, sizeof(name_s), FSTR_(productid_fmt), device_type_name().c_str()); - doc["name"] = name_s; - - doc["val_tpl"] = FJSON("{{value_json.id}}"); - JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = FJSON("EMS-ESP Boiler"); - dev["sw"] = EMSESP_APP_VERSION; - dev["mf"] = brand_to_string(); - dev["mdl"] = name(); - JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp-boiler"); - - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/boiler/config", Mqtt::base().c_str()); - Mqtt::publish_ha(topic, - doc.as()); // publish the config payload with retain flag - - return true; + EMSESP::send_read_request(0xC2, device_id); // read last errorcode on start (only published on errors) } // Check if hot tap water or heating is active @@ -342,67 +425,45 @@ void Boiler::check_active(const bool force) { } } -// 0x33 -void Boiler::process_UBAParameterWW(std::shared_ptr telegram) { - // has_update(telegram->read_bitvalue(wwEquipt_,0,3)); // 8=boiler has ww - has_update(telegram->read_value(wwActivated_, 1)); // 0xFF means on - has_update(telegram->read_value(wwSelTemp_, 2)); - has_update(telegram->read_value(wwHystOn_, 3)); // Hyst on (default -5) - has_update(telegram->read_value(wwHystOff_, 4)); // Hyst off (default -1) - has_update(telegram->read_value(wwFlowTempOffset_, 5)); // default 40 - has_update(telegram->read_value(wwCircPump_, 6)); // 0xFF means on - has_update(telegram->read_value(wwCircMode_, 7)); // 1=1x3min 6=6x3min 7=continuous - has_update(telegram->read_value(wwDisinfectionTemp_, 8)); - has_update(telegram->read_bitvalue(wwChargeType_, 10, 0)); // 0 = charge pump, 0xff = 3-way valve - - telegram->read_value(wwComfort_, 9); - if (wwComfort_ == 0x00) { - wwComfort_ = 0; // Hot - } else if (wwComfort_ == 0xD8) { - wwComfort_ = 1; // Eco - } else if (wwComfort_ == 0xEC) { - wwComfort_ = 2; // Intelligent - } else { - wwComfort_ = EMS_VALUE_UINT_NOTSET; - } -} - // 0x18 void Boiler::process_UBAMonitorFast(std::shared_ptr telegram) { - has_update(telegram->read_value(selFlowTemp_, 0)); - has_update(telegram->read_value(curFlowTemp_, 1)); - has_update(telegram->read_value(selBurnPow_, 3)); // burn power max setting - has_update(telegram->read_value(curBurnPow_, 4)); - has_update(telegram->read_value(boilerState_, 5)); + has_update(telegram, selFlowTemp_, 0); + has_update(telegram, curFlowTemp_, 1); + has_update(telegram, selBurnPow_, 3); // burn power max setting + has_update(telegram, curBurnPow_, 4); + has_update(telegram, boilerState_, 5); - has_update(telegram->read_bitvalue(burnGas_, 7, 0)); - has_update(telegram->read_bitvalue(fanWork_, 7, 2)); - has_update(telegram->read_bitvalue(ignWork_, 7, 3)); - has_update(telegram->read_bitvalue(heatingPump_, 7, 5)); - has_update(telegram->read_bitvalue(wwHeat_, 7, 6)); - has_update(telegram->read_bitvalue(wwCirc_, 7, 7)); + has_bitupdate(telegram, burnGas_, 7, 0); + has_bitupdate(telegram, burnGas2_, 7, 1); + has_bitupdate(telegram, fanWork_, 7, 2); + has_bitupdate(telegram, ignWork_, 7, 3); + has_bitupdate(telegram, oilPreHeat_, 7, 4); + has_bitupdate(telegram, heatingPump_, 7, 5); + has_bitupdate(telegram, ww3wayValve_, 7, 6); + has_bitupdate(telegram, wwCirc_, 7, 7); - // warm water storage sensors (if present) + // dhw storage sensors (if present) // wwStorageTemp2 is also used by some brands as the boiler temperature - see https://github.com/emsesp/EMS-ESP/issues/206 - has_update(telegram->read_value(wwStorageTemp1_, 9)); // 0x8300 if not available - has_update(telegram->read_value(wwStorageTemp2_, 11)); // 0x8000 if not available - this is boiler temp + has_update(telegram, wwStorageTemp1_, 9); // 0x8300 if not available + has_update(telegram, wwStorageTemp2_, 11); // 0x8000 if not available - this is boiler temp - has_update(telegram->read_value(retTemp_, 13)); - has_update(telegram->read_value(flameCurr_, 15)); + has_update(telegram, retTemp_, 13); + has_update(telegram, flameCurr_, 15); // system pressure. FF means missing - has_update(telegram->read_value(sysPress_, 17)); // is *10 + has_update(telegram, sysPress_, 17); // is *10 // read the service code / installation status as appears on the display if ((telegram->message_length > 18) && (telegram->offset == 0)) { - serviceCode_[0] = (serviceCode_[0] == '~') ? 0xF0 : serviceCode_[0]; - has_update(telegram->read_value(serviceCode_[0], 18)); - serviceCode_[0] = (serviceCode_[0] == (char)0xF0) ? '~' : serviceCode_[0]; - has_update(telegram->read_value(serviceCode_[1], 19)); - serviceCode_[2] = '\0'; // null terminate string + char serviceCode[4]; + telegram->read_value(serviceCode[0], 18); + serviceCode[0] = (serviceCode[0] == (char)0xF0) ? '~' : serviceCode[0]; + telegram->read_value(serviceCode[1], 19); + serviceCode[2] = '\0'; // null terminate string + has_update(serviceCode_, serviceCode, sizeof(serviceCode_)); } - has_update(telegram->read_value(serviceCodeNumber_, 20)); + has_update(telegram, serviceCodeNumber_, 20); check_active(); // do a quick check to see if the hot water or heating is active } @@ -412,7 +473,7 @@ void Boiler::process_UBAMonitorFast(std::shared_ptr telegram) { * received only after requested (not broadcasted) */ void Boiler::process_UBATotalUptime(std::shared_ptr telegram) { - has_update(telegram->read_value(UBAuptime_, 0, 3)); // force to 3 bytes + has_update(telegram, UBAuptime_, 0, 3); // force to 3 bytes } /* @@ -420,17 +481,17 @@ void Boiler::process_UBATotalUptime(std::shared_ptr telegram) { * data: FF 5A 64 00 0A FA 0F 02 06 64 64 02 08 F8 0F 0F 0F 0F 1E 05 04 09 09 00 28 00 3C */ void Boiler::process_UBAParameters(std::shared_ptr telegram) { - has_update(telegram->read_value(heatingActivated_, 0)); - has_update(telegram->read_value(heatingTemp_, 1)); - has_update(telegram->read_value(burnMaxPower_, 2)); - has_update(telegram->read_value(burnMinPower_, 3)); - has_update(telegram->read_value(boilHystOff_, 4)); - has_update(telegram->read_value(boilHystOn_, 5)); - has_update(telegram->read_value(burnMinPeriod_, 6)); - // has_update(telegram->read_value(pumpType_, 7)); // 0=off, 02=? - has_update(telegram->read_value(pumpDelay_, 8)); - has_update(telegram->read_value(pumpModMax_, 9)); - has_update(telegram->read_value(pumpModMin_, 10)); + has_update(telegram, heatingActivated_, 0); + has_update(telegram, heatingTemp_, 1); + has_update(telegram, burnMaxPower_, 2); + has_update(telegram, burnMinPower_, 3); + has_update(telegram, boilHystOff_, 4); + has_update(telegram, boilHystOn_, 5); + has_update(telegram, burnMinPeriod_, 6); + //has_update(telegram, pumpType_, 7); // 0=off, 02=? + has_update(telegram, pumpDelay_, 8); + has_update(telegram, pumpModMax_, 9); + has_update(telegram, pumpModMin_, 10); } /* @@ -438,30 +499,58 @@ void Boiler::process_UBAParameters(std::shared_ptr telegram) { * Boiler(0x08) -> Me(0x0B), ?(0x26), data: 01 05 00 0F 00 1E 58 5A */ void Boiler::process_UBASettingsWW(std::shared_ptr telegram) { - has_update(telegram->read_value(wwMaxPower_, 7)); + has_update(telegram, wwMaxPower_, 7); +} + +// 0x33 +// Boiler(0x08) -> Me(0x0B), UBAParameterWW(0x33), data: 08 FF 30 FB FF 28 FF 07 46 00 00 +void Boiler::process_UBAParameterWW(std::shared_ptr telegram) { + // has_bitupdate(telegram, wwEquipt_,0,3); // 8=boiler has ww + has_update(telegram, wwActivated_, 1); // 0xFF means on + has_update(telegram, wwSelTemp_, 2); + has_update(telegram, wwHystOn_, 3); // Hyst on (default -5) + has_update(telegram, wwHystOff_, 4); // Hyst off (default -1) + has_update(telegram, wwFlowTempOffset_, 5); // default 40 + has_update(telegram, wwCircPump_, 6); // 0xFF means on + has_update(telegram, wwCircMode_, 7); // 1=1x3min 6=6x3min 7=continuous + has_update(telegram, wwDisinfectionTemp_, 8); + has_bitupdate(telegram, wwChargeType_, 10, 0); // 0 = charge pump, 0xff = 3-way valve + + uint8_t wwComfort; + telegram->read_value(wwComfort, 9); + if (wwComfort == 0) { + wwComfort = 0; // Hot + } else if (wwComfort == 0xD8) { + wwComfort = 1; // Eco + } else if (wwComfort == 0xEC) { + wwComfort = 2; // Intelligent + } else { + wwComfort = EMS_VALUE_UINT_NOTSET; + } + has_update(wwComfort_, wwComfort); } /* - * UBAMonitorWW - type 0x34 - warm water monitor. 19 bytes long + * UBAMonitorWW - type 0x34 - dhw monitor. 19 bytes long * received every 10 seconds * Boiler(0x08) -> Me(0x0B), UBAMonitorWW(0x34), data: 30 01 BA 7D 00 21 00 00 03 00 01 22 2B 00 19 5B */ void Boiler::process_UBAMonitorWW(std::shared_ptr telegram) { - has_update(telegram->read_value(wwSetTemp_, 0)); // hot water temperature target - has_update(telegram->read_value(wwCurTemp_, 1)); - has_update(telegram->read_value(wwCurTemp2_, 3)); + has_update(telegram, wwSetTemp_, 0); + has_update(telegram, wwCurTemp_, 1); + has_update(telegram, wwCurTemp2_, 3); - has_update(telegram->read_value(wwType_, 8)); - has_update(telegram->read_value(wwCurFlow_, 9)); - has_update(telegram->read_value(wwWorkM_, 10, 3)); // force to 3 bytes - has_update(telegram->read_value(wwStarts_, 13, 3)); // force to 3 bytes + has_update(telegram, wwType_, 8); + has_update(telegram, wwCurFlow_, 9); + has_update(telegram, wwWorkM_, 10, 3); // force to 3 bytes + has_update(telegram, wwStarts_, 13, 3); // force to 3 bytes - has_update(telegram->read_bitvalue(wwOneTime_, 5, 1)); - has_update(telegram->read_bitvalue(wwDisinfect_, 5, 2)); - has_update(telegram->read_bitvalue(wwCharging_, 5, 3)); - has_update(telegram->read_bitvalue(wwRecharging_, 5, 4)); - has_update(telegram->read_bitvalue(wwTempOK_, 5, 5)); - has_update(telegram->read_bitvalue(wwActive_, 5, 6)); + has_bitupdate(telegram, wwOneTime_, 5, 1); + has_bitupdate(telegram, wwDisinfect_, 5, 2); + has_bitupdate(telegram, wwCharging_, 5, 3); + has_bitupdate(telegram, wwRecharging_, 5, 4); + has_bitupdate(telegram, wwTempOK_, 5, 5); + has_bitupdate(telegram, wwActive_, 5, 6); } /* @@ -473,27 +562,32 @@ void Boiler::process_UBAMonitorWW(std::shared_ptr telegram) { + * 08 00 E4 00 10 20 2D 48 00 C8 38 02 37 3C 27 03 00 00 00 00 00 01 7B 01 8F 11 00 02 37 80 00 02 1B 80 00 7F FF 80 00 */ void Boiler::process_UBAMonitorFastPlus(std::shared_ptr telegram) { - has_update(telegram->read_value(selFlowTemp_, 6)); - has_update(telegram->read_bitvalue(burnGas_, 11, 0)); - // has_update(telegram->read_bitvalue(heatingPump_, 11, 1)); // heating active? see SlowPlus - has_update(telegram->read_bitvalue(wwHeat_, 11, 2)); - has_update(telegram->read_value(curBurnPow_, 10)); - has_update(telegram->read_value(selBurnPow_, 9)); - has_update(telegram->read_value(curFlowTemp_, 7)); - has_update(telegram->read_value(flameCurr_, 19)); - has_update(telegram->read_value(retTemp_, 17)); // can be 0 if no sensor, handled in export_values - has_update(telegram->read_value(sysPress_, 21)); + has_update(telegram, selFlowTemp_, 6); + has_bitupdate(telegram, burnGas_, 11, 0); + //has_bitupdate(telegram, heatingPump_, 11, 1); // heating active? see SlowPlus + has_bitupdate(telegram, ww3wayValve_, 11, 2); + has_update(telegram, curBurnPow_, 10); + has_update(telegram, selBurnPow_, 9); + has_update(telegram, curFlowTemp_, 7); + has_update(telegram, flameCurr_, 19); + has_update(telegram, retTemp_, 17); // can be 0 if no sensor, handled in export_values + has_update(telegram, sysPress_, 21); + + //has_update(telegram, temperatur_, 13); // unknown temperature + //has_update(telegram, temperatur_, 27); // unknown temperature // read 3 char service code / installation status as appears on the display if ((telegram->message_length > 3) && (telegram->offset == 0)) { - serviceCode_[0] = (serviceCode_[0] == '~') ? 0xF0 : serviceCode_[0]; - has_update(telegram->read_value(serviceCode_[0], 1)); - serviceCode_[0] = (serviceCode_[0] == (char)0xF0) ? '~' : serviceCode_[0]; - has_update(telegram->read_value(serviceCode_[1], 2)); - has_update(telegram->read_value(serviceCode_[2], 3)); - serviceCode_[3] = '\0'; + char serviceCode[4]; + telegram->read_value(serviceCode[0], 1); + serviceCode[0] = (serviceCode[0] == (char)0xF0) ? '~' : serviceCode[0]; + telegram->read_value(serviceCode[1], 2); + telegram->read_value(serviceCode[2], 3); + serviceCode[3] = '\0'; + has_update(serviceCode_, serviceCode, sizeof(serviceCode_)); } - has_update(telegram->read_value(serviceCodeNumber_, 4)); + + has_update(telegram, serviceCodeNumber_, 4); // at this point do a quick check to see if the hot water or heating is active uint8_t state = EMS_VALUE_UINT_NOTSET; @@ -514,14 +608,14 @@ void Boiler::process_UBAMonitorFastPlus(std::shared_ptr telegram * 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 17 19 20 21 22 23 24 */ void Boiler::process_UBAMonitorSlow(std::shared_ptr telegram) { - has_update(telegram->read_value(outdoorTemp_, 0)); - has_update(telegram->read_value(boilTemp_, 2)); - has_update(telegram->read_value(exhaustTemp_, 4)); - has_update(telegram->read_value(switchTemp_, 25)); // only if there is a mixer module present - has_update(telegram->read_value(heatingPumpMod_, 9)); - has_update(telegram->read_value(burnStarts_, 10, 3)); // force to 3 bytes - has_update(telegram->read_value(burnWorkMin_, 13, 3)); // force to 3 bytes - has_update(telegram->read_value(heatWorkMin_, 19, 3)); // force to 3 bytes + has_update(telegram, outdoorTemp_, 0); + has_update(telegram, boilTemp_, 2); + has_update(telegram, exhaustTemp_, 4); + has_update(telegram, switchTemp_, 25); // only if there is a mixer module present + has_update(telegram, heatingPumpMod_, 9); + has_update(telegram, burnStarts_, 10, 3); // force to 3 bytes + has_update(telegram, burnWorkMin_, 13, 3); // force to 3 bytes + has_update(telegram, heatWorkMin_, 19, 3); // force to 3 bytes } /* @@ -529,7 +623,7 @@ void Boiler::process_UBAMonitorSlow(std::shared_ptr telegram) { * 88 00 E3 00 04 00 00 00 00 01 00 00 00 00 00 02 22 2B 64 46 01 00 00 61 */ void Boiler::process_UBAMonitorSlowPlus2(std::shared_ptr telegram) { - has_update(telegram->read_value(heatingPump2Mod_, 13)); // Heat Pump Modulation + has_update(telegram, heatingPump2Mod_, 13); // Heat Pump Modulation } /* @@ -538,15 +632,15 @@ void Boiler::process_UBAMonitorSlowPlus2(std::shared_ptr telegra * data: 01 00 20 00 00 78 00 00 00 00 00 1E EB 00 9D 3E 00 00 00 00 6B 5E 00 06 4C 64 00 00 00 00 8A A3 */ void Boiler::process_UBAMonitorSlowPlus(std::shared_ptr telegram) { - has_update(telegram->read_bitvalue(fanWork_, 2, 2)); - has_update(telegram->read_bitvalue(ignWork_, 2, 3)); - has_update(telegram->read_bitvalue(heatingPump_, 2, 5)); - has_update(telegram->read_bitvalue(wwCirc_, 2, 7)); - has_update(telegram->read_value(exhaustTemp_, 6)); - has_update(telegram->read_value(burnStarts_, 10, 3)); // force to 3 bytes - has_update(telegram->read_value(burnWorkMin_, 13, 3)); // force to 3 bytes - has_update(telegram->read_value(heatWorkMin_, 19, 3)); // force to 3 bytes - has_update(telegram->read_value(heatingPumpMod_, 25)); + has_bitupdate(telegram, fanWork_, 2, 2); + has_bitupdate(telegram, ignWork_, 2, 3); + has_bitupdate(telegram, heatingPump_, 2, 5); + has_bitupdate(telegram, wwCirc_, 2, 7); + has_update(telegram, exhaustTemp_, 6); + has_update(telegram, burnStarts_, 10, 3); // force to 3 bytes + has_update(telegram, burnWorkMin_, 13, 3); // force to 3 bytes + has_update(telegram, heatWorkMin_, 19, 3); // force to 3 bytes + has_update(telegram, heatingPumpMod_, 25); // temperature measurements at 4, see #620 } @@ -559,89 +653,90 @@ void Boiler::process_UBAMonitorSlowPlus(std::shared_ptr telegram * data: 01 50 1E 5A 46 12 64 00 06 FA 3C 03 05 64 00 00 00 28 00 41 03 00 00 00 00 00 00 00 00 00 */ void Boiler::process_UBAParametersPlus(std::shared_ptr telegram) { - has_update(telegram->read_value(heatingActivated_, 0)); - has_update(telegram->read_value(heatingTemp_, 1)); - has_update(telegram->read_value(burnMaxPower_, 4)); - has_update(telegram->read_value(burnMinPower_, 5)); - has_update(telegram->read_value(boilHystOff_, 8)); - has_update(telegram->read_value(boilHystOn_, 9)); - has_update(telegram->read_value(burnMinPeriod_, 10)); - // has_update(telegram->read_value(pumpType_, 11)); // guess, RC300 manual: power controlled, pressure controlled 1-4? - // has_update(telegram->read_value(pumpDelay_, 12)); // guess - // has_update(telegram->read_value(pumpModMax_, 13)); // guess - // has_update(telegram->read_value(pumpModMin_, 14)); // guess + has_update(telegram, heatingActivated_, 0); + has_update(telegram, heatingTemp_, 1); + has_update(telegram, burnMaxPower_, 4); + has_update(telegram, burnMinPower_, 5); + has_update(telegram, boilHystOff_, 8); + has_update(telegram, boilHystOn_, 9); + has_update(telegram, burnMinPeriod_, 10); + // has_update(telegram, pumpType_, 11); // guess, RC300 manual: power controlled, pressure controlled 1-4? + // has_update(telegram, pumpDelay_, 12); // guess + // has_update(telegram, pumpModMax_, 13); // guess + // has_update(telegram, pumpModMin_, 14); // guess } // 0xEA +// Boiler(0x08) -> (0x0B), (0xEA), data: 00 00 00 00 00 00 3C FB 00 28 00 02 46 00 00 00 3C 3C 28 void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram) { - has_update(telegram->read_value(wwActivated_, 5)); // 0x01 means on - has_update(telegram->read_value(wwCircPump_, 10)); // 0x01 means yes - has_update(telegram->read_value(wwCircMode_, 11)); // 1=1x3min... 6=6x3min, 7=continuous - has_update(telegram->read_value(wwDisinfectionTemp_, 12)); - has_update(telegram->read_value(wwSelTemp_, 6)); - has_update(telegram->read_value(wwHystOn_, 7)); - has_update(telegram->read_value(wwHystOff_, 8)); - has_update(telegram->read_value(wwSelTempOff_, 0)); // confusing description in #96, hopefully this is right - has_update(telegram->read_value(wwSelTempSingle_, 16)); - has_update(telegram->read_value(wwSelTempLow_, 18)); + has_update(telegram, wwSelTempOff_, 0); // confusing description in #96 + has_update(telegram, wwActivated_, 5); // 0x01 means on + has_update(telegram, wwSelTemp_, 6); // setting here + has_update(telegram, wwHystOn_, 7); + has_update(telegram, wwHystOff_, 8); + has_update(telegram, wwCircPump_, 10); // 0x01 means yes + has_update(telegram, wwCircMode_, 11); // 1=1x3min... 6=6x3min, 7=continuous + has_update(telegram, wwDisinfectionTemp_, 12); // setting here, status in E9 + has_update(telegram, wwSelTempSingle_, 16); + has_update(telegram, wwSelTempLow_, 18); } // 0xE9 - WW monitor ems+ // e.g. 08 00 E9 00 37 01 F6 01 ED 00 00 00 00 41 3C 00 00 00 00 00 00 00 00 00 00 00 00 37 00 00 00 (CRC=77) #data=27 void Boiler::process_UBAMonitorWWPlus(std::shared_ptr telegram) { - has_update(telegram->read_value(wwSetTemp_, 0)); - has_update(telegram->read_value(wwCurTemp_, 1)); - has_update(telegram->read_value(wwCurTemp2_, 3)); + has_update(telegram, wwSetTemp_, 0); + has_update(telegram, wwCurTemp_, 1); + has_update(telegram, wwCurTemp2_, 3); - has_update(telegram->read_value(wwWorkM_, 14, 3)); // force to 3 bytes - has_update(telegram->read_value(wwStarts_, 17, 3)); // force to 3 bytes + has_update(telegram, wwWorkM_, 14, 3); // force to 3 bytes + has_update(telegram, wwStarts_, 17, 3); // force to 3 bytes - has_update(telegram->read_bitvalue(wwOneTime_, 12, 2)); - has_update(telegram->read_bitvalue(wwDisinfect_, 12, 3)); - has_update(telegram->read_bitvalue(wwCharging_, 12, 4)); - has_update(telegram->read_bitvalue(wwRecharging_, 13, 4)); - has_update(telegram->read_bitvalue(wwTempOK_, 13, 5)); - has_update(telegram->read_bitvalue(wwCirc_, 13, 2)); + has_bitupdate(telegram, wwOneTime_, 12, 2); + has_bitupdate(telegram, wwDisinfect_, 12, 3); + has_bitupdate(telegram, wwCharging_, 12, 4); + has_bitupdate(telegram, wwRecharging_, 13, 4); + has_bitupdate(telegram, wwTempOK_, 13, 5); + has_bitupdate(telegram, wwCirc_, 13, 2); - // has_update(telegram->read_value(wwActivated_, 20)); // Activated is in 0xEA, this is something other 0/100% - // has_update(telegram->read_value(wwSelTemp_, 10)); // see #96, this is not wwSelTemp (set in EA) - // has_update(telegram->read_value(wwDisinfectionTemp_, 9)); + // has_update(telegram, wwActivated_, 20); // Activated is in 0xEA, this is something other 0/100% + // has_update(telegram, wwSelTemp_, 10); // this is wrong, see #96 + // has_update(telegram, wwDisinfectionTemp_, 9); } /* * UBAInformation - type 0x495 * all values 32 bit - * 08 00 FF 00 03 95 00 0F 8E C2 00 08 39 C8 00 00 18 7A 00 07 3C 80 00 00 00 00 00 00 00 E5 F6 00 - * 08 00 FF 18 03 95 00 00 00 A1 00 00 00 00 00 00 00 44 00 00 00 00 00 00 00 0A 00 00 00 0A BD 00 - * 08 00 FF 30 03 95 00 00 00 00 00 00 00 00 00 00 02 10 00 00 00 00 00 00 02 1A 00 00 00 02 66 00 + * 08 00 FF 00 03 95 00 0F 8E C2 00 08 39 C8 00 00 18 7A 00 07 3C 80 00 00 00 00 00 00 00 E5 F6 00 + * 08 00 FF 18 03 95 00 00 00 A1 00 00 00 00 00 00 00 44 00 00 00 00 00 00 00 0A 00 00 00 0A BD 00 + * 08 00 FF 30 03 95 00 00 00 00 00 00 00 00 00 00 02 10 00 00 00 00 00 00 02 1A 00 00 00 02 66 00 * 08 00 FF 48 03 95 00 00 01 15 00 00 00 00 00 00 00 F9 29 00 - * + * */ void Boiler::process_UBAInformation(std::shared_ptr telegram) { - has_update(telegram->read_value(upTimeControl_, 0)); - has_update(telegram->read_value(upTimeCompHeating_, 8)); - has_update(telegram->read_value(upTimeCompCooling_, 16)); - has_update(telegram->read_value(upTimeCompWw_, 4)); - has_update(telegram->read_value(upTimeCompPool_, 12)); + has_update(telegram, upTimeControl_, 0); + has_update(telegram, upTimeCompHeating_, 8); + has_update(telegram, upTimeCompCooling_, 16); + has_update(telegram, upTimeCompWw_, 4); + has_update(telegram, upTimeCompPool_, 12); - has_update(telegram->read_value(totalCompStarts_, 20)); - has_update(telegram->read_value(heatingStarts_, 28)); - has_update(telegram->read_value(coolingStarts_, 36)); - has_update(telegram->read_value(wwStarts2_, 24)); - has_update(telegram->read_value(poolStarts_, 32)); + has_update(telegram, totalCompStarts_, 20); + has_update(telegram, heatingStarts_, 28); + has_update(telegram, coolingStarts_, 36); + has_update(telegram, wwStarts2_, 24); + has_update(telegram, poolStarts_, 32); - has_update(telegram->read_value(nrgConsTotal_, 64)); + has_update(telegram, nrgConsTotal_, 64); - has_update(telegram->read_value(auxElecHeatNrgConsTotal_, 40)); - has_update(telegram->read_value(auxElecHeatNrgConsHeating_, 48)); - has_update(telegram->read_value(auxElecHeatNrgConsWW_, 44)); - has_update(telegram->read_value(auxElecHeatNrgConsPool_, 52)); + has_update(telegram, auxElecHeatNrgConsTotal_, 40); + has_update(telegram, auxElecHeatNrgConsHeating_, 48); + has_update(telegram, auxElecHeatNrgConsWW_, 44); + has_update(telegram, auxElecHeatNrgConsPool_, 52); - has_update(telegram->read_value(nrgConsCompTotal_, 56)); - has_update(telegram->read_value(nrgConsCompHeating_, 68)); - has_update(telegram->read_value(nrgConsCompWw_, 72)); - has_update(telegram->read_value(nrgConsCompCooling_, 76)); - has_update(telegram->read_value(nrgConsCompPool_, 80)); + has_update(telegram, nrgConsCompTotal_, 56); + has_update(telegram, nrgConsCompHeating_, 68); + has_update(telegram, nrgConsCompWw_, 72); + has_update(telegram, nrgConsCompCooling_, 76); + has_update(telegram, nrgConsCompPool_, 80); } /* @@ -652,108 +747,84 @@ void Boiler::process_UBAInformation(std::shared_ptr telegram) { * 08 00 FF 31 03 94 00 00 00 00 00 00 00 38 */ void Boiler::process_UBAEnergySupplied(std::shared_ptr telegram) { - has_update(telegram->read_value(nrgSuppTotal_, 4)); - has_update(telegram->read_value(nrgSuppHeating_, 12)); - has_update(telegram->read_value(nrgSuppWw_, 8)); - has_update(telegram->read_value(nrgSuppCooling_, 16)); - has_update(telegram->read_value(nrgSuppPool_, 20)); + has_update(telegram, nrgSuppTotal_, 4); + has_update(telegram, nrgSuppHeating_, 12); + has_update(telegram, nrgSuppWw_, 8); + has_update(telegram, nrgSuppCooling_, 16); + has_update(telegram, nrgSuppPool_, 20); } // Heatpump power - type 0x48D //08 00 FF 00 03 8D 03 00 10 30 10 60 00 04 00 00 00 17 00 00 00 3C 38 0E 64 00 00 0C 33 C7 00 //XR1A050001 A05 Pump Heat circuit (1.0 ) 1 >> 1 & 0x01 ? //XR1A040001 A04 Pump Cold circuit (1.0 ) 1 & 0x1 ? - void Boiler::process_HpPower(std::shared_ptr telegram) { - has_update(telegram->read_value(hpPower_, 11)); - has_update(telegram->read_bitvalue(hpCompOn_, 3, 4)); - has_update(telegram->read_value(hpBrinePumpSpd_, 5)); - has_update(telegram->read_value(hpCompSpd_, 17)); - has_update(telegram->read_value(hpCircSpd_, 4)); - has_update(telegram->read_bitvalue(hpSwitchValve_, 0, 6)); - has_update(telegram->read_value(hpActivity_, 7)); + has_update(telegram, hpPower_, 11); + has_bitupdate(telegram, hpCompOn_, 3, 4); + has_update(telegram, hpBrinePumpSpd_, 5); + has_update(telegram, hpCompSpd_, 17); + has_update(telegram, hpCircSpd_, 4); + has_bitupdate(telegram, hpSwitchValve_, 0, 4); + has_update(telegram, hpActivity_, 7); - hpHeatingOn_ = 0; - hpCoolingOn_ = 0; - hpWwOn_ = 0; - hpPoolOn_ = 0; - - switch (hpActivity_) { - case 1: { - hpHeatingOn_ = 0xFF; - break; - } - case 2: { - hpCoolingOn_ = 0xFF; - break; - } - case 3: { - hpWwOn_ = 0xFF; - ; - break; - } - case 4: { - hpPoolOn_ = 0xFF; - ; - break; - } - } + has_update(hpHeatingOn_, hpActivity_ == 1 ? 0xFF : 0); + has_update(hpCoolingOn_, hpActivity_ == 2 ? 0xFF : 0); + has_update(hpWwOn_, hpActivity_ == 3 ? 0xFF : 0); + has_update(hpPoolOn_, hpActivity_ == 4 ? 0xFF : 0); } // Heatpump outdoor unit - type 0x48F void Boiler::process_HpOutdoor(std::shared_ptr telegram) { - has_update(telegram->read_value(hpTc0_, 6)); - has_update(telegram->read_value(hpTc1_, 4)); - has_update(telegram->read_value(hpTc3_, 2)); - has_update(telegram->read_value(hpTr3_, 16)); - has_update(telegram->read_value(hpTr4_, 18)); - has_update(telegram->read_value(hpTr5_, 20)); - has_update(telegram->read_value(hpTr6_, 0)); - has_update(telegram->read_value(hpTr7_, 30)); - has_update(telegram->read_value(hpTl2_, 12)); - has_update(telegram->read_value(hpPl1_, 26)); - has_update(telegram->read_value(hpPh1_, 28)); - has_update(telegram->read_value(hpBrineIn_, 8)); - has_update(telegram->read_value(hpBrineOut_, 10)); - has_update(telegram->read_value(hpSuctionGas_, 20)); - has_update(telegram->read_value(hpHotGas_, 0)); + has_update(telegram, hpTc0_, 6); + has_update(telegram, hpTc1_, 4); + has_update(telegram, hpTc3_, 2); + has_update(telegram, hpTr3_, 16); + has_update(telegram, hpTr4_, 18); + // has_update(telegram, hpTr5_, 20); + // has_update(telegram, hpTr6_, 0); + has_update(telegram, hpTr7_, 30); + has_update(telegram, hpTl2_, 12); + has_update(telegram, hpPl1_, 26); + has_update(telegram, hpPh1_, 28); + has_update(telegram, hpBrineIn_, 8); + has_update(telegram, hpBrineOut_, 10); + has_update(telegram, hpSuctionGas_, 20); + has_update(telegram, hpHotGas_, 0); } // Heatpump pool unit - type 0x48A // 08 00 FF 00 03 8A 01 4C 01 0C 00 00 0A 00 1E 00 00 01 00 04 4A 00 - void Boiler::process_HpPool(std::shared_ptr telegram) { - has_update(telegram->read_value(poolSetTemp_, 1)); + has_update(telegram, poolSetTemp_, 1); } - // 0x2A - MC110Status // e.g. 88 00 2A 00 00 00 00 00 00 00 00 00 D2 00 00 80 00 00 01 08 80 00 02 47 00 // see https://github.com/emsesp/EMS-ESP/issues/397 void Boiler::process_MC110Status(std::shared_ptr telegram) { - has_update(telegram->read_value(wwMixerTemp_, 14)); - has_update(telegram->read_value(wwTankMiddleTemp_, 18)); + has_update(telegram, wwMixerTemp_, 14); + has_update(telegram, wwCylMiddleTemp_, 18); } /* * UBAOutdoorTemp - type 0xD1 - external temperature EMS+ */ void Boiler::process_UBAOutdoorTemp(std::shared_ptr telegram) { - has_update(telegram->read_value(outdoorTemp_, 0)); + has_update(telegram, outdoorTemp_, 0); } // UBASetPoint 0x1A void Boiler::process_UBASetPoints(std::shared_ptr telegram) { - has_update(telegram->read_value(setFlowTemp_, 0)); // boiler set temp from thermostat - has_update(telegram->read_value(setBurnPow_, 1)); // max json power in % - has_update(telegram->read_value(wwSetPumpPower_, 2)); // ww pump speed/power? + has_update(telegram, setFlowTemp_, 0); // boiler set temp from thermostat + has_update(telegram, setBurnPow_, 1); // max burner power in % + has_update(telegram, wwSetPumpPower_, 2); // ww pump speed/power? } // 0x6DC, ff for cascaded heatsources (hs) void Boiler::process_CascadeMessage(std::shared_ptr telegram) { // uint8_t hsActivated; - // has_update(telegram->read_value(hsActivated, 0)); + // has_update(telegram, hsActivated, 0); telegram->read_value(burnWorkMin_, 3); // this is in seconds burnWorkMin_ /= 60; } @@ -773,20 +844,18 @@ void Boiler::process_UBAFlags(std::shared_ptr telegram) { void Boiler::process_UBAMaintenanceStatus(std::shared_ptr telegram) { // 5. byte: Maintenance due (0 = no, 3 = yes, due to operating hours, 8 = yes, due to date) uint8_t message_code = maintenanceMessage_[2] - '0'; - has_update(telegram->read_value(message_code, 5)); + telegram->read_value(message_code, 5); - if (message_code > 0) { - snprintf(maintenanceMessage_, sizeof(maintenanceMessage_), "H%02d", message_code); - } else { - // No message. All Ok. But set a blank message so value is still in the MQTT payload to avoid HA giving warnings - maintenanceMessage_[0] = ' '; - maintenanceMessage_[1] = '\0'; + if (Helpers::hasValue(message_code)) { + char message[5]; + snprintf(message, sizeof(message), "H%02d", message_code); + has_update(maintenanceMessage_, message, sizeof(maintenanceMessage_)); } } // 0x10, 0x11 void Boiler::process_UBAErrorMessage(std::shared_ptr telegram) { - if (telegram->offset > 0 || telegram->message_length < 9) { + if (telegram->offset > 0 || telegram->message_length < 11) { return; } // data: displaycode(2), errornumber(2), year, month, hour, day, minute, duration(2), src-addr @@ -805,96 +874,113 @@ void Boiler::process_UBAErrorMessage(std::shared_ptr telegram) { uint8_t hour = telegram->message_data[6]; uint8_t min = telegram->message_data[8]; uint32_t date = (year - 2000) * 535680UL + month * 44640UL + day * 1440UL + hour * 60 + min; + uint16_t duration; + telegram->read_value(duration, 9); // store only the newest code from telegrams 10 and 11 if (date > lastCodeDate_) { - snprintf(lastCode_, sizeof(lastCode_), "%s(%d) %02d.%02d.%d %02d:%02d", code, codeNo, day, month, year, hour, min); lastCodeDate_ = date; + snprintf(lastCode_, sizeof(lastCode_), "%s(%d) %02d.%02d.%d %02d:%02d (%d min)", code, codeNo, day, month, year, hour, min, duration); + has_update(lastCode_); } } } -// 0xC2 +// 0xC2, without clock in system it stores 3 bytes uptime in 11 and 16, with clock date in 10-14, and 15-19 +// date is marked with 0x80 to year-field void Boiler::process_UBAErrorMessage2(std::shared_ptr telegram) { - // for decoding "last error code" we need telegram starting with offset 0 - if (telegram->offset != 0 || telegram->message_length < 20) { - return; - } - - char code[4]; - uint16_t codeNo; - char start_time[17]; - char end_time[17]; - - if (!(telegram->message_data[10] & 0x80)) { // no valid start date means no error? + if (telegram->offset > 0 || telegram->message_length < 20) { return; } + char code[sizeof(lastCode_)]; + uint16_t codeNo; code[0] = telegram->message_data[5]; code[1] = telegram->message_data[6]; code[2] = telegram->message_data[7]; code[3] = 0; telegram->read_value(codeNo, 8); - uint16_t start_year = (telegram->message_data[10] & 0x7F) + 2000; - uint8_t start_month = telegram->message_data[11]; - uint8_t start_day = telegram->message_data[13]; - uint8_t start_hour = telegram->message_data[12]; - uint8_t start_min = telegram->message_data[14]; - snprintf(start_time, sizeof(start_time), "%d.%02d.%02d %02d:%02d", start_year, start_month, start_day, start_hour, start_min); + // check for valid date, https://github.com/emsesp/EMS-ESP32/issues/204 + if (telegram->message_data[10] & 0x80) { + uint16_t start_year = (telegram->message_data[10] & 0x7F) + 2000; + uint8_t start_month = telegram->message_data[11]; + uint8_t start_day = telegram->message_data[13]; + uint8_t start_hour = telegram->message_data[12]; + uint8_t start_min = telegram->message_data[14]; + uint16_t end_year = (telegram->message_data[15] & 0x7F) + 2000; + uint8_t end_month = telegram->message_data[16]; + uint8_t end_day = telegram->message_data[18]; + uint8_t end_hour = telegram->message_data[17]; + uint8_t end_min = telegram->message_data[19]; - uint16_t end_year = (telegram->message_data[15] & 0x7F) + 2000; - uint8_t end_month = telegram->message_data[16]; - uint8_t end_day = telegram->message_data[18]; - uint8_t end_hour = telegram->message_data[17]; - uint8_t end_min = telegram->message_data[19]; - - if (telegram->message_data[15] & 0x80) { // valid end date - snprintf(end_time, sizeof(end_time), "%d.%02d.%02d %02d:%02d", end_year, end_month, end_day, end_hour, end_min); - } else { // no valid end date means error still persists - snprintf(end_time, sizeof(end_time), "%s", "none"); + if (telegram->message_data[15] & 0x80) { //valid end date + snprintf(&code[3], + sizeof(code) - 3, + "(%d) %02d.%02d.%04d %02d:%02d - %02d.%02d.%04d %02d:%02d", + codeNo, + start_day, + start_month, + start_year, + start_hour, + start_min, + end_day, + end_month, + end_year, + end_hour, + end_min); + } else { // no valid end date means error still persists + snprintf(&code[3], sizeof(code) - 3, "(%d) %02d.%02d.%04d %02d:%02d - now", codeNo, start_day, start_month, start_year, start_hour, start_min); + } + } else { // no clock, the uptime is stored https://github.com/emsesp/EMS-ESP32/issues/121 + uint32_t starttime, endtime; + telegram->read_value(starttime, 11, 3); + telegram->read_value(endtime, 16, 3); + snprintf(&code[3], sizeof(code) - 3, "(%d) @uptime %d - %d min", codeNo, starttime, endtime); } - - snprintf(lastCode_, sizeof(lastCode_), "%s/%d start: %s, end: %s", code, codeNo, start_time, end_time); + has_update(lastCode_, code, sizeof(lastCode_)); } - -// 0x15 +// 0x15 maintenance data void Boiler::process_UBAMaintenanceData(std::shared_ptr telegram) { if (telegram->offset > 0 || telegram->message_length < 5) { return; } - // first byte: Maintenance messages (0 = none, 1 = by operating hours, 2 = by date) - has_update(telegram->read_value(maintenanceType_, 0)); + // added additional type 3 (for Nefit TrendLine HRC 30/CW5) + has_update(telegram, maintenanceType_, 0); // 0 = off, 1 = by operating hours, 2 = by date, 3 = manual uint8_t time = (maintenanceTime_ == EMS_VALUE_USHORT_NOTSET) ? EMS_VALUE_UINT_NOTSET : maintenanceTime_ / 100; - has_update(telegram->read_value(time, 1)); - maintenanceTime_ = (time == EMS_VALUE_UINT_NOTSET) ? EMS_VALUE_USHORT_NOTSET : time * 100; - // telegram->read_value(maintenanceTime_, 1, 1); - // maintenanceTime_ = maintenanceTime * 100; + telegram->read_value(time, 1); + if (Helpers::hasValue(time)) { + if (time * 100 != maintenanceTime_) { + maintenanceTime_ = time * 100; + has_update(&maintenanceTime_); + } + } // date only uint8_t day = telegram->message_data[2]; uint8_t month = telegram->message_data[3]; uint8_t year = telegram->message_data[4]; if (day > 0 && month > 0) { - snprintf(maintenanceDate_, sizeof(maintenanceDate_), "%02d.%02d.%04d", day, month, year + 2000); + char date[20]; + snprintf(date, sizeof(date), "%02d.%02d.%04d", day, month, year + 2000); + has_update(maintenanceDate_, date, sizeof(maintenanceDate_)); } } -// Set the warm water temperature 0x33/0x35 or 0xEA +// Set the dhw temperature 0x33/0x35 or 0xEA bool Boiler::set_ww_temp(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler ww temperature: Invalid value")); + if (!Helpers::value2temperature(value, v)) { return false; } - LOG_INFO(F("Setting boiler ww temperature to %d C"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { + // write_command(EMS_TYPE_UBAFlags, 3, v, EMS_TYPE_UBAParameterWWPlus); // test for #96 write_command(EMS_TYPE_UBAParameterWWPlus, 6, v, EMS_TYPE_UBAParameterWWPlus); } else { - // some boiler have it in 0x33, some in 0x35 + // some boiler have it in UBAParametersWW 0x33/0xEA, some in 0x35 write_command(EMS_TYPE_UBAFlags, 3, v, EMS_TYPE_UBAParameterWW); // for i9000, see #397 write_command(EMS_TYPE_UBAParameterWW, 2, v, EMS_TYPE_UBAParameterWW); // read seltemp back } @@ -903,41 +989,35 @@ bool Boiler::set_ww_temp(const char * value, const int8_t id) { } -// Set the lower warm water temperature 0xEA +// Set the lower dhw temperature 0xEA bool Boiler::set_ww_temp_low(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler lower ww temperature: Invalid value")); + if (!Helpers::value2temperature(value, v)) { return false; } - LOG_INFO(F("Setting boiler lower ww temperature to %d C"), v); write_command(EMS_TYPE_UBAParameterWWPlus, 18, v, EMS_TYPE_UBAParameterWWPlus); return true; } -// Set the warm water single charge temperature 0xEA +// Set the dhw single charge temperature 0xEA bool Boiler::set_ww_temp_single(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set single charge ww temperature: Invalid value")); + if (!Helpers::value2temperature(value, v)) { return false; } - LOG_INFO(F("Setting single charge ww temperature to %d C"), v); write_command(EMS_TYPE_UBAParameterWWPlus, 16, v, EMS_TYPE_UBAParameterWWPlus); return true; } -// Set the warm water disinfection temperature +// Set the dhw disinfection temperature bool Boiler::set_ww_disinfect_temp(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler ww disinfect temperature: Invalid value")); + if (!Helpers::value2temperature(value, v)) { return false; } - LOG_INFO(F("Setting boiler ww disinfect temperature to %d C"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParameterWWPlus, 12, v, EMS_TYPE_UBAParameterWWPlus); } else { @@ -950,14 +1030,15 @@ bool Boiler::set_ww_disinfect_temp(const char * value, const int8_t id) { // flow temp bool Boiler::set_flow_temp(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler flow temperature: Invalid value")); + if (!Helpers::value2temperature(value, v)) { return false; } - LOG_INFO(F("Setting boiler flow temperature to %d C"), v); - write_command(EMS_TYPE_UBASetPoints, 0, v, EMS_TYPE_UBASetPoints); - + if (has_telegram_id(0xE4)) { + write_command(EMS_TYPE_UBASetPoints, 0, v, 0xE4); + } else { + write_command(EMS_TYPE_UBASetPoints, 0, v, 0x18); + } return true; } @@ -965,25 +1046,21 @@ bool Boiler::set_flow_temp(const char * value, const int8_t id) { bool Boiler::set_burn_power(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set burner max power: Invalid value")); return false; } - LOG_INFO(F("Setting burner max power to %d %"), v); write_command(EMS_TYPE_UBASetPoints, 1, v, EMS_TYPE_UBASetPoints); return true; } -// Set the warm water flow temperature offset 0x33 +// Set the dhw flow temperature offset 0x33 bool Boiler::set_ww_flowTempOffset(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler ww flow temperature offset: Invalid value")); + if (!Helpers::value2temperature(value, v, true)) { return false; } - LOG_INFO(F("Setting boiler ww flow temperature offset to %d C"), v); write_command(EMS_TYPE_UBAParameterWW, 5, v, EMS_TYPE_UBAParameterWW); return true; @@ -993,11 +1070,9 @@ bool Boiler::set_ww_flowTempOffset(const char * value, const int8_t id) { bool Boiler::set_heating_activated(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { - LOG_WARNING(F("Set boiler heating: Invalid value")); return false; } - LOG_INFO(F("Setting boiler heating %s"), v ? "on" : "off"); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 0, v ? 0x01 : 0, EMS_TYPE_UBAParametersPlus); } else { @@ -1010,12 +1085,10 @@ bool Boiler::set_heating_activated(const char * value, const int8_t id) { // set heating maximum temperature bool Boiler::set_heating_temp(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler heating temperature: Invalid value")); + if (!Helpers::value2temperature(value, v)) { return false; } - LOG_INFO(F("Setting boiler heating temperature to %d C"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 1, v, EMS_TYPE_UBAParametersPlus); } else { @@ -1029,11 +1102,9 @@ bool Boiler::set_heating_temp(const char * value, const int8_t id) { bool Boiler::set_min_power(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler min power: Invalid value")); return false; } - LOG_INFO(F("Setting boiler min power to %d %%"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 5, v, EMS_TYPE_UBAParametersPlus); } else { @@ -1047,11 +1118,9 @@ bool Boiler::set_min_power(const char * value, const int8_t id) { bool Boiler::set_max_power(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler max power: Invalid value")); return false; } - LOG_INFO(F("Setting boiler max power to %d %%"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 4, v, EMS_TYPE_UBAParametersPlus); } else { @@ -1064,12 +1133,10 @@ bool Boiler::set_max_power(const char * value, const int8_t id) { // set ww on hysteresis bool Boiler::set_ww_hyst_on(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set ww on hysteresis: Invalid value")); + if (!Helpers::value2temperature(value, v, true)) { return false; } - LOG_INFO(F("Setting ww on hysteresis on to %d C"), v); if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { write_command(EMS_TYPE_UBAParameterWWPlus, 7, v, EMS_TYPE_UBAParameterWWPlus); } else { @@ -1082,12 +1149,10 @@ bool Boiler::set_ww_hyst_on(const char * value, const int8_t id) { // set ww off hysteresis bool Boiler::set_ww_hyst_off(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set ww off hysteresis: Invalid value")); + if (!Helpers::value2temperature(value, v, true)) { return false; } - LOG_INFO(F("Setting ww off hysteresis off to %d C"), v); if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { write_command(EMS_TYPE_UBAParameterWWPlus, 8, v, EMS_TYPE_UBAParameterWWPlus); } else { @@ -1097,15 +1162,13 @@ bool Boiler::set_ww_hyst_off(const char * value, const int8_t id) { return true; } -// set warm water max power +// set dhw max power bool Boiler::set_ww_maxpower(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set ww max power: Invalid value")); return false; } - LOG_INFO(F("Setting ww max power to %d %%"), v); write_command(EMS_TYPE_UBASettingsWW, 7, v, EMS_TYPE_UBASettingsWW); return true; @@ -1115,11 +1178,9 @@ bool Boiler::set_ww_maxpower(const char * value, const int8_t id) { bool Boiler::set_min_pump(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set pump min: Invalid value")); return false; } - LOG_INFO(F("Setting pump min to %d %%"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 14, v, EMS_TYPE_UBAParametersPlus); } else { @@ -1133,11 +1194,9 @@ bool Boiler::set_min_pump(const char * value, const int8_t id) { bool Boiler::set_max_pump(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set pump max: Invalid value")); return false; } - LOG_INFO(F("Setting pump max to %d %%"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 13, v, EMS_TYPE_UBAParametersPlus); } else { @@ -1150,12 +1209,10 @@ bool Boiler::set_max_pump(const char * value, const int8_t id) { // set boiler on hysteresis bool Boiler::set_hyst_on(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler hysteresis: Invalid value")); + if (!Helpers::value2temperature(value, v, true)) { return false; } - LOG_INFO(F("Setting boiler hysteresis on to %d C"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 9, v, EMS_TYPE_UBAParametersPlus); } else { @@ -1168,12 +1225,10 @@ bool Boiler::set_hyst_on(const char * value, const int8_t id) { // set boiler off hysteresis bool Boiler::set_hyst_off(const char * value, const int8_t id) { int v = 0; - if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler hysteresis: Invalid value")); + if (!Helpers::value2temperature(value, v, true)) { return false; } - LOG_INFO(F("Setting boiler hysteresis off to %d C"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 8, v, EMS_TYPE_UBAParametersPlus); } else { @@ -1187,11 +1242,9 @@ bool Boiler::set_hyst_off(const char * value, const int8_t id) { bool Boiler::set_burn_period(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set burner min period: Invalid value")); return false; } - LOG_INFO(F("Setting burner min period to %d min"), v); if (is_fetch(EMS_TYPE_UBAParametersPlus)) { write_command(EMS_TYPE_UBAParametersPlus, 10, v, EMS_TYPE_UBAParametersPlus); } else { @@ -1205,12 +1258,10 @@ bool Boiler::set_burn_period(const char * value, const int8_t id) { bool Boiler::set_pump_delay(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set boiler pump delay: Invalid value")); return false; } if (is_fetch(EMS_TYPE_UBAParameters)) { - LOG_INFO(F("Setting boiler pump delay to %d min"), v); write_command(EMS_TYPE_UBAParameters, 8, v, EMS_TYPE_UBAParameters); return true; } @@ -1223,7 +1274,6 @@ bool Boiler::set_pump_delay(const char * value, const int8_t id) { bool Boiler::set_ww_mode(const char * value, const int8_t id) { uint8_t set; if (!Helpers::value2enum(value, set, FL_(enum_comfort))) { - LOG_WARNING(F("Set boiler ww mode: Invalid value")); return false; } @@ -1232,12 +1282,12 @@ bool Boiler::set_ww_mode(const char * value, const int8_t id) { } if (set == 0) { - LOG_INFO(F("Setting boiler ww to Hot")); + // LOG_INFO(F("Setting boiler dhw to Hot")); } else if (set == 1) { - LOG_INFO(F("Setting boiler ww to Eco")); + // LOG_INFO(F("Setting boiler dhw to Eco")); set = 0xD8; } else if (set == 2) { - LOG_INFO(F("Setting boiler ww to Intelligent")); + // LOG_INFO(F("Setting boiler dhw to Intelligent")); set = 0xEC; } else { return false; // do nothing @@ -1247,19 +1297,15 @@ bool Boiler::set_ww_mode(const char * value, const int8_t id) { return true; } -// turn on/off warm water +// turn on/off dhw bool Boiler::set_ww_activated(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { - LOG_WARNING(F("Set boiler ww active: Invalid value")); return false; } - LOG_INFO(F("Setting boiler ww active %s"), v ? "on" : "off"); - // https://github.com/emsesp/EMS-ESP/issues/268 // 08 for HT3 seems to be wrong, see https://github.com/emsesp/EMS-ESP32/issues/89 - if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { write_command(EMS_TYPE_UBAParameterWWPlus, 1, v ? 1 : 0, EMS_TYPE_UBAParameterWWPlus); } else { @@ -1272,13 +1318,15 @@ bool Boiler::set_ww_activated(const char * value, const int8_t id) { // Activate / De-activate the Warm Tap Water // Note: Using the type 0x1D to put the boiler into Test mode. This may be shown on the boiler with a flashing 'T' bool Boiler::set_tapwarmwater_activated(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { - LOG_WARNING(F("Set warm tap water: Invalid value")); + if (!Helpers::hasValue(wwTapActivated_, EMS_VALUE_BOOL)) { + return false; + } + + bool v = false; + if (!Helpers::value2bool(value, v)) { return false; } - LOG_INFO(F("Setting warm tap water %s"), v ? "on" : "off"); uint8_t message_data[EMS_MAX_TELEGRAM_MESSAGE_LENGTH]; for (uint8_t i = 0; i < sizeof(message_data); i++) { message_data[i] = 0x00; @@ -1305,54 +1353,31 @@ bool Boiler::set_tapwarmwater_activated(const char * value, const int8_t id) { return true; } -// Activate / De-activate One Time warm water 0x35 +// Activate / De-activate One Time dhw 0x35 // true = on, false = off // See also https://github.com/emsesp/EMS-ESP/issues/341#issuecomment-596245458 for Junkers bool Boiler::set_ww_onetime(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { - LOG_WARNING(F("Set ww OneTime loading: Invalid value")); return false; } - LOG_INFO(F("Setting ww OneTime loading %s"), v ? "on" : "off"); if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { write_command(EMS_TYPE_UBAFlags, 0, (v ? 0x22 : 0x02), 0xE9); // not sure if this is in flags } else { - write_command(EMS_TYPE_UBAFlags, 0, (v ? 0x22 : 0x02), 0x34); + write_command(EMS_TYPE_UBAFlags, 0, (v ? 0x23 : 0x03), 0x34); } return true; } -// Activate / De-activate circulation of warm water 0x35 -// true = on, false = off -bool Boiler::set_ww_circulation(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { - LOG_WARNING(F("Set ww circulation: Invalid value")); - return false; - } - - LOG_INFO(F("Setting ww circulation %s"), v ? "on" : "off"); - if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { - write_command(EMS_TYPE_UBAFlags, 1, (v ? 0x22 : 0x02), 0xE9); // not sure if this is in flags - } else { - write_command(EMS_TYPE_UBAFlags, 1, (v ? 0x22 : 0x02), 0x34); - } - - return true; -} - -// starting warm water disinfect, set to off seems not working +// starting dhw disinfect, set to off seems not working bool Boiler::set_ww_disinfect(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { - LOG_WARNING(F("Set ww disinfect: Invalid value")); return false; } - LOG_INFO(F("Setting ww disinfect %s"), v ? "on" : "off"); if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { write_command(EMS_TYPE_UBAFlags, 0, (v ? 0x44 : 0x04), 0xE9); // not sure if this is in flags } else { @@ -1362,15 +1387,29 @@ bool Boiler::set_ww_disinfect(const char * value, const int8_t id) { return true; } -// configuration of warm water circulation pump -bool Boiler::set_ww_circulation_pump(const char * value, const int8_t id) { +// Activate / De-activate circulation of dhw 0x35 +// true = on, false = off +bool Boiler::set_ww_circulation(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { - LOG_WARNING(F("Set ww circulation pump: Invalid value")); return false; } - LOG_INFO(F("Setting ww circulation pump %s"), v ? "on" : "off"); + if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { + write_command(EMS_TYPE_UBAFlags, 1, (v ? 0x22 : 0x02), 0xE9); // not sure if this is in flags + } else { + write_command(EMS_TYPE_UBAFlags, 1, (v ? 0x22 : 0x02), 0x34); + } + + return true; +} + +// configuration of dhw circulation pump +bool Boiler::set_ww_circulation_pump(const char * value, const int8_t id) { + bool v = false; + if (!Helpers::value2bool(value, v)) { + return false; + } if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { write_command(EMS_TYPE_UBAParameterWWPlus, 10, v ? 0x01 : 0x00, EMS_TYPE_UBAParameterWWPlus); @@ -1386,16 +1425,15 @@ bool Boiler::set_ww_circulation_pump(const char * value, const int8_t id) { bool Boiler::set_ww_circulation_mode(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { - LOG_WARNING(F("Set ww circulation mode: Invalid value")); return false; } if (v < 7) { - LOG_INFO(F("Setting ww circulation mode %dx3min"), v); + // LOG_INFO(F("Setting dhw circulation mode %dx3min"), v); } else if (v == 7) { - LOG_INFO(F("Setting ww circulation mode continuous")); + // LOG_INFO(F("Setting dhw circulation mode continuous")); } else { - LOG_WARNING(F("Set ww circulation mode: Invalid value")); + // LOG_WARNING(F("Set dhw circulation mode: Invalid value")); return false; } @@ -1418,13 +1456,15 @@ bool Boiler::set_reset(const char * value, const int8_t id) { return false; } - if (num == 0) { - LOG_INFO(F("Reset boiler maintenance message")); + if (num == 1) { + // LOG_INFO(F("Reset boiler maintenance message")); write_command(0x05, 0x08, 0xFF, 0x1C); + has_update(reset_); return true; - } else if (num == 1) { - LOG_INFO(F("Reset boiler error message")); + } else if (num == 2) { + // LOG_INFO(F("Reset boiler error message")); write_command(0x05, 0x00, 0x5A); // error reset + has_update(reset_); return true; } return false; @@ -1432,10 +1472,10 @@ bool Boiler::set_reset(const char * value, const int8_t id) { //maintenance bool Boiler::set_maintenance(const char * value, const int8_t id) { - std::string s(12, '\0'); + std::string s; if (Helpers::value2string(value, s)) { if (s == Helpers::toLower(read_flash_string(F_(reset)))) { - LOG_INFO(F("Reset boiler maintenance message")); + // LOG_INFO(F("Reset boiler maintenance message")); write_command(0x05, 0x08, 0xFF, 0x1C); return true; } @@ -1467,7 +1507,7 @@ bool Boiler::set_maintenance(const char * value, const int8_t id) { } uint8_t num; - if (Helpers::value2enum(value, num, FL_(enum_off_time_date))) { + if (Helpers::value2enum(value, num, FL_(enum_off_time_date_manual))) { LOG_INFO(F("Setting maintenance type to %s"), value); write_command(0x15, 0, num, 0x15); return true; @@ -1514,15 +1554,12 @@ bool Boiler::set_maintenancedate(const char * value, const int8_t id) { // Set the pool temperature 0x48A bool Boiler::set_pool_temp(const char * value, const int8_t id) { - float v = 0; - uint8_t v2 = 0; - if (!Helpers::value2float(value, v)) { - LOG_WARNING(F("Set pool water temperature: Invalid value")); + float v = 0; + if (!Helpers::value2temperature(value, v)) { return false; } - v2 = (int((v * 2) + 0.5) & 0xFF); - - LOG_INFO(F("Setting pool temperature to %d C"), v2 / 2); + uint8_t v2 = ((v * 2) + 0.5); + // LOG_INFO(F("Setting pool temperature to %d.%d C"), v2 >> 1, (v2 & 0x01) * 5); write_command(0x48A, 1, v2, 0x48A); return true; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index f44afec87..5b81c69c7 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -25,9 +25,7 @@ namespace emsesp { class Boiler : public EMSdevice { public: - Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); + Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); private: static uuid::log::Logger logger_; @@ -52,50 +50,46 @@ class Boiler : public EMSdevice { static constexpr uint16_t EMS_TYPE_UBAInformation = 0x495; static constexpr uint16_t EMS_TYPE_UBAEnergySupplied = 0x494; - static constexpr uint8_t EMS_BOILER_SELFLOWTEMP_HEATING = 20; // was originally 70, changed to 30 for issue #193, then to 20 with issue #344 - // ww - uint8_t wwSetTemp_; // Warm Water set temperature - uint8_t wwSelTemp_; // Warm Water selected temperature - uint8_t wwSelTempLow_; // Warm Water lower selected temperature - uint8_t wwSelTempOff_; // Warm Water selected temperature for off position - uint8_t wwSelTempSingle_; // Warm Water single charge temperature + uint8_t wwSetTemp_; // DHW set temperature + uint8_t wwSelTemp_; // DHW selected temperature + uint8_t wwSelTempLow_; // DHW lower selected temperature + uint8_t wwSelTempOff_; // DHW selected temperature for off position + uint8_t wwSelTempSingle_; // DHW single charge temperature uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer uint8_t wwComfort_; // WW comfort mode - uint8_t wwCircPump_; // Warm Water circulation pump available - uint8_t wwChargeType_; // Warm Water charge type (pump or 3-way-valve) - uint8_t wwDisinfectionTemp_; // Warm Water disinfection temperature to prevent infection - uint8_t wwCircMode_; // Warm Water circulation pump mode + uint8_t wwCircPump_; // DHW circulation pump available + uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) + uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection + uint8_t wwCircMode_; // DHW circulation pump mode uint8_t wwCirc_; // Circulation on/off - uint16_t wwCurTemp_; // Warm Water current temperature - uint16_t wwCurTemp2_; // Warm Water current temperature storage - uint8_t wwCurFlow_; // Warm Water current flow temp in l/min - uint16_t wwStorageTemp1_; // warm water storage temp 1 - uint16_t wwStorageTemp2_; // warm water storage temp 2 - uint8_t wwActivated_; // Warm Water activated - uint8_t wwOneTime_; // Warm Water one time function on/off - uint8_t wwDisinfect_; // Warm Water disinfection on/off - uint8_t wwCharging_; // Warm Water charging on/off - uint8_t wwRecharging_; // Warm Water recharge on/off - uint8_t wwTempOK_; // Warm Water temperature ok on/off + uint16_t wwCurTemp_; // DHW current temperature + uint16_t wwCurTemp2_; // DHW current temperature storage + uint8_t wwCurFlow_; // DHW current flow temp in l/min + uint16_t wwStorageTemp1_; // DHW storage temp 1 + uint16_t wwStorageTemp2_; // DHW storage temp 2 + uint8_t wwActivated_; // DHW activated + uint8_t wwOneTime_; // DHW one time function on/off + uint8_t wwDisinfect_; // DHW disinfection on/off + uint8_t wwCharging_; // DHW charging on/off + uint8_t wwRecharging_; // DHW recharge on/off + uint8_t wwTempOK_; // DHW temperature ok on/off uint8_t wwActive_; // - uint8_t wwHeat_; // 3-way valve on WW + uint8_t ww3wayValve_; // 3-way valve on WW uint8_t wwSetPumpPower_; // ww pump speed/power? uint8_t wwFlowTempOffset_; // Boiler offset for ww heating - uint8_t wwMaxPower_; // Warm Water maximum power - uint32_t wwStarts_; // Warm Water starts - uint32_t wwStarts2_; // Warm water control starts - uint32_t wwWorkM_; // Warm Water minutes + uint8_t wwMaxPower_; // DHW maximum power + uint32_t wwStarts_; // DHW starts + uint32_t wwStarts2_; // DHW control starts + uint32_t wwWorkM_; // DHW minutes int8_t wwHystOn_; int8_t wwHystOff_; - uint8_t wwTapActivated_; // maintenance-mode to switch DHW off - uint16_t wwMixerTemp_; // mixing temperature - uint16_t wwTankMiddleTemp_; // Tank middle temperature (TS3) + uint8_t wwTapActivated_; // maintenance-mode to switch DHW off + uint16_t wwMixerTemp_; // mixing temperature + uint16_t wwCylMiddleTemp_; // Cyl middle temperature (TS3) // main - uint8_t id_; // product id - uint8_t dummy8u_; // for commands with no output - uint8_t dummybool_; // for commands with no output + uint8_t reset_; // for reset command uint8_t heatingActive_; // Central heating is on/off uint8_t tapwaterActive_; // Hot tap water is on/off uint8_t selFlowTemp_; // Selected flow temperature @@ -110,10 +104,12 @@ class Boiler : public EMSdevice { uint16_t boilTemp_; // Boiler temperature uint16_t exhaustTemp_; // Exhaust temperature uint8_t burnGas_; // Gas on/off + uint8_t burnGas2_; // Gas stage 2 on/off uint16_t flameCurr_; // Flame current in micro amps uint8_t heatingPump_; // Boiler heating pump on/off uint8_t fanWork_; // Fan on/off uint8_t ignWork_; // Ignition on/off + uint8_t oilPreHeat_; // oil preheating on uint8_t heatingActivated_; // Heating activated on the boiler uint8_t heatingTemp_; // Heating temperature setting on the boiler uint8_t pumpModMax_; // Boiler circuit pump modulation max. power % @@ -131,7 +127,7 @@ class Boiler : public EMSdevice { uint32_t burnWorkMin_; // Total burner operating time uint32_t heatWorkMin_; // Total heat operating time uint32_t UBAuptime_; // Total UBA working hours - char lastCode_[60]; // last error code + char lastCode_[75]; // last error code char serviceCode_[4]; // 3 character status/service code uint16_t serviceCodeNumber_; // error/service code @@ -139,21 +135,21 @@ class Boiler : public EMSdevice { uint32_t upTimeControl_; // Operating time control uint32_t upTimeCompHeating_; // Operating time compressor heating uint32_t upTimeCompCooling_; // Operating time compressor cooling - uint32_t upTimeCompWw_; // Operating time compressor warm water + uint32_t upTimeCompWw_; // Operating time compressor DHW uint32_t upTimeCompPool_; // Operating time compressor pool uint32_t totalCompStarts_; // Total Commpressor control starts uint32_t heatingStarts_; // Heating control starts uint32_t coolingStarts_; // Cooling control starts - uint32_t poolStarts_; // Warm water control starts + uint32_t poolStarts_; // DHW control starts uint32_t nrgConsTotal_; // Energy consumption total uint32_t nrgConsCompTotal_; // Energy consumption compressor total uint32_t nrgConsCompHeating_; // Energy consumption compressor heating - uint32_t nrgConsCompWw_; // Energy consumption compressor warm water + uint32_t nrgConsCompWw_; // Energy consumption compressor DHW uint32_t nrgConsCompCooling_; // Energy consumption compressor cooling uint32_t nrgConsCompPool_; // Energy consumption compressor pool uint32_t nrgSuppTotal_; // Energy supplied total uint32_t nrgSuppHeating_; // Energy supplied heating - uint32_t nrgSuppWw_; // Energy supplied warm water + uint32_t nrgSuppWw_; // Energy supplied DHW uint32_t nrgSuppCooling_; // Energy supplied cooling uint32_t nrgSuppPool_; // Energy supplied pool uint32_t auxElecHeatNrgConsTotal_; // Auxiliary electrical heater energy consumption total diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index 9ee937b90..d242d0a5c 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -22,15 +22,8 @@ namespace emsesp { REGISTER_FACTORY(Connect, EMSdevice::DeviceType::CONNECT); -uuid::log::Logger Connect::logger_{F_(connect), uuid::log::Facility::CONSOLE}; - -Connect::Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Connect::Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { } -// publish HA config -bool Connect::publish_ha_device_config() { - return true; -} - } // namespace emsesp \ No newline at end of file diff --git a/src/devices/connect.h b/src/devices/connect.h index 87b9a39d9..a29b711b1 100644 --- a/src/devices/connect.h +++ b/src/devices/connect.h @@ -25,12 +25,7 @@ namespace emsesp { class Connect : public EMSdevice { public: - Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); - - private: - static uuid::log::Logger logger_; + Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); }; } // namespace emsesp diff --git a/src/devices/controller.cpp b/src/devices/controller.cpp index 6367bb173..b30116d8e 100644 --- a/src/devices/controller.cpp +++ b/src/devices/controller.cpp @@ -22,15 +22,8 @@ namespace emsesp { REGISTER_FACTORY(Controller, EMSdevice::DeviceType::CONTROLLER); -uuid::log::Logger Controller::logger_{F_(controller), uuid::log::Facility::CONSOLE}; - -Controller::Controller(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Controller::Controller(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { } -// publish HA config -bool Controller::publish_ha_device_config() { - return true; -} - } // namespace emsesp \ No newline at end of file diff --git a/src/devices/controller.h b/src/devices/controller.h index fbd9978b3..76e11e59a 100644 --- a/src/devices/controller.h +++ b/src/devices/controller.h @@ -25,12 +25,7 @@ namespace emsesp { class Controller : public EMSdevice { public: - Controller(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); - - private: - static uuid::log::Logger logger_; + Controller(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); }; } // namespace emsesp diff --git a/src/devices/gateway.cpp b/src/devices/gateway.cpp index 11d9169d9..9109e63ad 100644 --- a/src/devices/gateway.cpp +++ b/src/devices/gateway.cpp @@ -22,15 +22,8 @@ namespace emsesp { REGISTER_FACTORY(Gateway, EMSdevice::DeviceType::GATEWAY); -uuid::log::Logger Gateway::logger_{F_(gateway), uuid::log::Facility::CONSOLE}; - -Gateway::Gateway(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Gateway::Gateway(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { } -// publish HA config -bool Gateway::publish_ha_device_config() { - return true; -} - } // namespace emsesp \ No newline at end of file diff --git a/src/devices/gateway.h b/src/devices/gateway.h index 97295c1c9..4132780ec 100644 --- a/src/devices/gateway.h +++ b/src/devices/gateway.h @@ -25,12 +25,7 @@ namespace emsesp { class Gateway : public EMSdevice { public: - Gateway(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); - - private: - static uuid::log::Logger logger_; + Gateway(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); }; } // namespace emsesp diff --git a/src/devices/generic.cpp b/src/devices/generic.cpp index 9616151dd..d5a5a72c6 100644 --- a/src/devices/generic.cpp +++ b/src/devices/generic.cpp @@ -24,23 +24,18 @@ REGISTER_FACTORY(Generic, EMSdevice::DeviceType::GENERIC); uuid::log::Logger Generic::logger_{F_(generic), uuid::log::Facility::CONSOLE}; -Generic::Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Generic::Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { // RF-Sensor 0x40 sending temperature in telegram 0x435, see https://github.com/emsesp/EMS-ESP32/issues/103 if (device_id == 0x40) { register_telegram_type(0x435, F("RFSensorMessage"), false, MAKE_PF_CB(process_RFSensorMessage)); - register_device_value(TAG_NONE, &rfTemp_, DeviceValueType::SHORT, FL_(div10), FL_(RFTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &rfTemp_, DeviceValueType::SHORT, FL_(div10), FL_(RFTemp), DeviceValueUOM::DEGREES); } } -// publish HA config -bool Generic::publish_ha_device_config() { - return true; -} - // type 0x435 rf remote sensor void Generic::process_RFSensorMessage(std::shared_ptr telegram) { - has_update(telegram->read_value(rfTemp_, 0)); // is * 10 + has_update(telegram, rfTemp_, 0); // is * 10 } -} // namespace emsesp \ No newline at end of file +} // namespace emsesp diff --git a/src/devices/generic.h b/src/devices/generic.h index 19e8c0c01..8c1e6427a 100644 --- a/src/devices/generic.h +++ b/src/devices/generic.h @@ -25,9 +25,7 @@ namespace emsesp { class Generic : public EMSdevice { public: - Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); + Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); private: static uuid::log::Logger logger_; diff --git a/src/devices/heatpump.cpp b/src/devices/heatpump.cpp index de10bc9e7..274441ccc 100644 --- a/src/devices/heatpump.cpp +++ b/src/devices/heatpump.cpp @@ -22,50 +22,15 @@ namespace emsesp { REGISTER_FACTORY(Heatpump, EMSdevice::DeviceType::HEATPUMP); -uuid::log::Logger Heatpump::logger_{F_(heatpump), uuid::log::Facility::CONSOLE}; - -Heatpump::Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Heatpump::Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { // telegram handlers register_telegram_type(0x042B, F("HP1"), true, MAKE_PF_CB(process_HPMonitor1)); register_telegram_type(0x047B, F("HP2"), true, MAKE_PF_CB(process_HPMonitor2)); // device values - register_device_value(TAG_NONE, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &airHumidity_, DeviceValueType::UINT, FL_(div2), FL_(airHumidity), DeviceValueUOM::PERCENT); - register_device_value(TAG_NONE, &dewTemperature_, DeviceValueType::UINT, nullptr, FL_(dewTemperature), DeviceValueUOM::DEGREES); - - id_ = product_id; -} - -// publish HA config -bool Heatpump::publish_ha_device_config() { - StaticJsonDocument doc; - doc["uniq_id"] = F_(heatpump); - doc["ic"] = F_(icondevice); - - char stat_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(stat_t, sizeof(stat_t), "%s/%s", Mqtt::base().c_str(), Mqtt::tag_to_topic(device_type(), DeviceValueTAG::TAG_NONE).c_str()); - doc["stat_t"] = stat_t; - - char name_s[40]; - snprintf(name_s, sizeof(name_s), FSTR_(productid_fmt), device_type_name().c_str()); - doc["name"] = name_s; - - doc["val_tpl"] = FJSON("{{value_json.id}}"); - JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = FJSON("EMS-ESP Heat Pump"); - dev["sw"] = EMSESP_APP_VERSION; - dev["mf"] = brand_to_string(); - dev["mdl"] = this->name(); - JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp-heatpump"); - - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/heatpump/config", Mqtt::base().c_str()); - Mqtt::publish_ha(topic, doc.as()); // publish the config payload with retain flag - - return true; + register_device_value(DeviceValueTAG::TAG_NONE, &airHumidity_, DeviceValueType::UINT, FL_(div2), FL_(airHumidity), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_NONE, &dewTemperature_, DeviceValueType::UINT, nullptr, FL_(dewTemperature), DeviceValueUOM::DEGREES); } /* @@ -73,8 +38,8 @@ bool Heatpump::publish_ha_device_config() { * e.g. "38 10 FF 00 03 7B 08 24 00 4B" */ void Heatpump::process_HPMonitor2(std::shared_ptr telegram) { - has_update(telegram->read_value(dewTemperature_, 0)); - has_update(telegram->read_value(airHumidity_, 1)); + has_update(telegram, dewTemperature_, 0); + has_update(telegram, airHumidity_, 1); } #pragma GCC diagnostic push @@ -90,4 +55,4 @@ void Heatpump::process_HPMonitor1(std::shared_ptr telegram) { #pragma GCC diagnostic pop -} // namespace emsesp \ No newline at end of file +} // namespace emsesp diff --git a/src/devices/heatpump.h b/src/devices/heatpump.h index ef69a6358..fc8e51876 100644 --- a/src/devices/heatpump.h +++ b/src/devices/heatpump.h @@ -25,16 +25,11 @@ namespace emsesp { class Heatpump : public EMSdevice { public: - Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); + Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); private: - static uuid::log::Logger logger_; - uint8_t airHumidity_; uint8_t dewTemperature_; - uint8_t id_; void process_HPMonitor1(std::shared_ptr telegram); void process_HPMonitor2(std::shared_ptr telegram); diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index 53fbb097b..daeb29840 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -24,41 +24,59 @@ REGISTER_FACTORY(Mixer, EMSdevice::DeviceType::MIXER); uuid::log::Logger Mixer::logger_{F_(mixer), uuid::log::Facility::CONSOLE}; -Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { // Pool module if (flags == EMSdevice::EMS_DEVICE_FLAG_MP) { register_telegram_type(0x5BA, F("HpPoolStatus"), true, MAKE_PF_CB(process_HpPoolStatus)); type_ = Type::MP; - register_device_value(TAG_NONE, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &poolTemp_, DeviceValueType::SHORT, FL_(div10), FL_(poolTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_NONE, &poolShuntStatus_, DeviceValueType::ENUM, FL_(enum_shunt), FL_(poolShuntStatus), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &poolShunt_, DeviceValueType::UINT, nullptr, FL_(poolShunt), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_NONE, &poolTemp_, DeviceValueType::SHORT, FL_(div10), FL_(poolTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &poolShuntStatus_, DeviceValueType::ENUM, FL_(enum_shunt), FL_(poolShuntStatus), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &poolShunt_, DeviceValueType::UINT, nullptr, FL_(poolShunt), DeviceValueUOM::PERCENT); } // EMS+ if (flags == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { if (device_id >= 0x20 && device_id <= 0x27) { - register_telegram_type(device_id - 0x20 + 0x02D7, F("MMPLUSStatusMessage_HC"), true, MAKE_PF_CB(process_MMPLUSStatusMessage_HC)); + register_telegram_type(device_id - 0x20 + 0x02D7, F("MMPLUSStatusMessage_HC"), false, MAKE_PF_CB(process_MMPLUSStatusMessage_HC)); // register_telegram_type(device_id - 0x20 + 0x02E1, F("MMPLUSStetMessage_HC"), true, MAKE_PF_CB(process_MMPLUSSetMessage_HC)); type_ = Type::HC; hc_ = device_id - 0x20 + 1; - uint8_t tag = TAG_HC1 + hc_ - 1; - register_device_value(tag, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); + uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); } else if (device_id >= 0x28 && device_id <= 0x29) { - register_telegram_type(device_id - 0x28 + 0x0331, F("MMPLUSStatusMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSStatusMessage_WWC)); + register_telegram_type(device_id - 0x28 + 0x0331, F("MMPLUSStatusMessage_WWC"), false, MAKE_PF_CB(process_MMPLUSStatusMessage_WWC)); + register_telegram_type(device_id - 0x28 + 0x0313, F("MMPLUSConfigMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSConfigMessage_WWC)); // register_telegram_type(device_id - 0x28 + 0x033B, F("MMPLUSSetMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSSetMessage_WWC)); type_ = Type::WWC; hc_ = device_id - 0x28 + 1; - uint8_t tag = TAG_WWC1 + hc_ - 1; - register_device_value(tag, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); + uint8_t tag = DeviceValueTAG::TAG_WWC1 + hc_ - 1; register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp), DeviceValueUOM::DEGREES); register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(wwPumpStatus), DeviceValueUOM::NONE); register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(wwTempStatus), DeviceValueUOM::NONE); + + register_device_value(tag, &wwMaxTemp_, DeviceValueType::UINT, nullptr, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); + register_device_value(tag, &wwDiffTemp_, DeviceValueType::INT, nullptr, FL_(wwDiffTemp), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwDiffTemp)); + register_device_value(tag, + &wwDisinfectionTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwDisinfectionTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwDisinfectionTemp)); + register_device_value(tag, &wwReducedTemp_, DeviceValueType::UINT, nullptr, FL_(wwRedTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwReducedTemp)); + register_device_value(tag, &wwRequiredTemp_, DeviceValueType::UINT, nullptr, FL_(wwRequiredTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwRequiredTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircPump_, + DeviceValueType::BOOL, + nullptr, + FL_(wwCircPump), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwCircPump)); + register_device_value(tag, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircMode)); } } @@ -67,17 +85,16 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const s register_telegram_type(0x00AA, F("MMConfigMessage"), true, MAKE_PF_CB(process_MMConfigMessage)); register_telegram_type(0x00AB, F("MMStatusMessage"), false, MAKE_PF_CB(process_MMStatusMessage)); register_telegram_type(0x00AC, F("MMSetMessage"), false, MAKE_PF_CB(process_MMSetMessage)); - // EMSESP::send_read_request(0xAA, device_id); type_ = Type::HC; hc_ = device_id - 0x20 + 1; - uint8_t tag = TAG_HC1 + hc_ - 1; - register_device_value(tag, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); + uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); register_device_value(tag, &activated_, DeviceValueType::BOOL, nullptr, FL_(activated), DeviceValueUOM::NONE, MAKE_CF_CB(set_activated)); - register_device_value(tag, &setValveTime_, DeviceValueType::UINT, FL_(mul10), FL_(mixerSetTime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_setValveTime), 1, 12); + register_device_value( + tag, &setValveTime_, DeviceValueType::UINT, FL_(mul10), FL_(mixerSetTime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_setValveTime), 10, 120); } // HT3 @@ -87,99 +104,32 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const s // register_telegram_type(0x0123, F("IPMSetMessage"), false, MAKE_PF_CB(process_IPMSetMessage)); type_ = Type::HC; hc_ = device_id - 0x20 + 1; - uint8_t tag = TAG_HC1 + hc_ - 1; - register_device_value(tag, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); + uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); register_device_value(tag, &flowTempVf_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempVf), DeviceValueUOM::DEGREES); } - - id_ = product_id; -} - -// publish HA config -bool Mixer::publish_ha_device_config() { - // if we don't have valid values for this HC don't add it ever again - if (!Helpers::hasValue(pumpStatus_)) { - return false; - } - - StaticJsonDocument doc; - - char uniq_id[20]; - if (type_ == Type::MP) { - snprintf(uniq_id, sizeof(uniq_id), "MixerMP"); - } else { - snprintf(uniq_id, sizeof(uniq_id), "Mixer%02X", device_id() - 0x20 + 1); - } - doc["uniq_id"] = uniq_id; - - doc["ic"] = F_(icondevice); - - char stat_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(stat_t, sizeof(stat_t), "%s/%s", Mqtt::base().c_str(), Mqtt::tag_to_topic(device_type(), DeviceValueTAG::TAG_NONE).c_str()); - doc["stat_t"] = stat_t; - - char name[20]; - if (type_ == Type::MP) { - snprintf(name, sizeof(name), "Mixer MP"); - } else { - snprintf(name, sizeof(name), "Mixer %02X", device_id() - 0x20 + 1); - } - doc["name"] = name; - - char tpl[30]; - if (type_ == Type::HC) { - snprintf(tpl, sizeof(tpl), "{{value_json.hc%d.id}}", device_id() - 0x20 + 1); - } else if (type_ == Type::WWC) { - snprintf(tpl, sizeof(tpl), "{{value_json.wwc%d.id}}", device_id() - 0x28 + 1); - } else { - snprintf(tpl, sizeof(tpl), "{{value_json.id}}"); - } - doc["val_tpl"] = tpl; - - JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = FJSON("EMS-ESP Mixer"); - dev["sw"] = EMSESP_APP_VERSION; - dev["mf"] = brand_to_string(); - dev["mdl"] = this->name(); - JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp-mixer"); - - // determine the topic, if its HC and WWC. This is determined by the incoming telegram types. - std::string topic(Mqtt::MQTT_TOPIC_MAX_SIZE, '\0'); - if (type_ == Type::HC) { - snprintf(&topic[0], topic.capacity() + 1, "sensor/%s/mixer_hc%d/config", Mqtt::base().c_str(), hc_); - } else if (type_ == Type::WWC) { - snprintf(&topic[0], topic.capacity() + 1, "sensor/%s/mixer_wwc%d/config", Mqtt::base().c_str(), hc_); // WWC - } else if (type_ == Type::MP) { - snprintf(&topic[0], topic.capacity() + 1, "sensor/%s/mixer_mp/config", Mqtt::base().c_str()); - } - - Mqtt::publish_ha(topic, doc.as()); // publish the config payload with retain flag - - return true; } // heating circuits 0x02D7, 0x02D8 etc... // e.g. A0 00 FF 00 01 D7 00 00 00 80 00 00 00 00 03 C5 // A0 0B FF 00 01 D7 00 00 00 80 00 00 00 00 03 80 void Mixer::process_MMPLUSStatusMessage_HC(std::shared_ptr telegram) { - has_update(telegram->read_value(flowTempHc_, 3)); // is * 10 - has_update(telegram->read_value(flowSetTemp_, 5)); - has_update(telegram->read_bitvalue(pumpStatus_, 0, 0)); - has_update(telegram->read_value(status_, 2)); // valve status + has_update(telegram, flowTempHc_, 3); // is * 10 + has_update(telegram, flowSetTemp_, 5); + has_bitupdate(telegram, pumpStatus_, 0, 0); + has_update(telegram, status_, 2); // valve status } // Mixer warm water loading/DHW - 0x0331, 0x0332 // e.g. A9 00 FF 00 02 32 02 6C 00 3C 00 3C 3C 46 02 03 03 00 3C // on 0x28 // A8 00 FF 00 02 31 02 35 00 3C 00 3C 3C 46 02 03 03 00 3C // in 0x29 void Mixer::process_MMPLUSStatusMessage_WWC(std::shared_ptr telegram) { - has_update(telegram->read_value(flowTempHc_, 0)); // is * 10 - has_update(telegram->read_bitvalue(pumpStatus_, 2, 0)); - has_update(telegram->read_value(status_, 11)); // temp status + has_update(telegram, flowTempHc_, 0); // is * 10 + has_bitupdate(telegram, pumpStatus_, 2, 0); + has_update(telegram, status_, 11); // temp status } // Mixer IPM - 0x010C @@ -195,18 +145,27 @@ void Mixer::process_IPMStatusMessage(std::shared_ptr telegram) { // do we have a mixed circuit if (ismixed == 2) { - has_update(telegram->read_value(flowTempHc_, 3)); // is * 10 - has_update(telegram->read_value(status_, 2)); // valve status + has_update(telegram, flowTempHc_, 3); // is * 10 + has_update(telegram, status_, 2); // valve status } - has_update(telegram->read_bitvalue(pumpStatus_, 1, 0)); // pump is also in unmixed circuits - has_update(telegram->read_value(flowSetTemp_, 5)); // flowSettemp is also in unmixed circuits, see #711 + has_bitupdate(telegram, pumpStatus_, 1, 0); // pump is also in unmixed circuits + has_update(telegram, flowSetTemp_, 5); // flowSettemp is also in unmixed circuits, see #711 } // Mixer IPM - 0x001E Temperature Message in unmixed circuits // in unmixed circuits FlowTemp in 10C is zero, this is the measured flowtemp in header void Mixer::process_IPMTempMessage(std::shared_ptr telegram) { - has_update(telegram->read_value(flowTempVf_, 0)); // TC1, is * 10 + has_update(telegram, flowTempVf_, 0); // TC1, is * 10 +} + +// Mixer MP100 for pools - 0x5BA +void Mixer::process_HpPoolStatus(std::shared_ptr telegram) { + has_update(telegram, poolTemp_, 0); + has_update(telegram, poolShunt_, 3); // 0-100% how much is the shunt open? + telegram->read_value(poolShuntStatus__, 2); + uint8_t pss = poolShunt_ == 100 ? 3 : (poolShunt_ == 0 ? 4 : poolShuntStatus__); + has_update(poolShuntStatus_, pss); } // Mixer on a MM10 - 0xAB @@ -217,41 +176,67 @@ void Mixer::process_MMStatusMessage(std::shared_ptr telegram) { // 0x21 is position 2. 0x20 is typically reserved for the WM10 switch module // see https://github.com/emsesp/EMS-ESP/issues/270 and https://github.com/emsesp/EMS-ESP/issues/386#issuecomment-629610918 - has_update(telegram->read_value(flowTempHc_, 1)); // is * 10 - has_update(telegram->read_bitvalue(pumpStatus_, 3, 2)); // is 0 or 0x64 (100%), check only bit 2 - has_update(telegram->read_value(flowSetTemp_, 0)); - has_update(telegram->read_value(status_, 4)); // valve status -100 to 100 + has_update(telegram, flowTempHc_, 1); // is * 10 + has_bitupdate(telegram, pumpStatus_, 3, 2); // is 0 or 0x64 (100%), check only bit 2 + has_update(telegram, flowSetTemp_, 0); + has_update(telegram, status_, 4); // valve status -100 to 100 } -// Pool mixer MP100, - 0x5BA -void Mixer::process_HpPoolStatus(std::shared_ptr telegram) { - has_update(telegram->read_value(poolTemp_, 0)); - has_update(telegram->read_value(poolShuntStatus__, 2)); - has_update(telegram->read_value(poolShunt_, 3)); // 0-100% how much is the shunt open? - poolShuntStatus_ = poolShunt_ == 100 ? 3 : (poolShunt_ == 0 ? 4 : poolShuntStatus__); -} +/* +* The set-messages are not broadcasted and send from thermostat to mixer, +* we have to fetch for processing +*/ // Mixer on a MM10 - 0xAA // e.g. Thermostat -> Mixer Module, type 0xAA, telegram: 10 21 AA 00 FF 0C 0A 11 0A 32 xx void Mixer::process_MMConfigMessage(std::shared_ptr telegram) { - has_update(telegram->read_value(activated_, 0)); // on = 0xFF - has_update(telegram->read_value(setValveTime_, 1)); // valve runtime in 10 sec, max 120 s + has_update(telegram, activated_, 0); // on = 0xFF + has_update(telegram, setValveTime_, 1); // valve runtime in 10 sec, max 120 s +} + +// Config message 0x313, has to be fetched +void Mixer::process_MMPLUSConfigMessage_WWC(std::shared_ptr telegram) { + has_update(telegram, wwRequiredTemp_, 4); + has_update(telegram, wwReducedTemp_, 5); + has_update(telegram, wwDiffTemp_, 7); + has_update(telegram, wwDisinfectionTemp_, 9); + has_update(telegram, wwMaxTemp_, 10); } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" +// Thermostat(0x10) -> Mixer(0x20), ?(0x2E1), data: 01 1C 64 00 01 +// Thermostat(0x10) -> Mixing Module(0x20), (0x2E1), data: 01 00 00 00 01 +// Thermostat(0x10) -> Mixing Module(0x20), (0x2EB), data: 00 +void Mixer::process_MMPLUSSetMessage_HC(std::shared_ptr telegram) { + // pos 1: setpoint + // pos2: pump +} + +// unknown, 2 examples from older threads +// Thermostat(0x10) -> Mixer(0x28), ?(0x33B), data: 01 01 00 +// Thermostat -> Mixing Module, type 0x023B, telegram: 90 28 FF 00 02 3B 00 02 00 (CRC=68) +void Mixer::process_MMPLUSSetMessage_WWC(std::shared_ptr telegram) { +} + +// MMPLUS telegram 0x345 unknown +// Solar Module -> Mixing Module, type 0x0245, telegram: B0 28 FF 00 02 45 64 01 01 (CRC=36) +// ? + // Mixer on a MM10 - 0xAC // e.g. Thermostat -> Mixer Module, type 0xAC, telegram: 10 21 AC 00 1E 64 01 AB void Mixer::process_MMSetMessage(std::shared_ptr telegram) { // pos 0: flowtemp setpoint 1E = 30°C - // pos 1: position in % + // pos 1: pump in % + // pos 2 flags (mostly 01) + // LOG_INFO("MM10 SetMessage received"); } // Thermostat(0x10) -> Mixer(0x21), ?(0x23), data: 1A 64 00 90 21 23 00 1A 64 00 89 void Mixer::process_IPMSetMessage(std::shared_ptr telegram) { // pos 0: flowtemp setpoint 1A = 26°C - // pos 1: position in %? + // pos 1: pump in %? } #pragma GCC diagnostic pop @@ -261,7 +246,6 @@ bool Mixer::set_flowSetTemp(const char * value, const int8_t id) { if (!Helpers::value2number(value, v)) { return false; } - LOG_INFO(F("Setting mixer flow set temperature to %d"), v); if (flags() == EMSdevice::EMS_DEVICE_FLAG_MM10) { write_command(0xAC, 0, v, 0xAB); return true; @@ -283,7 +267,6 @@ bool Mixer::set_pump(const char * value, const int8_t id) { if (!Helpers::value2bool(value, b)) { return false; } - LOG_INFO(F("Setting mixer pump %s"), b ? "on" : "off"); if (flags() == EMSdevice::EMS_DEVICE_FLAG_MM10) { write_command(0xAC, 1, b ? 0x64 : 0, 0xAB); return true; @@ -306,7 +289,6 @@ bool Mixer::set_activated(const char * value, const int8_t id) { return false; } if (flags() == EMSdevice::EMS_DEVICE_FLAG_MM10) { - LOG_INFO(F("Setting mixer %s"), value); write_command(0xAA, 0, b ? 0xFF : 0, 0xAA); return true; } @@ -320,11 +302,81 @@ bool Mixer::set_setValveTime(const char * value, const int8_t id) { } if (flags() == EMSdevice::EMS_DEVICE_FLAG_MM10) { v = (v + 5) / 10; - LOG_INFO(F("Setting mixer valve time to %ds"), v * 10); write_command(0xAA, 1, v, 0xAA); return true; } return false; } +bool Mixer::set_wwMaxTemp(const char * value, const int8_t id) { + uint8_t wwc = device_id() - 0x28; + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x313 + wwc, 10, (uint8_t)v, 0x313 + wwc); + return true; +} + +bool Mixer::set_wwDiffTemp(const char * value, const int8_t id) { + uint8_t wwc = device_id() - 0x28; + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x313 + wwc, 7, (int8_t)(v * 10), 0x313 + wwc); + return true; +} + +bool Mixer::set_wwReducedTemp(const char * value, const int8_t id) { + uint8_t wwc = device_id() - 0x28; + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x313 + wwc, 5, (uint8_t)v, 0x313 + wwc); + return true; +} + +bool Mixer::set_wwRequiredTemp(const char * value, const int8_t id) { + uint8_t wwc = device_id() - 0x28; + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x313 + wwc, 4, (uint8_t)v, 0x313 + wwc); + return true; +} + +bool Mixer::set_wwDisinfectionTemp(const char * value, const int8_t id) { + uint8_t wwc = device_id() - 0x28; + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x313 + wwc, 9, (uint8_t)v, 0x313 + wwc); + return true; +} + +bool Mixer::set_wwCircPump(const char * value, const int8_t id) { + uint8_t wwc = device_id() - 0x28; + bool v = false; + if (!Helpers::value2bool(value, v)) { + return false; + } + write_command(0x33B + wwc, 0, v ? 0x01 : 0x00, 0x33B + wwc); + return true; +} + +bool Mixer::set_wwCircMode(const char * value, const int8_t id) { + uint8_t wwc = device_id() - 0x28; + uint8_t n; + if (!Helpers::value2enum(value, n, FL_(enum_wwCircMode))) { + return false; + } + write_command(0x313 + wwc, 0, n, 0x313 + wwc); + return true; +} + + } // namespace emsesp diff --git a/src/devices/mixer.h b/src/devices/mixer.h index 7bb4abd18..1547598bd 100644 --- a/src/devices/mixer.h +++ b/src/devices/mixer.h @@ -25,15 +25,16 @@ namespace emsesp { class Mixer : public EMSdevice { public: - Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); + Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); private: static uuid::log::Logger logger_; void process_MMPLUSStatusMessage_HC(std::shared_ptr telegram); + void process_MMPLUSSetMessage_HC(std::shared_ptr telegram); void process_MMPLUSStatusMessage_WWC(std::shared_ptr telegram); + void process_MMPLUSSetMessage_WWC(std::shared_ptr telegram); + void process_MMPLUSConfigMessage_WWC(std::shared_ptr telegram); void process_IPMStatusMessage(std::shared_ptr telegram); void process_IPMTempMessage(std::shared_ptr telegram); void process_IPMSetMessage(std::shared_ptr telegram); @@ -47,12 +48,20 @@ class Mixer : public EMSdevice { bool set_activated(const char * value, const int8_t id); bool set_setValveTime(const char * value, const int8_t id); + bool set_wwMaxTemp(const char * value, const int8_t id); + bool set_wwDiffTemp(const char * value, const int8_t id); + bool set_wwReducedTemp(const char * value, const int8_t id); + bool set_wwRequiredTemp(const char * value, const int8_t id); + bool set_wwDisinfectionTemp(const char * value, const int8_t id); + bool set_wwCircPump(const char * value, const int8_t id); + bool set_wwCircMode(const char * value, const int8_t id); + + enum class Type { NONE, HC, // heating circuit WWC, // warm water circuit MP // pool - }; private: @@ -64,14 +73,23 @@ class Mixer : public EMSdevice { uint8_t activated_; uint8_t setValveTime_; + // MM100wwParam - 0x0313, 0x033B + uint8_t wwMaxTemp_; + uint8_t wwRequiredTemp_; + uint8_t wwReducedTemp_; + uint8_t wwDiffTemp_; + uint8_t wwDisinfectionTemp_; + uint8_t wwCircPump_; + uint8_t wwCircMode_; + + // MP100 pool int16_t poolTemp_; - int8_t poolShuntStatus_; - int8_t poolShunt_; + uint8_t poolShuntStatus_; + uint8_t poolShunt_; Type type_ = Type::NONE; uint16_t hc_ = EMS_VALUE_USHORT_NOTSET; - int8_t poolShuntStatus__ = EMS_VALUE_INT_NOTSET; // temp value - uint8_t id_; + uint8_t poolShuntStatus__ = EMS_VALUE_UINT_NOTSET; // temp value }; } // namespace emsesp diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index 667b5ee2f..0eeeb2a22 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -24,7 +24,7 @@ REGISTER_FACTORY(Solar, EMSdevice::DeviceType::SOLAR); uuid::log::Logger Solar::logger_{F_(solar), uuid::log::Facility::CONSOLE}; -Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { // telegram handlers if (flags == EMSdevice::EMS_DEVICE_FLAG_SM10) { @@ -38,18 +38,27 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const s register_telegram_type(0x07D6, F("SM100wwTemperature"), false, MAKE_PF_CB(process_SM100wwTemperature)); register_telegram_type(0x07AA, F("SM100wwStatus"), false, MAKE_PF_CB(process_SM100wwStatus)); register_telegram_type(0x07AB, F("SM100wwCommand"), false, MAKE_PF_CB(process_SM100wwCommand)); + register_telegram_type(0x07A5, F("SM100wwCirc"), true, MAKE_PF_CB(process_SM100wwCirc)); + register_telegram_type(0x07A6, F("SM100wwParam"), true, MAKE_PF_CB(process_SM100wwParam)); + register_telegram_type(0x07AE, F("SM100wwKeepWarm"), true, MAKE_PF_CB(process_SM100wwKeepWarm)); + register_telegram_type(0x07E0, F("SM100wwStatus2"), true, MAKE_PF_CB(process_SM100wwStatus2)); } else { - register_telegram_type(0xF9, F("ParamCfg"), false, MAKE_PF_CB(process_SM100ParamCfg)); + // F9 is not a telegram type, it's a flag for configure + // register_telegram_type(0xF9, F("ParamCfg"), false, MAKE_PF_CB(process_SM100ParamCfg)); register_telegram_type(0x0358, F("SM100SystemConfig"), true, MAKE_PF_CB(process_SM100SystemConfig)); - register_telegram_type(0x035A, F("SM100SolarCircuitConfig"), true, MAKE_PF_CB(process_SM100SolarCircuitConfig)); - register_telegram_type(0x0362, F("SM100Monitor"), true, MAKE_PF_CB(process_SM100Monitor)); - register_telegram_type(0x0363, F("SM100Monitor2"), true, MAKE_PF_CB(process_SM100Monitor2)); - register_telegram_type(0x0366, F("SM100Config"), true, MAKE_PF_CB(process_SM100Config)); + register_telegram_type(0x035A, F("SM100CircuitConfig"), true, MAKE_PF_CB(process_SM100CircuitConfig)); + register_telegram_type(0x035D, F("SM100Circuit2Config"), true, MAKE_PF_CB(process_SM100Circuit2Config)); + register_telegram_type(0x0362, F("SM100Monitor"), false, MAKE_PF_CB(process_SM100Monitor)); + register_telegram_type(0x0363, F("SM100Monitor2"), false, MAKE_PF_CB(process_SM100Monitor2)); + register_telegram_type(0x0366, F("SM100Config"), false, MAKE_PF_CB(process_SM100Config)); register_telegram_type(0x0364, F("SM100Status"), false, MAKE_PF_CB(process_SM100Status)); register_telegram_type(0x036A, F("SM100Status2"), false, MAKE_PF_CB(process_SM100Status2)); register_telegram_type(0x0380, F("SM100CollectorConfig"), true, MAKE_PF_CB(process_SM100CollectorConfig)); register_telegram_type(0x038E, F("SM100Energy"), true, MAKE_PF_CB(process_SM100Energy)); register_telegram_type(0x0391, F("SM100Time"), true, MAKE_PF_CB(process_SM100Time)); + register_telegram_type(0x035F, F("SM100Config1"), true, MAKE_PF_CB(process_SM100Config1)); + register_telegram_type(0x035C, F("SM100HeatAssist"), true, MAKE_PF_CB(process_SM100HeatAssist)); + register_telegram_type(0x0361, F("SM100Differential"), true, MAKE_PF_CB(process_SM100Differential)); } } @@ -59,193 +68,370 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const s } // device values... - register_device_value(TAG_NONE, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); - id_ = product_id; // special case for a device_id with 0x2A where it's not actual a solar module if (device_id == 0x2A) { - register_device_value(TAG_NONE, &type_, DeviceValueType::STRING, nullptr, FL_(type), DeviceValueUOM::NONE); - strlcpy(type_, "warm water circuit", sizeof(type_)); - register_device_value(TAG_DEVICE_DATA_WW, &wwTemp_1_, DeviceValueType::UINT, nullptr, FL_(wwTemp1), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwTemp_3_, DeviceValueType::UINT, nullptr, FL_(wwTemp3), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwTemp_4_, DeviceValueType::UINT, nullptr, FL_(wwTemp4), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwTemp_5_, DeviceValueType::UINT, nullptr, FL_(wwTemp5), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwTemp_7_, DeviceValueType::UINT, nullptr, FL_(wwTemp7), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwPump_, DeviceValueType::UINT, nullptr, FL_(wwPump), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_3_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp3), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_4_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp4), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_5_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp5), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_7_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp7), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwPump_, DeviceValueType::BOOL, nullptr, FL_(wwPump), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwMaxTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwMaxTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwMaxTemp)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_, DeviceValueType::UINT, nullptr, FL_(wwTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwRedTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwRedTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwRedTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDailyTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwDailyTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwDailyTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfectionTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwDisinfectionTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwDisinfectionTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCirc_, DeviceValueType::BOOL, nullptr, FL_(wwCirc), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCirc)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircMode_, + DeviceValueType::ENUM, + FL_(enum_wwCircMode), + FL_(wwCircMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwCircMode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwKeepWarm_, + DeviceValueType::BOOL, + nullptr, + FL_(wwKeepWarm), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwKeepWarm)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwStatus2_, DeviceValueType::ENUM, FL_(enum_wwStatus2), FL_(wwStatus2), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwPumpMod_, DeviceValueType::UINT, nullptr, FL_(wwPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwFlow_, DeviceValueType::UINT, FL_(div10), FL_(wwFlow), DeviceValueUOM::LMIN); return; } - register_device_value(TAG_NONE, &collectorTemp_, DeviceValueType::SHORT, FL_(div10), FL_(collectorTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_NONE, &tankBottomTemp_, DeviceValueType::SHORT, FL_(div10), FL_(tankBottomTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_NONE, &solarPump_, DeviceValueType::BOOL, nullptr, FL_(solarPump), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &pumpWorkTime_, DeviceValueType::TIME, nullptr, FL_(pumpWorkTime), DeviceValueUOM::MINUTES); - register_device_value(TAG_NONE, &tankMaxTemp_, DeviceValueType::UINT, nullptr, FL_(tankMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TankMaxTemp)); + register_device_value(DeviceValueTAG::TAG_NONE, &collectorTemp_, DeviceValueType::SHORT, FL_(div10), FL_(collectorTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &cylBottomTemp_, DeviceValueType::SHORT, FL_(div10), FL_(cylBottomTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &solarPump_, DeviceValueType::BOOL, nullptr, FL_(solarPump), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &pumpWorkTime_, DeviceValueType::TIME, nullptr, FL_(pumpWorkTime), DeviceValueUOM::MINUTES); + register_device_value( + DeviceValueTAG::TAG_NONE, &cylMaxTemp_, DeviceValueType::UINT, nullptr, FL_(cylMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_cylMaxTemp)); + register_device_value(DeviceValueTAG::TAG_NONE, &collectorShutdown_, DeviceValueType::BOOL, nullptr, FL_(collectorShutdown), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &cylHeated_, DeviceValueType::BOOL, nullptr, FL_(cylHeated), DeviceValueUOM::NONE); if (flags == EMSdevice::EMS_DEVICE_FLAG_SM10) { - register_device_value(TAG_NONE, &solarPumpModulation_, DeviceValueType::UINT, nullptr, FL_(solarPumpModulation), DeviceValueUOM::PERCENT); - register_device_value(TAG_NONE, &solarPumpMinMod_, DeviceValueType::UINT, nullptr, FL_(pumpMinMod), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_PumpMinMod)); + register_device_value(DeviceValueTAG::TAG_NONE, &solarPumpMod_, DeviceValueType::UINT, nullptr, FL_(solarPumpMod), DeviceValueUOM::PERCENT); register_device_value( - TAG_NONE, &solarPumpTurnonDiff_, DeviceValueType::UINT, nullptr, FL_(solarPumpTurnonDiff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TurnonDiff)); + DeviceValueTAG::TAG_NONE, &solarPumpMinMod_, DeviceValueType::UINT, nullptr, FL_(pumpMinMod), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_PumpMinMod)); + register_device_value(DeviceValueTAG::TAG_NONE, + &solarPumpTurnonDiff_, + DeviceValueType::UINT, + nullptr, + FL_(solarPumpTurnonDiff), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_TurnonDiff)); + register_device_value(DeviceValueTAG::TAG_NONE, + &solarPumpTurnoffDiff_, + DeviceValueType::UINT, + nullptr, + FL_(solarPumpTurnoffDiff), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_TurnoffDiff)); register_device_value( - TAG_NONE, &solarPumpTurnoffDiff_, DeviceValueType::UINT, nullptr, FL_(solarPumpTurnoffDiff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TurnoffDiff)); - register_device_value(TAG_NONE, &collectorShutdown_, DeviceValueType::BOOL, nullptr, FL_(collectorShutdown), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &tankHeated_, DeviceValueType::BOOL, nullptr, FL_(tankHeated), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &solarPower_, DeviceValueType::ULONG, nullptr, FL_(solarPower), DeviceValueUOM::W); - register_device_value(TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); - register_device_value(TAG_NONE, &maxFlow_, DeviceValueType::UINT, FL_(div10), FL_(maxFlow), DeviceValueUOM::LMIN, MAKE_CF_CB(set_SM10MaxFlow)); - register_device_value(TAG_DEVICE_DATA_WW, &wwMinTemp_, DeviceValueType::UINT, nullptr, FL_(wwMinTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMinTemp)); - register_device_value(TAG_NONE, &solarIsEnabled_, DeviceValueType::BOOL, nullptr, FL_(activated), DeviceValueUOM::NONE, MAKE_CF_CB(set_solarEnabled)); + DeviceValueTAG::TAG_NONE, &setting3_, DeviceValueType::UINT, nullptr, FL_(setting3), DeviceValueUOM::NONE, MAKE_CF_CB(set_CollectorMaxTemp)); + register_device_value( + DeviceValueTAG::TAG_NONE, &setting4_, DeviceValueType::UINT, nullptr, FL_(setting4), DeviceValueUOM::NONE, MAKE_CF_CB(set_CollectorMinTemp)); + register_device_value(DeviceValueTAG::TAG_NONE, &solarPower_, DeviceValueType::SHORT, nullptr, FL_(solarPower), DeviceValueUOM::W); + register_device_value(DeviceValueTAG::TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); + register_device_value(DeviceValueTAG::TAG_NONE, &maxFlow_, DeviceValueType::UINT, FL_(div10), FL_(maxFlow), DeviceValueUOM::LMIN, MAKE_CF_CB(set_SM10MaxFlow)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwMinTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwMinTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwMinTemp)); + register_device_value(DeviceValueTAG::TAG_NONE, + &solarIsEnabled_, + DeviceValueType::BOOL, + nullptr, + FL_(solarIsEnabled), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_solarEnabled)); + + register_device_value(DeviceValueTAG::TAG_NONE, &data11_, DeviceValueType::UINT, nullptr, FL_(data11), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &data12_, DeviceValueType::UINT, nullptr, FL_(data12), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &data1_, DeviceValueType::UINT, nullptr, FL_(data1), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &data0_, DeviceValueType::UINT, nullptr, FL_(data0), DeviceValueUOM::NONE); } if (flags == EMSdevice::EMS_DEVICE_FLAG_ISM) { - register_device_value(TAG_NONE, &collectorShutdown_, DeviceValueType::BOOL, nullptr, FL_(collectorShutdown), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &tankHeated_, DeviceValueType::BOOL, nullptr, FL_(tankHeated), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); + register_device_value(DeviceValueTAG::TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); } + if (flags == EMSdevice::EMS_DEVICE_FLAG_SM100) { - register_device_value(TAG_NONE, &solarPumpModulation_, DeviceValueType::UINT, nullptr, FL_(solarPumpModulation), DeviceValueUOM::PERCENT); - register_device_value(TAG_NONE, &solarPumpMinMod_, DeviceValueType::UINT, nullptr, FL_(pumpMinMod), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_PumpMinMod)); - register_device_value( - TAG_NONE, &solarPumpTurnonDiff_, DeviceValueType::UINT, FL_(div10), FL_(solarPumpTurnonDiff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TurnonDiff)); - register_device_value(TAG_NONE, + register_device_value(DeviceValueTAG::TAG_NONE, &solarPumpMod_, DeviceValueType::UINT, nullptr, FL_(solarPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_NONE, + &solarPumpMinMod_, + DeviceValueType::UINT, + FL_(mul5), + FL_(pumpMinMod), + DeviceValueUOM::PERCENT, + MAKE_CF_CB(set_PumpMinMod)); + register_device_value(DeviceValueTAG::TAG_NONE, + &solarPumpTurnonDiff_, + DeviceValueType::UINT, + FL_(div10), + FL_(solarPumpTurnonDiff), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_TurnonDiff)); + register_device_value(DeviceValueTAG::TAG_NONE, &solarPumpTurnoffDiff_, DeviceValueType::UINT, FL_(div10), FL_(solarPumpTurnoffDiff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TurnoffDiff)); - register_device_value(TAG_NONE, &tankBottomTemp2_, DeviceValueType::SHORT, FL_(div10), FL_(tank2BottomTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_NONE, &heatExchangerTemp_, DeviceValueType::SHORT, FL_(div10), FL_(heatExchangerTemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_NONE, &cylinderPumpModulation_, DeviceValueType::UINT, nullptr, FL_(cylinderPumpModulation), DeviceValueUOM::PERCENT); - register_device_value(TAG_NONE, &valveStatus_, DeviceValueType::BOOL, nullptr, FL_(valveStatus), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &tankHeated_, DeviceValueType::BOOL, nullptr, FL_(tankHeated), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &collectorShutdown_, DeviceValueType::BOOL, nullptr, FL_(collectorShutdown), DeviceValueUOM::NONE); - register_device_value( - TAG_NONE, &collectorMaxTemp_, DeviceValueType::UINT, nullptr, FL_(collectorMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_CollectorMaxTemp)); - register_device_value( - TAG_NONE, &collectorMinTemp_, DeviceValueType::UINT, nullptr, FL_(collectorMinTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_CollectorMinTemp)); - register_device_value(TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); - register_device_value(TAG_NONE, &energyToday_, DeviceValueType::ULONG, nullptr, FL_(energyToday), DeviceValueUOM::WH); - register_device_value(TAG_NONE, &energyTotal_, DeviceValueType::ULONG, FL_(div10), FL_(energyTotal), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_NONE, &collector2Temp_, DeviceValueType::SHORT, FL_(div10), FL_(collector2Temp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &cylMiddleTemp_, DeviceValueType::SHORT, FL_(div10), FL_(cylMiddleTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &retHeatAssist_, DeviceValueType::SHORT, FL_(div10), FL_(retHeatAssist), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &m1Valve_, DeviceValueType::BOOL, nullptr, FL_(m1Valve), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &m1Power_, DeviceValueType::UINT, nullptr, FL_(m1Power), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_NONE, &solarPump2_, DeviceValueType::BOOL, nullptr, FL_(solarPump2), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &solarPump2Mod_, DeviceValueType::UINT, nullptr, FL_(solarPump2Mod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_NONE, &cylBottomTemp2_, DeviceValueType::SHORT, FL_(div10), FL_(cyl2BottomTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &heatExchangerTemp_, DeviceValueType::SHORT, FL_(div10), FL_(heatExchangerTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &cylPumpMod_, DeviceValueType::UINT, nullptr, FL_(cylPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_NONE, &valveStatus_, DeviceValueType::BOOL, nullptr, FL_(valveStatus), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &cylHeated_, DeviceValueType::BOOL, nullptr, FL_(cylHeated), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &collectorShutdown_, DeviceValueType::BOOL, nullptr, FL_(collectorShutdown), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, + &collectorMaxTemp_, + DeviceValueType::UINT, + nullptr, + FL_(collectorMaxTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_CollectorMaxTemp)); + register_device_value(DeviceValueTAG::TAG_NONE, + &collectorMinTemp_, + DeviceValueType::UINT, + nullptr, + FL_(collectorMinTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_CollectorMinTemp)); + register_device_value(DeviceValueTAG::TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); + register_device_value(DeviceValueTAG::TAG_NONE, &energyToday_, DeviceValueType::ULONG, nullptr, FL_(energyToday), DeviceValueUOM::WH); + register_device_value(DeviceValueTAG::TAG_NONE, &energyTotal_, DeviceValueType::ULONG, FL_(div10), FL_(energyTotal), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_NONE, &pump2WorkTime_, DeviceValueType::TIME, nullptr, FL_(pump2WorkTime), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_NONE, &m1WorkTime_, DeviceValueType::TIME, nullptr, FL_(m1WorkTime), DeviceValueUOM::MINUTES); + // register_device_value(DeviceValueTAG::TAG_NONE, &cyl2MaxTemp_, DeviceValueType::UINT, nullptr, FL_(cyl2MaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_cyl2MaxTemp)); + register_device_value(DeviceValueTAG::TAG_NONE, + &heatTransferSystem_, + DeviceValueType::BOOL, + nullptr, + FL_(heatTransferSystem), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_heatTransferSystem)); register_device_value( - TAG_NONE, &heatTransferSystem_, DeviceValueType::BOOL, nullptr, FL_(heatTransferSystem), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatTransferSystem)); - register_device_value(TAG_NONE, &externalTank_, DeviceValueType::BOOL, nullptr, FL_(externalTank), DeviceValueUOM::NONE, MAKE_CF_CB(set_externalTank)); + DeviceValueTAG::TAG_NONE, &externalCyl_, DeviceValueType::BOOL, nullptr, FL_(externalCyl), DeviceValueUOM::NONE, MAKE_CF_CB(set_externalCyl)); + register_device_value(DeviceValueTAG::TAG_NONE, + &thermalDisinfect_, + DeviceValueType::BOOL, + nullptr, + FL_(thermalDisinfect), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_thermalDisinfect)); register_device_value( - TAG_NONE, &thermalDisinfect_, DeviceValueType::BOOL, nullptr, FL_(thermalDisinfect), DeviceValueUOM::NONE, MAKE_CF_CB(set_thermalDisinfect)); - register_device_value(TAG_NONE, &heatMetering_, DeviceValueType::BOOL, nullptr, FL_(heatMetering), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatMetering)); - register_device_value(TAG_NONE, &solarIsEnabled_, DeviceValueType::BOOL, nullptr, FL_(activated), DeviceValueUOM::NONE, MAKE_CF_CB(set_solarEnabled)); + DeviceValueTAG::TAG_NONE, &heatMetering_, DeviceValueType::BOOL, nullptr, FL_(heatMetering), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatMetering)); + register_device_value( + DeviceValueTAG::TAG_NONE, &solarIsEnabled_, DeviceValueType::BOOL, nullptr, FL_(activated), DeviceValueUOM::NONE, MAKE_CF_CB(set_solarEnabled)); // telegram 0x035A - register_device_value( - TAG_NONE, &solarPumpMode_, DeviceValueType::ENUM, FL_(enum_solarmode), FL_(solarPumpMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_solarMode)); - register_device_value(TAG_NONE, - &solarPumpKick_, - DeviceValueType::BOOL, - nullptr, - FL_(solarPumpKick), + register_device_value(DeviceValueTAG::TAG_NONE, + &solarPumpMode_, + DeviceValueType::ENUM, + FL_(enum_solarmode), + FL_(solarPumpMode), DeviceValueUOM::NONE, - MAKE_CF_CB(set_solarPumpKick)); // pump kick for vacuum collector, 00=off - register_device_value(TAG_NONE, - &plainWaterMode_, - DeviceValueType::BOOL, + MAKE_CF_CB(set_solarMode)); + register_device_value( // pump kick for vacuum collector, 00=off + DeviceValueTAG::TAG_NONE, + &solarPumpKick_, + DeviceValueType::BOOL, + nullptr, + FL_(solarPumpKick), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_solarPumpKick)); + register_device_value( // system does not use antifreeze, 00=off + DeviceValueTAG::TAG_NONE, + &plainWaterMode_, + DeviceValueType::BOOL, + nullptr, + FL_(plainWaterMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_plainWaterMode)); + register_device_value( // double Match Flow, 00=off + DeviceValueTAG::TAG_NONE, + &doubleMatchFlow_, + DeviceValueType::BOOL, + nullptr, + FL_(doubleMatchFlow), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_doubleMatchFlow)); + + register_device_value(DeviceValueTAG::TAG_NONE, + &solarPump2MinMod_, + DeviceValueType::UINT, nullptr, - FL_(plainWaterMode), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_plainWaterMode)); // system does not use antifreeze, 00=off - register_device_value(TAG_NONE, - &doubleMatchFlow_, - DeviceValueType::BOOL, - nullptr, - FL_(doubleMatchFlow), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_doubleMatchFlow)); // double Match Flow, 00=off + FL_(pump2MinMod), + DeviceValueUOM::PERCENT, + MAKE_CF_CB(set_Pump2MinMod)); + register_device_value(DeviceValueTAG::TAG_NONE, + &solarPump2TurnonDiff_, + DeviceValueType::UINT, + FL_(div10), + FL_(solarPump2TurnonDiff), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_TurnonDiff2)); + register_device_value(DeviceValueTAG::TAG_NONE, + &solarPump2TurnoffDiff_, + DeviceValueType::UINT, + FL_(div10), + FL_(solarPump2TurnoffDiff), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_TurnoffDiff2)); + register_device_value( // pump kick for vacuum collector, 00=off + DeviceValueTAG::TAG_NONE, + &solarPump2Kick_, + DeviceValueType::BOOL, + nullptr, + FL_(solarPump2Kick), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_solarPump2Kick)); // telegram 0x380 - register_device_value(TAG_NONE, &climateZone_, DeviceValueType::UINT, nullptr, FL_(climateZone), DeviceValueUOM::NONE, MAKE_CF_CB(set_climateZone)); // climate zone identifier - register_device_value(TAG_NONE, + register_device_value(DeviceValueTAG::TAG_NONE, + &climateZone_, + DeviceValueType::UINT, + nullptr, + FL_(climateZone), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_climateZone)); // climate zone identifier + register_device_value(DeviceValueTAG::TAG_NONE, &collector1Area_, DeviceValueType::USHORT, FL_(div10), FL_(collector1Area), - DeviceValueUOM::NONE, + DeviceValueUOM::SQM, MAKE_CF_CB(set_collector1Area)); // Area of collector field 1 - register_device_value(TAG_NONE, + register_device_value(DeviceValueTAG::TAG_NONE, &collector1Type_, DeviceValueType::ENUM, FL_(enum_collectortype), FL_(collector1Type), DeviceValueUOM::NONE, MAKE_CF_CB(set_collector1Type)); // Type of collector field 1, 01=flat, 02=vacuum + register_device_value(DeviceValueTAG::TAG_NONE, + &collector2Area_, + DeviceValueType::USHORT, + FL_(div10), + FL_(collector2Area), + DeviceValueUOM::SQM, + MAKE_CF_CB(set_collector2Area)); // Area of collector field 2 + register_device_value(DeviceValueTAG::TAG_NONE, + &collector2Type_, + DeviceValueType::ENUM, + FL_(enum_collectortype), + FL_(collector2Type), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_collector2Type)); // Type of collector field 2, 01=flat, 02=vacuum + register_device_value(DeviceValueTAG::TAG_NONE, + &cylPriority_, + DeviceValueType::ENUM, + FL_(enum_cylprio), + FL_(cylPriority), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_cylPriority)); + register_device_value(DeviceValueTAG::TAG_NONE, &heatCntFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(heatCntFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &heatCntRetTemp_, DeviceValueType::USHORT, FL_(div10), FL_(heatCntRetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &heatCnt_, DeviceValueType::UINT, nullptr, FL_(heatCnt), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &swapFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(swapFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &swapRetTemp_, DeviceValueType::USHORT, FL_(div10), FL_(swapRetTemp), DeviceValueUOM::DEGREES); } } -// publish HA config -bool Solar::publish_ha_device_config() { - StaticJsonDocument doc; - doc["uniq_id"] = F_(solar); - doc["ic"] = F_(icondevice); - - char stat_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(stat_t, sizeof(stat_t), "%s/%s", Mqtt::base().c_str(), Mqtt::tag_to_topic(device_type(), DeviceValueTAG::TAG_NONE).c_str()); - doc["stat_t"] = stat_t; - - char name_s[40]; - snprintf(name_s, sizeof(name_s), FSTR_(productid_fmt), device_type_name().c_str()); - doc["name"] = name_s; - - doc["val_tpl"] = FJSON("{{value_json.id}}"); - JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = FJSON("EMS-ESP Solar"); - dev["sw"] = EMSESP_APP_VERSION; - dev["mf"] = brand_to_string(); - dev["mdl"] = name(); - JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp-solar"); - - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/solar/config", Mqtt::base().c_str()); - Mqtt::publish_ha(topic, doc.as()); // publish the config payload with retain flag - - return true; -} - // SM10Monitor - type 0x96 // Solar(0x30) -> All(0x00), (0x96), data: FF 18 19 0A 02 5A 27 0A 05 2D 1E 0F 64 28 0A void Solar::process_SM10Config(std::shared_ptr telegram) { - has_update(telegram->read_value(solarIsEnabled_, 0)); // FF on - has_update(telegram->read_value(solarPumpMinMod_, 2)); - has_update(telegram->read_value(solarPumpTurnonDiff_, 7)); - has_update(telegram->read_value(solarPumpTurnoffDiff_, 8)); - has_update(telegram->read_value(tankMaxTemp_, 5)); - has_update(telegram->read_value(wwMinTemp_, 6)); + has_update(telegram, solarIsEnabled_, 0); // FF on + has_update(telegram, setting3_, 3); + has_update(telegram, setting4_, 4); + /* + uint8_t colmax = collectorMaxTemp_ / 10; + telegram->read_value(colmax, 3); + has_update(collectorMaxTemp_, colmax * 10); + uint8_t colmin = collectorMinTemp_ / 10; + telegram->read_value(colmin, 4); + has_update(collectorMinTemp_, colmin * 10); + */ + has_update(telegram, solarPumpMinMod_, 2); + has_update(telegram, solarPumpTurnonDiff_, 7); + has_update(telegram, solarPumpTurnoffDiff_, 8); + has_update(telegram, cylMaxTemp_, 5); + has_update(telegram, wwMinTemp_, 6); } // SM10Monitor - type 0x97 void Solar::process_SM10Monitor(std::shared_ptr telegram) { - uint8_t solarpumpmod = solarPumpModulation_; + uint8_t solarpumpmod = solarPumpMod_; - has_update(telegram->read_bitvalue(collectorShutdown_, 0, 3)); - has_update(telegram->read_bitvalue(tankHeated_, 0, 2)); // tankMaxTemp reached - has_update(telegram->read_value(collectorTemp_, 2)); // collector temp from SM10, is *10 - has_update(telegram->read_value(tankBottomTemp_, 5)); // tank bottom temp from SM10, is *10 - has_update(telegram->read_value(solarPumpModulation_, 4)); // modulation solar pump - has_update(telegram->read_bitvalue(solarPump_, 7, 1)); - has_update(telegram->read_value(pumpWorkTime_, 8, 3)); + has_update(telegram, data0_, 0); + has_update(telegram, data1_, 1); + has_update(telegram, data11_, 11); + has_update(telegram, data12_, 12); + + has_bitupdate(telegram, collectorShutdown_, 0, 3); // collectorMaxTemp reached + has_bitupdate(telegram, cylHeated_, 0, 2); // cylMaxTemp reached + has_update(telegram, collectorTemp_, 2); // collector temp from SM10, is *10 + telegram->read_value(solarpumpmod, 4); // modulation solar pump + has_update(telegram, cylBottomTemp_, 5); // cyl bottom temp from SM10, is *10 + has_bitupdate(telegram, solarPump_, 7, 1); // pump onoff + has_update(telegram, pumpWorkTime_, 8, 3); // mask out pump-boosts - if (solarpumpmod == 0 && solarPumpModulation_ == 100) { - solarPumpModulation_ = solarPumpMinMod_; // set to minimum + if (solarpumpmod == 100 && solarPumpMod_ == 0 && solarPumpMinMod_ > 0) { + solarpumpmod = solarPumpMinMod_; // set to minimum } + has_update(solarPumpMod_, solarpumpmod); if (!Helpers::hasValue(maxFlow_)) { EMSESP::webSettingsService.read([&](WebSettings & settings) { maxFlow_ = settings.solar_maxflow; }); + has_update(&maxFlow_); } // solar publishes every minute, do not count reads by other devices if (telegram->dest == 0) { // water 4.184 J/gK, glycol ~2.6-2.8 J/gK, no aceotrope - // solarPower_ = (collectorTemp_ - tankBottomTemp_) * solarPumpModulation_ * maxFlow_ * 10 / 1434; // water - solarPower_ = (collectorTemp_ - tankBottomTemp_) * solarPumpModulation_ * maxFlow_ * 10 / 1665; //40% glycol@40°C + // solarPower_ = (collectorTemp_ - cylBottomTemp_) * solarPumpModulation_ * maxFlow_ * 10 / 1434; // water + solarPower_ = (collectorTemp_ - cylBottomTemp_) * solarpumpmod * maxFlow_ * 10 / 1665; //40% glycol@40°C if (energy.size() >= 60) { energy.pop_front(); } @@ -255,36 +441,68 @@ void Solar::process_SM10Monitor(std::shared_ptr telegram) { sum += e; } energyLastHour_ = sum / 6; // counts in 0.1 Wh + has_update(&solarPower_); + has_update(&energyLastHour_); } } /* * process_SM100SystemConfig - type 0x0358 EMS+ - for MS/SM100 and MS/SM200 * e.g. B0 0B FF 00 02 58 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 FF 01 00 00 + * SM100SystemConfig(0x358), data: FF 00 FF 00 FF 00 00 00 00 00 00 FF 00 00 FF 00 00 00 00 FF 00 FF 01 01 00 + * SM100SystemConfig(0x358), data: 00 00 00 00 00 00 00 (offset 25) */ void Solar::process_SM100SystemConfig(std::shared_ptr telegram) { - has_update(telegram->read_value(heatTransferSystem_, 5, 1)); - has_update(telegram->read_value(externalTank_, 9, 1)); - has_update(telegram->read_value(thermalDisinfect_, 10, 1)); - has_update(telegram->read_value(heatMetering_, 14, 1)); - has_update(telegram->read_value(solarIsEnabled_, 19, 1)); + has_update(telegram, heatTransferSystem_, 5, 1); + has_update(telegram, externalCyl_, 9, 1); + has_update(telegram, thermalDisinfect_, 10, 1); + has_update(telegram, heatMetering_, 14, 1); + has_update(telegram, solarIsEnabled_, 19, 1); } /* * process_SM100SolarCircuitConfig - type 0x035A EMS+ - for MS/SM100 and MS/SM200 * e.g. B0 0B FF 00 02 5A 64 05 00 58 14 01 01 32 64 00 00 00 5A 0C */ -void Solar::process_SM100SolarCircuitConfig(std::shared_ptr telegram) { - has_update(telegram->read_value(collectorMaxTemp_, 0, 1)); - has_update(telegram->read_value(tankMaxTemp_, 3, 1)); - has_update(telegram->read_value(collectorMinTemp_, 4, 1)); - has_update(telegram->read_value(solarPumpMode_, 5, 1)); - has_update(telegram->read_value(solarPumpMinMod_, 6, 1)); - has_update(telegram->read_value(solarPumpTurnoffDiff_, 7, 1)); - has_update(telegram->read_value(solarPumpTurnonDiff_, 8, 1)); - has_update(telegram->read_value(solarPumpKick_, 9, 1)); - has_update(telegram->read_value(plainWaterMode_, 10, 1)); - has_update(telegram->read_value(doubleMatchFlow_, 11, 1)); +void Solar::process_SM100CircuitConfig(std::shared_ptr telegram) { + has_update(telegram, collectorMaxTemp_, 0); + has_update(telegram, cylMaxTemp_, 3); + has_update(telegram, collectorMinTemp_, 4); + has_update(telegram, solarPumpMode_, 5); + has_update(telegram, solarPumpMinMod_, 6); // is / 5 + has_update(telegram, solarPumpTurnoffDiff_, 7); // is * 10 + has_update(telegram, solarPumpTurnonDiff_, 8); // is * 10 + has_update(telegram, solarPumpKick_, 9); + has_update(telegram, plainWaterMode_, 10); + has_update(telegram, doubleMatchFlow_, 11); +} + +/* + * process_SM100Solar2CircuitConfig - type 0x035D EMS+ - for MS/SM100 and MS/SM200 + */ +void Solar::process_SM100Circuit2Config(std::shared_ptr telegram) { + has_update(telegram, solarPump2Kick_, 0); + //has_update(telegram, solar2PumpTurnoffDiff_, 3); // is * 10 + has_update(telegram, solarPump2TurnonDiff_, 4); // is * 10 + /* + has_update(telegram, collector2MaxTemp_, 0); + has_update(telegram, cylMaxTemp2_, 3); + has_update(telegram, collector2MinTemp_, 4); + has_update(telegram, solar2PumpMode_, 5); + has_update(telegram, solar2PumpMinMod_, 6); + has_update(telegram, plainWaterMode2_, 10); + has_update(telegram, doubleMatchFlow2_, 11); + */ +} + +// type 0x35C Heat assistance +void Solar::process_SM100HeatAssist(std::shared_ptr telegram) { + has_update(telegram, solarHeatAssist_, 0); // is *10 +} + +// type 0x361 differential control +void Solar::process_SM100Differential(std::shared_ptr telegram) { + has_update(telegram, diffControl_, 0); // is *10 } /* process_SM100ParamCfg - type 0xF9 EMS 1.0 @@ -309,12 +527,12 @@ void Solar::process_SM100ParamCfg(std::shared_ptr telegram) { int32_t def = EMS_VALUE_USHORT_NOTSET; int32_t max = EMS_VALUE_USHORT_NOTSET; int32_t cur = EMS_VALUE_USHORT_NOTSET; - has_update(telegram->read_value(t_id, 1)); - has_update(telegram->read_value(of, 3)); - has_update(telegram->read_value(min, 5)); - has_update(telegram->read_value(def, 9)); - has_update(telegram->read_value(max, 13)); - has_update(telegram->read_value(cur, 17)); + telegram->read_value(t_id, 1); + telegram->read_value(of, 3); + telegram->read_value(min, 5); + telegram->read_value(def, 9); + telegram->read_value(max, 13); + telegram->read_value(cur, 17); // LOG_DEBUG(F("SM100ParamCfg param=0x%04X, offset=%d, min=%d, default=%d, max=%d, current=%d"), t_id, of, min, def, max, cur)); } @@ -324,44 +542,89 @@ void Solar::process_SM100ParamCfg(std::shared_ptr telegram) { * e.g. B0 0B FF 00 02 62 00 77 01 D4 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 00 F9 80 00 80 9E - for heat exchanger temp * e.g, 30 00 FF 00 02 62 01 AC * 30 00 FF 18 02 62 80 00 - * 30 00 FF 00 02 62 01 A1 - for tank bottom temps + * 30 00 FF 00 02 62 01 A1 - for cyl bottom temps * bytes 0+1 = TS1 Temperature sensor for collector * bytes 2+3 = TS2 Temperature sensor 1 cylinder, bottom * bytes 16+17 = TS5 Temperature sensor 2 cylinder, bottom, or swimming pool * bytes 20+21 = TS6 Temperature sensor external heat exchanger */ void Solar::process_SM100Monitor(std::shared_ptr telegram) { - has_update(telegram->read_value(collectorTemp_, 0)); // is *10 - TS1: Temperature sensor for collector array 1 - has_update(telegram->read_value(tankBottomTemp_, 2)); // is *10 - TS2: Temperature sensor 1 cylinder, bottom - has_update(telegram->read_value(tankBottomTemp2_, 16)); // is *10 - TS5: Temperature sensor 2 cylinder, bottom, or swimming pool - has_update(telegram->read_value(heatExchangerTemp_, 20)); // is *10 - TS6: Heat exchanger temperature sensor + has_update(telegram, collectorTemp_, 0); // is *10 - TS1: Temperature sensor for collector array 1 + has_update(telegram, cylBottomTemp_, 2); // is *10 - TS2: Temperature sensor 1 cylinder, bottom + has_update(telegram, cylBottomTemp2_, 16); // is *10 - TS5: Temperature sensor 2 cylinder, bottom, or swimming pool + has_update(telegram, heatExchangerTemp_, 20); // is *10 - TS6: Heat exchanger temperature sensor + + has_update(telegram, collector2Temp_, 6); // is *10 - TS7: Temperature sensor for collector array 2 + has_update(telegram, cylMiddleTemp_, 8); // is *10 - TS14: cylinder middle temperature + has_update(telegram, retHeatAssist_, 10); // is *10 - TS15: return temperature heating assistance } // SM100wwTemperature - 0x07D6 // Solar Module(0x2A) -> (0x00), (0x7D6), data: 01 C1 00 00 02 5B 01 AF 01 AD 80 00 01 90 void Solar::process_SM100wwTemperature(std::shared_ptr telegram) { - has_update(telegram->read_value(wwTemp_1_, 0)); - has_update(telegram->read_value(wwTemp_3_, 4)); - has_update(telegram->read_value(wwTemp_4_, 6)); - has_update(telegram->read_value(wwTemp_5_, 8)); - has_update(telegram->read_value(wwTemp_7_, 12)); + has_update(telegram, wwTemp_1_, 0); // is *10 + has_update(telegram, wwTemp_3_, 4); // is *10 + has_update(telegram, wwTemp_4_, 6); // is *10 + has_update(telegram, wwTemp_5_, 8); // is *10 + has_update(telegram, wwTemp_7_, 12); // is *10 } // SM100wwStatus - 0x07AA // Solar Module(0x2A) -> (0x00), (0x7AA), data: 64 00 04 00 03 00 28 01 0F void Solar::process_SM100wwStatus(std::shared_ptr telegram) { - has_update(telegram->read_value(wwPump_, 0)); + has_update(telegram, wwPump_, 0); +} + +// SM100wwParam - 0x07A6, Solar Module(0x2A) -> (0x00) +// data: FF 05 0F 5F 00 01 3C 3C 3C 3C 28 12 46 01 3C 1E 03 07 3C 00 0F 00 05 +void Solar::process_SM100wwParam(std::shared_ptr telegram) { + has_update(telegram, wwMaxTemp_, 8); + has_update(telegram, wwTemp_, 9); + has_update(telegram, wwRedTemp_, 10); + has_update(telegram, wwDailyTemp_, 6); + has_update(telegram, wwDisinfectionTemp_, 12); + // (daily heating time thermostat 2F5, offset 9, offset 8 on/off) +} + +// SM100wwCirc - 0x07A5 +// Solar Module(0x2A) -> (0x00), (0x7A5), data: +void Solar::process_SM100wwCirc(std::shared_ptr telegram) { + has_update(telegram, wwCirc_, 0); + has_update(telegram, wwCircMode_, 3); +} + +// SM100wwKeepWarm - 0x7AE, keepWarm +// Thermostat(0x10) -> Solar(0x2A), ?(0x7AE), data: FF +void Solar::process_SM100wwKeepWarm(std::shared_ptr telegram) { + has_update(telegram, wwKeepWarm_, 0); +} + +/* +// SM100ww? - 0x7E0, some kind of status +// data: 00 00 46 00 00 01 06 0E 06 0E 00 00 00 00 00 03 03 03 03 +// publishes single values offset 1/2(16bit), offset 5, offset 6, offset 7, offset 8, offset 9, +// status2 = 03:"no heat", 06:"heat request", 08:"disinfecting", 09:"hold" +*/ +void Solar::process_SM100wwStatus2(std::shared_ptr telegram) { + has_update(telegram, wwFlow_, 7); + has_update(telegram, wwStatus2_, 8); + has_update(telegram, wwPumpMod_, 9); +} + +// SM100Monitor2 - 0x0363 Heatcounter +// e.g. B0 00 FF 00 02 63 80 00 80 00 00 00 80 00 80 00 80 00 00 80 00 5A +// Solar(0x30) -> All(0x00), SM100Monitor2(0x363), data: 01 E1 01 6B 00 00 01 5D 02 8E 80 00 0F 80 00 +void Solar::process_SM100Monitor2(std::shared_ptr telegram) { + has_update(telegram->read_value(heatCntFlowTemp_, 0)); // is *10 + has_update(telegram->read_value(heatCntRetTemp_, 2)); // is *10 + has_update(telegram->read_value(heatCnt_, 12)); + has_update(telegram->read_value(swapRetTemp_, 6)); // is *10 + has_update(telegram->read_value(swapFlowTemp_, 8)); // is *10 } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" -// SM100Monitor2 - 0x0363 -// e.g. B0 00 FF 00 02 63 80 00 80 00 00 00 80 00 80 00 80 00 00 80 00 5A -void Solar::process_SM100Monitor2(std::shared_ptr telegram) { - // not implemented yet -} - // SM100wwCommand - 0x07AB // Thermostat(0x10) -> Solar Module(0x2A), (0x7AB), data: 01 00 01 void Solar::process_SM100wwCommand(std::shared_ptr telegram) { @@ -373,9 +636,15 @@ void Solar::process_SM100wwCommand(std::shared_ptr telegram) { // SM100Config - 0x0366 // e.g. B0 00 FF 00 02 66 01 62 00 13 40 14 void Solar::process_SM100Config(std::shared_ptr telegram) { - has_update(telegram->read_value(availabilityFlag_, 0)); - has_update(telegram->read_value(configFlag_, 1)); - has_update(telegram->read_value(userFlag_, 2)); + has_update(telegram, availabilityFlag_, 0); + has_update(telegram, configFlag_, 1); + has_update(telegram, userFlag_, 2); +} + +// SM100Config1 - 0x035F +// e.g. Solar(0x30) -> Me(0x0B), ?(0x35F), data: 00 00 41 01 1E 0A 0C 19 00 3C 19 +void Solar::process_SM100Config1(std::shared_ptr telegram) { + has_update(telegram->read_value(cylPriority_, 3)); } /* @@ -383,22 +652,35 @@ void Solar::process_SM100Config(std::shared_ptr telegram) { - PS1: Solar circuit pump for collector array 1 - PS5: Cylinder primary pump when using an external heat exchanger * e.g. 30 00 FF 09 02 64 64 = 100% + * Solar(0x30) -> All(0x00), (0x364), data: 00 64 05 24 00 00 FF 00 00 05 00 14 3C 64 00 00 00 00 */ void Solar::process_SM100Status(std::shared_ptr telegram) { - uint8_t solarpumpmod = solarPumpModulation_; - uint8_t cylinderpumpmod = cylinderPumpModulation_; - has_update(telegram->read_value(cylinderPumpModulation_, 8)); - has_update(telegram->read_value(solarPumpModulation_, 9)); + uint8_t solarpumpmod = solarPumpMod_; + uint8_t cylinderpumpmod = cylPumpMod_; + telegram->read_value(cylinderpumpmod, 8); + telegram->read_value(solarpumpmod, 9); - if (solarpumpmod == 0 && solarPumpModulation_ == 100) { // mask out boosts - solarPumpModulation_ = solarPumpMinMod_; // set to minimum + // mask out boosts + if (solarpumpmod == 100 && solarPumpMod_ == 0 && solarPumpMinMod_ > 0) { + solarpumpmod = solarPumpMinMod_ * 5; } + has_update(solarPumpMod_, solarpumpmod); + if (cylinderpumpmod == 100 && cylPumpMod_ == 0 && solarPumpMinMod_ > 0) { + cylinderpumpmod = solarPumpMinMod_ * 5; + } + has_update(cylPumpMod_, cylinderpumpmod); - if (cylinderpumpmod == 0 && cylinderPumpModulation_ == 100) { // mask out boosts - cylinderPumpModulation_ = solarPumpMinMod_; // set to minimum + has_bitupdate(telegram, cylHeated_, 3, 1); // issue #422 + has_bitupdate(telegram, collectorShutdown_, 3, 0); // collector shutdown + has_update(telegram, m1Power_, 13); + + solarpumpmod = solarPump2Mod_; + telegram->read_value(solarpumpmod, 4); + // mask out boost + if (solarpumpmod == 100 && solarPump2Mod_ == 0 && solarPumpMinMod_ > 0) { + solarpumpmod = solarPumpMinMod_ * 5; // set to minimum } - has_update(telegram->read_bitvalue(tankHeated_, 3, 1)); // issue #422 - has_update(telegram->read_bitvalue(collectorShutdown_, 3, 0)); // collector shutdown + has_update(solarPump2Mod_, solarpumpmod); } /* @@ -408,35 +690,53 @@ void Solar::process_SM100Status(std::shared_ptr telegram) { * byte 10 = PS1 Solar circuit pump for collector array 1: test=b0001(1), on=b0100(4) and off=b0011(3) */ void Solar::process_SM100Status2(std::shared_ptr telegram) { - has_update(telegram->read_bitvalue(valveStatus_, 4, 2)); // on if bit 2 set - has_update(telegram->read_bitvalue(solarPump_, 10, 2)); // on if bit 2 set + has_bitupdate(telegram, valveStatus_, 4, 2); // on if bit 2 set + has_bitupdate(telegram, solarPump_, 10, 2); // on if bit 2 set + has_bitupdate(telegram, solarPump2_, 1, 2); // on if bit 2 set + has_bitupdate(telegram, m1Valve_, 7, 2); // values 8/4 seen } /* * SM100CollectorConfig - type 0x0380 EMS+ - for SM100 and SM200 * e.g. B0 0B FF 00 02 80 50 64 00 00 29 01 00 00 01 + * SM100CollectorConfig(0x380), data: 5A 3B 00 00 41 02 00 2D 02 (with 2 collectors) */ void Solar::process_SM100CollectorConfig(std::shared_ptr telegram) { - has_update(telegram->read_value(climateZone_, 0)); - has_update(telegram->read_value(collector1Area_, 3)); - has_update(telegram->read_enumvalue(collector1Type_, 5, 1)); + has_update(telegram, climateZone_, 0); + has_update(telegram, collector1Area_, 3); + // has_enumupdate(telegram, collector1Type_, 5, 1); + // has_update(telegram, collector2Area_, 6); + // do not show collector 2 if area is zero + telegram->read_value(collector2Area_, 6); + telegram->read_enumvalue(collector2Type_, 8, 1); + if (collector2Area_ == 0) { + collector2Area_ = EMS_VALUE_USHORT_NOTSET; + collector2Type_ = EMS_VALUE_UINT_NOTSET; + } + // has_enumupdate(telegram, collector2Type_, 8, 1); } /* * SM100Energy - type 0x038E EMS+ for energy readings * e.g. 30 00 FF 00 02 8E 00 00 00 00 00 00 06 C5 00 00 76 35 + * SM100Energy(0x38E), data: 00 00 01 79 00 00 22 3D 00 00 09 31 (with 2 collectors) */ void Solar::process_SM100Energy(std::shared_ptr telegram) { - has_update(telegram->read_value(energyLastHour_, 0)); // last hour / 10 in Wh - has_update(telegram->read_value(energyToday_, 4)); // todays in Wh - has_update(telegram->read_value(energyTotal_, 8)); // total / 10 in kWh + has_update(telegram, energyLastHour_, 0); // last hour / 10 in Wh + has_update(telegram, energyToday_, 4); // todays in Wh + has_update(telegram, energyTotal_, 8); // total / 10 in kWh } /* * SM100Time - type 0x0391 EMS+ for pump working time + * SM100Time(0x391), data: 00 00 2A 13 00 00 00 00 00 00 70 13 00 00 00 00 00 00 24 7E 00 00 00 00 00 + * SM100Time(0x391), data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 4A 00 (offset 24) */ void Solar::process_SM100Time(std::shared_ptr telegram) { - has_update(telegram->read_value(pumpWorkTime_, 1, 3)); + has_update(telegram, pumpWorkTime_, 1, 3); + // has_update(telegram, pumpXWorkTime_, 9, 3); + has_update(telegram, pump2WorkTime_, 17, 3); + has_update(telegram, m1WorkTime_, 45, 3); } /* @@ -444,36 +744,40 @@ void Solar::process_SM100Time(std::shared_ptr telegram) { * e.g. B0 00 FF 00 00 03 32 00 00 00 00 13 00 D6 00 00 00 FB D0 F0 */ void Solar::process_ISM1StatusMessage(std::shared_ptr telegram) { - has_update(telegram->read_value(collectorTemp_, 4)); // Collector Temperature - has_update(telegram->read_value(tankBottomTemp_, 6)); // Temperature Bottom of Solar Boiler tank + has_update(telegram, collectorTemp_, 4); // Collector Temperature + has_update(telegram, cylBottomTemp_, 6); // Temperature Bottom of Solar Boiler cyl uint16_t Wh = energyLastHour_ / 10; - has_update(telegram->read_value(Wh, 2)); // Solar Energy produced in last hour only ushort, is not * 10 - energyLastHour_ = Wh * 10; // set to *10 + telegram->read_value(Wh, 2); // Solar Energy produced in last hour only ushort, is not * 10 + if (energyLastHour_ != Wh * 10) { + energyLastHour_ = Wh * 10; + has_update(&energyLastHour_); + } - has_update(telegram->read_bitvalue(solarPump_, 8, 0)); // PS1 Solar pump on (1) or off (0) - has_update(telegram->read_value(pumpWorkTime_, 10, 3)); // force to 3 bytes - has_update(telegram->read_bitvalue(collectorShutdown_, 9, 0)); // collector shutdown on/off - has_update(telegram->read_bitvalue(tankHeated_, 9, 2)); // tank full + has_bitupdate(telegram, solarPump_, 8, 0); // PS1 Solar pump on (1) or off (0) + has_update(telegram, pumpWorkTime_, 10, 3); // force to 3 bytes + has_bitupdate(telegram, collectorShutdown_, 9, 0); // collector shutdown on/off + has_bitupdate(telegram, cylHeated_, 9, 2); // cyl full } /* * Junkers ISM1 Solar Module - type 0x0101 EMS+ for setting values */ void Solar::process_ISM1Set(std::shared_ptr telegram) { - has_update(telegram->read_value(tankMaxTemp_, 6)); + has_update(telegram, cylMaxTemp_, 6); } /* * Settings */ + // collector shutdown temperature bool Solar::set_CollectorMaxTemp(const char * value, const int8_t id) { int temperature; - if (!Helpers::value2number(value, temperature)) { + if (!Helpers::value2temperature(value, temperature)) { return false; } if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) { - write_command(0x96, 3, (uint8_t)temperature / 10, 0x96); + write_command(0x96, 3, (uint8_t)temperature, 0x96); } else { write_command(0x35A, 0, (uint8_t)temperature, 0x35A); } @@ -483,20 +787,21 @@ bool Solar::set_CollectorMaxTemp(const char * value, const int8_t id) { // collector shutdown temperature bool Solar::set_CollectorMinTemp(const char * value, const int8_t id) { int temperature; - if (!Helpers::value2number(value, temperature)) { + if (!Helpers::value2temperature(value, temperature)) { return false; } if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) { - write_command(0x96, 4, (uint8_t)temperature / 10, 0x96); + write_command(0x96, 4, (uint8_t)temperature, 0x96); } else { write_command(0x35A, 4, (uint8_t)temperature, 0x35A); } return true; } -bool Solar::set_TankMaxTemp(const char * value, const int8_t id) { +// cylinder max temperature +bool Solar::set_cylMaxTemp(const char * value, const int8_t id) { int temperature; - if (!Helpers::value2number(value, temperature)) { + if (!Helpers::value2temperature(value, temperature)) { return false; } if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) { @@ -508,27 +813,45 @@ bool Solar::set_TankMaxTemp(const char * value, const int8_t id) { } return true; } + +// solar pump minimum modulation bool Solar::set_PumpMinMod(const char * value, const int8_t id) { int modulation; if (!Helpers::value2number(value, modulation)) { return false; } - write_command(0x96, 2, (uint8_t)modulation, 0x96); + if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) { + write_command(0x96, 2, (uint8_t)modulation, 0x96); + } else { + write_command(0x35A, 6, (uint8_t)(modulation + 2) / 5, 0x35A); + } return true; } +// solar pump 2 minimum modulation +bool Solar::set_Pump2MinMod(const char * value, const int8_t id) { + int modulation; + if (!Helpers::value2number(value, modulation)) { + return false; + } + // write_command(0x35D, x, (uint8_t)(modulation), 0x35D); + return true; +} + +// warm water minimum temperature bool Solar::set_wwMinTemp(const char * value, const int8_t id) { int temperature; - if (!Helpers::value2number(value, temperature)) { + if (!Helpers::value2temperature(value, temperature)) { return false; } write_command(0x96, 6, (uint8_t)temperature, 0x96); return true; } +// turn on difference for solar pump bool Solar::set_TurnoffDiff(const char * value, const int8_t id) { float temperature; - if (!Helpers::value2float(value, temperature)) { + if (!Helpers::value2temperature(value, temperature, true)) { return false; } if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) { @@ -539,9 +862,10 @@ bool Solar::set_TurnoffDiff(const char * value, const int8_t id) { return true; } +// turn off difference for solar pump bool Solar::set_TurnonDiff(const char * value, const int8_t id) { float temperature; - if (!Helpers::value2float(value, temperature)) { + if (!Helpers::value2temperature(value, temperature, true)) { return false; } if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) { @@ -552,6 +876,26 @@ bool Solar::set_TurnonDiff(const char * value, const int8_t id) { return true; } +// turn on difference for solar pump 2 +bool Solar::set_TurnoffDiff2(const char * value, const int8_t id) { + float temperature; + if (!Helpers::value2temperature(value, temperature, true)) { + return false; + } + write_command(0x361, 3, (uint8_t)(temperature * 10), 0x361); + return true; +} + +// turn off difference for solar pump 2 +bool Solar::set_TurnonDiff2(const char * value, const int8_t id) { + float temperature; + if (!Helpers::value2temperature(value, temperature, true)) { + return false; + } + write_command(0x361, 4, (uint8_t)(temperature * 10), 0x361); + return true; +} + // external value to calculate energy bool Solar::set_SM10MaxFlow(const char * value, const int8_t id) { float flow; @@ -568,6 +912,7 @@ bool Solar::set_SM10MaxFlow(const char * value, const int8_t id) { return true; } +// switch heat transfer system on/off bool Solar::set_heatTransferSystem(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { @@ -577,7 +922,8 @@ bool Solar::set_heatTransferSystem(const char * value, const int8_t id) { return true; } -bool Solar::set_externalTank(const char * value, const int8_t id) { +// switch external cylinder on/off +bool Solar::set_externalCyl(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { return false; @@ -586,6 +932,7 @@ bool Solar::set_externalTank(const char * value, const int8_t id) { return true; } +// switch thermal disinfection on/off bool Solar::set_thermalDisinfect(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { @@ -595,6 +942,7 @@ bool Solar::set_thermalDisinfect(const char * value, const int8_t id) { return true; } +// switch heat metering on/off bool Solar::set_heatMetering(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { @@ -604,6 +952,7 @@ bool Solar::set_heatMetering(const char * value, const int8_t id) { return true; } +// switch solar system on/off bool Solar::set_solarEnabled(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { @@ -617,6 +966,7 @@ bool Solar::set_solarEnabled(const char * value, const int8_t id) { return true; } +// pump mode: constant, pwm or analog bool Solar::set_solarMode(const char * value, const int8_t id) { uint8_t num; if (!Helpers::value2enum(value, num, FL_(enum_solarmode))) { @@ -626,6 +976,18 @@ bool Solar::set_solarMode(const char * value, const int8_t id) { return true; } +/*/ pump mode: constant, pwm or analog +bool Solar::set_solarMode2(const char * value, const int8_t id) { + uint8_t num; + if (!Helpers::value2enum(value, num, FL_(enum_solarmode))) { + return false; + } + write_command(0x35D, x, num, 0x35D); + return true; +} +*/ + +// switch pumpkick on/off bool Solar::set_solarPumpKick(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { @@ -635,6 +997,17 @@ bool Solar::set_solarPumpKick(const char * value, const int8_t id) { return true; } +// switch pump2kick on/off +bool Solar::set_solarPump2Kick(const char * value, const int8_t id) { + bool v = false; + if (!Helpers::value2bool(value, v)) { + return false; + } + write_command(0x35D, 0, v ? 0x01 : 0x00, 0x35D); + return true; +} + +// switch plain water mode on/off bool Solar::set_plainWaterMode(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { @@ -644,6 +1017,7 @@ bool Solar::set_plainWaterMode(const char * value, const int8_t id) { return true; } +// switch double match flow on/off bool Solar::set_doubleMatchFlow(const char * value, const int8_t id) { bool v = false; if (!Helpers::value2bool(value, v)) { @@ -653,6 +1027,7 @@ bool Solar::set_doubleMatchFlow(const char * value, const int8_t id) { return true; } +// set climate zone number bool Solar::set_climateZone(const char * value, const int8_t id) { int v = 0; if (!Helpers::value2number(value, v)) { @@ -662,6 +1037,7 @@ bool Solar::set_climateZone(const char * value, const int8_t id) { return true; } +// collector area in squaremeters bool Solar::set_collector1Area(const char * value, const int8_t id) { float v = 0; if (!Helpers::value2float(value, v)) { @@ -671,6 +1047,17 @@ bool Solar::set_collector1Area(const char * value, const int8_t id) { return true; } +// collector area in squaremeters +bool Solar::set_collector2Area(const char * value, const int8_t id) { + float v = 0; + if (!Helpers::value2float(value, v)) { + return false; + } + write_command(0x380, 6, (uint16_t)(v * 10), 0x380); + return true; +} + +// collector type flat/vacuum bool Solar::set_collector1Type(const char * value, const int8_t id) { uint8_t num; if (!Helpers::value2enum(value, num, FL_(enum_collectortype))) { @@ -680,4 +1067,114 @@ bool Solar::set_collector1Type(const char * value, const int8_t id) { return true; } +// collector type flat/vacuum +bool Solar::set_collector2Type(const char * value, const int8_t id) { + uint8_t num; + if (!Helpers::value2enum(value, num, FL_(enum_collectortype))) { + return false; + } + write_command(0x380, 8, num + 1, 0x380); + return true; +} + +// priority of cylinders if there are 2 +bool Solar::set_cylPriority(const char * value, const int8_t id) { + uint8_t n; + if (!Helpers::value2enum(value, n, FL_(enum_cylprio))) { + return false; + } + write_command(0x35F, 3, n, 0x35F); + return true; +} + +bool Solar::set_heatAssist(const char * value, const int8_t id) { + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x35C, 0, (uint8_t)(v * 10), 0x35C); + return true; +} + +bool Solar::set_diffControl(const char * value, const int8_t id) { + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x361, 4, (uint8_t)(v * 10), 0x361); + return true; +} + +bool Solar::set_wwTemp(const char * value, const int8_t id) { + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x7A6, 9, (uint8_t)v, 0x7A6); + return true; +} + +bool Solar::set_wwMaxTemp(const char * value, const int8_t id) { + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x7A6, 8, (uint8_t)v, 0x7A6); + return true; +} + +bool Solar::set_wwRedTemp(const char * value, const int8_t id) { + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x7A6, 10, (uint8_t)v, 0x7A6); + return true; +} + +bool Solar::set_wwDailyTemp(const char * value, const int8_t id) { + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x7A6, 6, (uint8_t)v, 0x7A6); + return true; +} + +bool Solar::set_wwDisinfectionTemp(const char * value, const int8_t id) { + float v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0x7A6, 12, (uint8_t)v, 0x7A6); + return true; +} + +bool Solar::set_wwCirc(const char * value, const int8_t id) { + bool v = false; + if (!Helpers::value2bool(value, v)) { + return false; + } + write_command(0x7A5, 0, v ? 0xFF : 0x00, 0x7A5); + return true; +} + +bool Solar::set_wwCircMode(const char * value, const int8_t id) { + uint8_t n; + if (!Helpers::value2enum(value, n, FL_(enum_wwCircMode))) { + return false; + } + write_command(0x7A5, 3, n, 0x7A5); + return true; +} + +bool Solar::set_wwKeepWarm(const char * value, const int8_t id) { + bool v = false; + if (!Helpers::value2bool(value, v)) { + return false; + } + write_command(0x7AE, 0, v ? 0xFF : 0x00, 0x7AE); + return true; +} + } // namespace emsesp diff --git a/src/devices/solar.h b/src/devices/solar.h index e0a44c7de..54920ac84 100644 --- a/src/devices/solar.h +++ b/src/devices/solar.h @@ -25,26 +25,42 @@ namespace emsesp { class Solar : public EMSdevice { public: - Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); + Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); private: static uuid::log::Logger logger_; - int16_t collectorTemp_; // TS1: Temperature sensor for collector array 1 - int16_t tankBottomTemp_; // TS2: Temperature sensor 1 cylinder, bottom tank (solar thermal system) - int16_t tankBottomTemp2_; // TS5: Temperature sensor 2 cylinder, bottom tank, or swimming pool (solar thermal system) - int16_t heatExchangerTemp_; // TS6: Heat exchanger temperature sensor - uint8_t solarPumpModulation_; // PS1: modulation solar pump - uint8_t cylinderPumpModulation_; // PS5: modulation cylinder pump - uint8_t solarPump_; // PS1: solar pump active - uint8_t valveStatus_; // VS2: status 3-way valve for cylinder 2 (solar thermal system) with valve + int16_t collectorTemp_; // TS1: Temperature sensor for collector array 1 + int16_t cylBottomTemp_; // TS2: Temperature sensor 1 cylinder, bottom cyl (solar thermal system) + int16_t cylBottomTemp2_; // TS5: Temperature sensor 2 cylinder, bottom cyl, or swimming pool (solar thermal system) + int16_t heatExchangerTemp_; // TS6: Heat exchanger temperature sensor + int16_t collector2Temp_; // TS7: Temperature sensor for collector array 2 + int16_t cylMiddleTemp_; // TS14: Cylinder middle temp + int16_t retHeatAssist_; // TS15: return temperature heating assistance + uint8_t solarPumpMod_; // PS1: modulation solar pump + uint8_t cylPumpMod_; // PS5: modulation cylinder pump + uint8_t solarPump_; // PS1: solar pump active + uint8_t valveStatus_; // VS2: status 3-way valve for cylinder 2 (solar thermal system) with valve + uint8_t solarPump2_; // PS4: solar pump 2 active + uint8_t solarPump2Mod_; // PS4: modulation solar pump + uint8_t m1Valve_; // M1: heat assistance valve + uint8_t m1Power_; // M1: heat assistance valve + + // 0x363 heat counter + uint16_t heatCntFlowTemp_; + uint16_t heatCntRetTemp_; + uint8_t heatCnt_; + uint16_t swapFlowTemp_; + uint16_t swapRetTemp_; + + // 0x38E uint32_t energyLastHour_; uint32_t energyToday_; uint32_t energyTotal_; - uint32_t pumpWorkTime_; // Total solar pump operating time - uint8_t tankHeated_; + uint32_t pumpWorkTime_; // Total solar pump operating time + uint32_t pump2WorkTime_; // Total solar pump 2 operating time + uint32_t m1WorkTime_; // differential control work time + uint8_t cylHeated_; uint8_t collectorShutdown_; // Collector shutdown on/off uint8_t availabilityFlag_; @@ -53,57 +69,104 @@ class Solar : public EMSdevice { // telegram 0x0358 uint8_t heatTransferSystem_; // Umladesystem, 00=no - uint8_t externalTank_; // Heat exchanger, 00=no + uint8_t externalCyl_; // Heat exchanger, 00=no uint8_t thermalDisinfect_; // Daily heatup for disinfection, 00=no - uint8_t heatMetering_; // Wärmemengenzählung, 00=no + uint8_t heatMetering_; // Heat quantity metering, 00=no uint8_t solarIsEnabled_; // System enable, 00=no // telegram 0x035A - uint8_t collectorMaxTemp_; // maximum allowed collectorTemp array 1 - uint8_t tankMaxTemp_; // Current value for max tank temp + uint8_t collectorMaxTemp_; // maximum allowed collectorTemp array 1 + uint8_t cylMaxTemp_; // Current value for max cyl temp + // uint8_t cyl2MaxTemp_; // Current value for max cyl temp uint8_t collectorMinTemp_; // minimum allowed collectorTemp array 1 uint8_t solarPumpMode_; // 00=off, 01=PWM, 02=10V - uint8_t solarPumpMinMod_; // minimum modulation setting, *5 % - uint8_t solarPumpTurnoffDiff_; // solar pump turnoff collector/tank diff - uint8_t solarPumpTurnonDiff_; // solar pump turnon collector/tank diff + uint8_t solarPumpMinMod_; // minimum modulation setting + uint8_t solarPumpTurnoffDiff_; // solar pump turnoff collector/cyl diff + uint8_t solarPumpTurnonDiff_; // solar pump turnon collector/cyl diff uint8_t solarPumpKick_; // pump kick for vacuum collector, 00=off uint8_t plainWaterMode_; // system does not use antifreeze, 00=off uint8_t doubleMatchFlow_; // double Match Flow, 00=off + // telegram 0x035D + uint8_t collector2MaxTemp_; // maximum allowed collectorTemp array 1 + uint8_t collector2MinTemp_; // minimum allowed collectorTemp array 1 + uint8_t solarPump2MinMod_; // minimum modulation setting + uint8_t solarPump2TurnoffDiff_; // solar pump turnoff collector/cyl diff + uint8_t solarPump2TurnonDiff_; // solar pump turnon collector/cyl diff + uint8_t solarPump2Kick_; // pump kick for vacuum collector, 00=off + uint8_t solarPump2Mode_; // 00=off, 01=PWM, 02=10V + + // telegram 0x35C Heat assistance + uint8_t solarHeatAssist_; // is *10 + + // telegram 0x035F + uint8_t cylPriority_; // 0 or 1 + + // telegram 0x361 Differential control + uint8_t diffControl_; // is *10 + + // telegram 0x380 uint8_t climateZone_; // climate zone identifier uint16_t collector1Area_; // Area of collector field 1 uint8_t collector1Type_; // Type of collector field 1, 01=flat, 02=vacuum + uint16_t collector2Area_; // Area of collector field 2 + uint8_t collector2Type_; // Type of collector field 2, 01=flat, 02=vacuum // SM100wwTemperature - 0x07D6 - uint8_t wwTemp_1_; - uint8_t wwTemp_3_; - uint8_t wwTemp_4_; - uint8_t wwTemp_5_; - uint8_t wwTemp_7_; + uint16_t wwTemp_1_; + uint16_t wwTemp_3_; + uint16_t wwTemp_4_; + uint16_t wwTemp_5_; + uint16_t wwTemp_7_; // SM100wwStatus - 0x07AA uint8_t wwPump_; + // SM100wwParam - 0x07A6 + uint8_t wwMaxTemp_; + uint8_t wwTemp_; + uint8_t wwRedTemp_; + uint8_t wwDailyTemp_; + uint8_t wwDisinfectionTemp_; + + // SM100wwKeepWarm - 0x07AE + uint8_t wwKeepWarm_; + + // SM100wwCirc - 0x07A5 + uint8_t wwCirc_; + uint8_t wwCircMode_; + + // SM100wwStatus2 - 0x07E0 + uint8_t wwFlow_; + uint8_t wwPumpMod_; + uint8_t wwStatus2_; + // SM10Config - 0x96 - uint8_t wwMinTemp_; - uint8_t maxFlow_; // set this to calculate power - uint32_t solarPower_; // calculated from maxFlow + uint8_t wwMinTemp_; + uint8_t maxFlow_; // set this to calculate power + int16_t solarPower_; // calculated from maxFlow - std::deque energy; + uint8_t data0_; + uint8_t data1_; + uint8_t data11_; + uint8_t data12_; + uint8_t setting3_; + uint8_t setting4_; - char type_[20]; // Solar of WWC - uint8_t id_; + std::deque energy; void process_SM10Monitor(std::shared_ptr telegram); void process_SM10Config(std::shared_ptr telegram); void process_SM100SystemConfig(std::shared_ptr telegram); - void process_SM100SolarCircuitConfig(std::shared_ptr telegram); + void process_SM100CircuitConfig(std::shared_ptr telegram); + void process_SM100Circuit2Config(std::shared_ptr telegram); void process_SM100ParamCfg(std::shared_ptr telegram); void process_SM100Monitor(std::shared_ptr telegram); void process_SM100Monitor2(std::shared_ptr telegram); void process_SM100Config(std::shared_ptr telegram); + void process_SM100Config1(std::shared_ptr telegram); void process_SM100Status(std::shared_ptr telegram); void process_SM100Status2(std::shared_ptr telegram); @@ -111,9 +174,16 @@ class Solar : public EMSdevice { void process_SM100Energy(std::shared_ptr telegram); void process_SM100Time(std::shared_ptr telegram); + void process_SM100HeatAssist(std::shared_ptr telegram); + void process_SM100Differential(std::shared_ptr telegram); + void process_SM100wwTemperature(std::shared_ptr telegram); void process_SM100wwStatus(std::shared_ptr telegram); + void process_SM100wwStatus2(std::shared_ptr telegram); void process_SM100wwCommand(std::shared_ptr telegram); + void process_SM100wwCirc(std::shared_ptr telegram); + void process_SM100wwParam(std::shared_ptr telegram); + void process_SM100wwKeepWarm(std::shared_ptr telegram); void process_ISM1StatusMessage(std::shared_ptr telegram); void process_ISM1Set(std::shared_ptr telegram); @@ -121,26 +191,47 @@ class Solar : public EMSdevice { bool set_CollectorMaxTemp(const char * value, const int8_t id); bool set_CollectorMinTemp(const char * value, const int8_t id); - bool set_TankMaxTemp(const char * value, const int8_t id); + bool set_cylMaxTemp(const char * value, const int8_t id); bool set_PumpMinMod(const char * value, const int8_t id); bool set_wwMinTemp(const char * value, const int8_t id); bool set_TurnonDiff(const char * value, const int8_t id); bool set_TurnoffDiff(const char * value, const int8_t id); + bool set_Collector2MaxTemp(const char * value, const int8_t id); + bool set_Collector2MinTemp(const char * value, const int8_t id); + bool set_Pump2MinMod(const char * value, const int8_t id); + bool set_TurnonDiff2(const char * value, const int8_t id); + bool set_TurnoffDiff2(const char * value, const int8_t id); + bool set_SM10MaxFlow(const char * value, const int8_t id); // SM100 bool set_heatTransferSystem(const char * value, const int8_t id); - bool set_externalTank(const char * value, const int8_t id); + bool set_externalCyl(const char * value, const int8_t id); bool set_thermalDisinfect(const char * value, const int8_t id); bool set_heatMetering(const char * value, const int8_t id); bool set_solarEnabled(const char * value, const int8_t id); bool set_solarMode(const char * value, const int8_t id); bool set_solarPumpKick(const char * value, const int8_t id); + bool set_solarPump2Kick(const char * value, const int8_t id); bool set_plainWaterMode(const char * value, const int8_t id); bool set_doubleMatchFlow(const char * value, const int8_t id); bool set_climateZone(const char * value, const int8_t id); bool set_collector1Area(const char * value, const int8_t id); bool set_collector1Type(const char * value, const int8_t id); + bool set_collector2Area(const char * value, const int8_t id); + bool set_collector2Type(const char * value, const int8_t id); + bool set_cylPriority(const char * value, const int8_t id); + bool set_heatAssist(const char * value, const int8_t id); + bool set_diffControl(const char * value, const int8_t id); + + bool set_wwTemp(const char * value, const int8_t id); + bool set_wwMaxTemp(const char * value, const int8_t id); + bool set_wwRedTemp(const char * value, const int8_t id); + bool set_wwCirc(const char * value, const int8_t id); + bool set_wwCircMode(const char * value, const int8_t id); + bool set_wwKeepWarm(const char * value, const int8_t id); + bool set_wwDisinfectionTemp(const char * value, const int8_t id); + bool set_wwDailyTemp(const char * value, const int8_t id); }; } // namespace emsesp diff --git a/src/devices/switch.cpp b/src/devices/switch.cpp index f424d7654..0b1f14fce 100644 --- a/src/devices/switch.cpp +++ b/src/devices/switch.cpp @@ -22,76 +22,35 @@ namespace emsesp { REGISTER_FACTORY(Switch, EMSdevice::DeviceType::SWITCH); -uuid::log::Logger Switch::logger_ { - F_(switch), uuid::log::Facility::CONSOLE -}; - -Switch::Switch(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Switch::Switch(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { register_telegram_type(0x9C, F("WM10MonitorMessage"), false, MAKE_PF_CB(process_WM10MonitorMessage)); register_telegram_type(0x9D, F("WM10SetMessage"), false, MAKE_PF_CB(process_WM10SetMessage)); register_telegram_type(0x1E, F("WM10TempMessage"), false, MAKE_PF_CB(process_WM10TempMessage)); - register_device_value(TAG_NONE, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &activated_, DeviceValueType::BOOL, nullptr, FL_(activated), DeviceValueUOM::NONE); - register_device_value(TAG_NONE, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); - register_device_value(TAG_NONE, &status_, DeviceValueType::INT, nullptr, FL_(status), DeviceValueUOM::NONE); - id_ = product_id; -} - -// publish HA config -bool Switch::publish_ha_device_config() { - // if we don't have valid values don't add it ever again - if (!Helpers::hasValue(flowTempHc_)) { - return false; - } - - StaticJsonDocument doc; - doc["uniq_id"] = F_(switch); - doc["ic"] = F_(icondevice); - - char stat_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(stat_t, sizeof(stat_t), "%s/%s", Mqtt::base().c_str(), Mqtt::tag_to_topic(device_type(), DeviceValueTAG::TAG_NONE).c_str()); - doc["stat_t"] = stat_t; - - char name_s[40]; - snprintf(name_s, sizeof(name_s), FSTR_(productid_fmt), device_type_name().c_str()); - doc["name"] = name_s; - - doc["val_tpl"] = FJSON("{{value_json.id}}"); - JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = FJSON("EMS-ESP Switch"); - dev["sw"] = EMSESP_APP_VERSION; - dev["mf"] = brand_to_string(); - dev["mdl"] = this->name(); - JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp-switch"); - - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/switch/config", Mqtt::base().c_str()); - Mqtt::publish_ha(topic, doc.as()); // publish the config payload with retain flag - - return true; + register_device_value(DeviceValueTAG::TAG_NONE, &activated_, DeviceValueType::BOOL, nullptr, FL_(activated), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_NONE, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &status_, DeviceValueType::INT, nullptr, FL_(status), DeviceValueUOM::NONE); } // message 0x9D switch on/off // Thermostat(0x10) -> Switch(0x11), ?(0x9D), data: 00 void Switch::process_WM10SetMessage(std::shared_ptr telegram) { - has_update(telegram->read_value(activated_, 0)); + has_update(telegram, activated_, 0); } // message 0x9C holds flowtemp and unknown status value // Switch(0x11) -> All(0x00), ?(0x9C), data: 01 BA 00 01 00 void Switch::process_WM10MonitorMessage(std::shared_ptr telegram) { - has_update(telegram->read_value(flowTempHc_, 0)); // is * 10 - has_update(telegram->read_value(status_, 2)); - // has_update(telegram->read_value(status2_, 3)); // unknown + has_update(telegram, flowTempHc_, 0); // is * 10 + has_update(telegram, status_, 2); + // has_update(telegram, status2_, 3)); // unknown } // message 0x1E flow temperature, same as in 9C, published often, republished also by boiler UBAFast 0x18 // Switch(0x11) -> Boiler(0x08), ?(0x1E), data: 01 BA void Switch::process_WM10TempMessage(std::shared_ptr telegram) { - has_update(telegram->read_value(flowTempHc_, 0)); // is * 10 + has_update(telegram, flowTempHc_, 0); // is * 10 } -} // namespace emsesp \ No newline at end of file +} // namespace emsesp diff --git a/src/devices/switch.h b/src/devices/switch.h index 3b1c9e560..6b42976e2 100644 --- a/src/devices/switch.h +++ b/src/devices/switch.h @@ -25,13 +25,9 @@ namespace emsesp { class Switch : public EMSdevice { public: - Switch(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); - - virtual bool publish_ha_device_config(); + Switch(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); private: - static uuid::log::Logger logger_; - void process_WM10SetMessage(std::shared_ptr telegram); void process_WM10MonitorMessage(std::shared_ptr telegram); void process_WM10TempMessage(std::shared_ptr telegram); @@ -39,7 +35,6 @@ class Switch : public EMSdevice { uint16_t flowTempHc_; uint8_t status_; uint8_t activated_; - uint8_t id_; }; } // namespace emsesp diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index f2e900c15..dde726906 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -24,7 +24,7 @@ REGISTER_FACTORY(Thermostat, EMSdevice::DeviceType::THERMOSTAT); uuid::log::Logger Thermostat::logger_{F_(thermostat), uuid::log::Facility::CONSOLE}; -Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) +Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { uint8_t actual_master_thermostat = EMSESP::actual_master_thermostat(); // what we're actually using uint8_t master_thermostat = EMSESP_DEFAULT_MASTER_THERMOSTAT; @@ -34,15 +34,15 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i uint8_t model = this->model(); - // if we're on auto mode, register this thermostat if it has a device id of 0x10, 0x17 or 0x18->0x1A + // if we're on auto mode, register this thermostat if it has a device id of 0x10, 0x17 or 0x18 // or if its the master thermostat we defined // see https://github.com/emsesp/EMS-ESP/issues/362#issuecomment-629628161 if ((master_thermostat == device_id) - || ((master_thermostat == EMSESP_DEFAULT_MASTER_THERMOSTAT) && (device_id <= 0x1A) // https://github.com/emsesp/EMS-ESP32/issues/200 + || ((master_thermostat == EMSESP_DEFAULT_MASTER_THERMOSTAT) && (device_id < 0x19) && ((actual_master_thermostat == EMSESP_DEFAULT_MASTER_THERMOSTAT) || (device_id < actual_master_thermostat)))) { EMSESP::actual_master_thermostat(device_id); actual_master_thermostat = device_id; - reserve_telgram_functions(25); // reserve some space for the telegram registries, to avoid memory fragmentation + // reserve_telegram_functions(20); // reserve some space for the telegram registries, to avoid memory fragmentation // common telegram handlers register_telegram_type(EMS_TYPE_RCOutdoorTemp, F("RCOutdoorTemp"), false, MAKE_PF_CB(process_RCOutdoorTemp)); @@ -64,13 +64,17 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i monitor_typeids = {0x3E, 0x48, 0x52, 0x5C}; set_typeids = {0x3D, 0x47, 0x51, 0x5B}; timer_typeids = {0x3F, 0x49, 0x53, 0x5D}; + timer2_typeids = {0x42, 0x4C, 0x56, 0x60}; for (uint8_t i = 0; i < monitor_typeids.size(); i++) { register_telegram_type(monitor_typeids[i], F("RC35Monitor"), false, MAKE_PF_CB(process_RC35Monitor)); register_telegram_type(set_typeids[i], F("RC35Set"), false, MAKE_PF_CB(process_RC35Set)); register_telegram_type(timer_typeids[i], F("RC35Timer"), false, MAKE_PF_CB(process_RC35Timer)); + register_telegram_type(timer2_typeids[i], F("RC35Timer2"), false, MAKE_PF_CB(process_RC35Timer)); } register_telegram_type(EMS_TYPE_IBASettings, F("IBASettings"), true, MAKE_PF_CB(process_IBASettings)); register_telegram_type(EMS_TYPE_wwSettings, F("WWSettings"), true, MAKE_PF_CB(process_RC35wwSettings)); + register_telegram_type(0x38, F("WWTimer"), true, MAKE_PF_CB(process_RC35wwTimer)); + register_telegram_type(0x39, F("WWCircTimer"), true, MAKE_PF_CB(process_RC35wwTimer)); // RC20 } else if (model == EMSdevice::EMS_DEVICE_FLAG_RC20) { @@ -81,11 +85,11 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i register_telegram_type(monitor_typeids[i], F("RC20Monitor"), false, MAKE_PF_CB(process_RC20Monitor)); register_telegram_type(set_typeids[i], F("RC20Set"), false, MAKE_PF_CB(process_RC20Set)); } - } else { - register_telegram_type(0xAF, F("RC20Remote"), false, MAKE_PF_CB(process_RC20Remote)); } + // remote thermostat uses only 0xAF, register it also for master (in case of early detect) + register_telegram_type(0xAF, F("RC20Remote"), false, MAKE_PF_CB(process_RC20Remote)); // RC20 newer - } else if (model == EMSdevice::EMS_DEVICE_FLAG_RC20_N) { + } else if ((model == EMSdevice::EMS_DEVICE_FLAG_RC20_N) || (model == EMSdevice::EMS_DEVICE_FLAG_RC25)) { monitor_typeids = {0xAE}; set_typeids = {0xAD}; if (actual_master_thermostat == device_id) { @@ -93,9 +97,8 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i register_telegram_type(monitor_typeids[i], F("RC20Monitor"), false, MAKE_PF_CB(process_RC20Monitor_2)); register_telegram_type(set_typeids[i], F("RC20Set"), false, MAKE_PF_CB(process_RC20Set_2)); } - } else { - register_telegram_type(0xAF, F("RC20Remote"), false, MAKE_PF_CB(process_RC20Remote)); } + register_telegram_type(0xAF, F("RC20Remote"), false, MAKE_PF_CB(process_RC20Remote)); // RC30 } else if (model == EMSdevice::EMS_DEVICE_FLAG_RC30) { monitor_typeids = {0x41}; @@ -111,6 +114,7 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i set_typeids = {}; register_telegram_type(monitor_typeids[0], F("EasyMonitor"), true, MAKE_PF_CB(process_EasyMonitor)); + // CRF } else if (model == EMSdevice::EMS_DEVICE_FLAG_CRF) { monitor_typeids = {0x02A5, 0x02A6, 0x02A7, 0x02A8}; set_typeids = {}; @@ -120,11 +124,11 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i // RC300/RC100 } else if ((model == EMSdevice::EMS_DEVICE_FLAG_RC300) || (model == EMSdevice::EMS_DEVICE_FLAG_RC100)) { - monitor_typeids = {0x02A5, 0x02A6, 0x02A7, 0x02A8}; - set_typeids = {0x02B9, 0x02BA, 0x02BB, 0x02BC}; - summer_typeids = {0x02AF, 0x02B0, 0x02B1, 0x02B2}; - curve_typeids = {0x029B, 0x029C, 0x029D, 0x029E}; - summer2_typeids = {0x0471, 0x0472, 0x0473, 0x0474}; + monitor_typeids = {0x02A5, 0x02A6, 0x02A7, 0x02A8, 0x02A9, 0x02AA, 0x02AB, 0x02AC}; + set_typeids = {0x02B9, 0x02BA, 0x02BB, 0x02BC, 0x02BD, 0x02BE, 0x02BF, 0x02C0}; + summer_typeids = {0x02AF, 0x02B0, 0x02B1, 0x02B2, 0x02B3, 0x02B4, 0x02B5, 0x02B6}; + curve_typeids = {0x029B, 0x029C, 0x029D, 0x029E, 0x029F, 0x02A0, 0x02A1, 0x02A2}; + summer2_typeids = {0x0471, 0x0472, 0x0473, 0x0474, 0x0475, 0x0476, 0x0477, 0x0478}; for (uint8_t i = 0; i < monitor_typeids.size(); i++) { register_telegram_type(monitor_typeids[i], F("RC300Monitor"), false, MAKE_PF_CB(process_RC300Monitor)); register_telegram_type(set_typeids[i], F("RC300Set"), false, MAKE_PF_CB(process_RC300Set)); @@ -142,23 +146,26 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i // JUNKERS/HT3 } else if (model == EMSdevice::EMS_DEVICE_FLAG_JUNKERS) { - monitor_typeids = {0x016F, 0x0170, 0x0171, 0x0172}; - for (uint8_t i = 0; i < monitor_typeids.size(); i++) { - register_telegram_type(monitor_typeids[i], F("JunkersMonitor"), false, MAKE_PF_CB(process_JunkersMonitor)); - } + if (actual_master_thermostat == device_id) { + monitor_typeids = {0x016F, 0x0170, 0x0171, 0x0172}; + for (uint8_t i = 0; i < monitor_typeids.size(); i++) { + register_telegram_type(monitor_typeids[i], F("JunkersMonitor"), false, MAKE_PF_CB(process_JunkersMonitor)); + } - if (has_flags(EMS_DEVICE_FLAG_JUNKERS_OLD)) { - // FR120, FR100 - set_typeids = {0x0179, 0x017A, 0x017B, 0x017C}; - for (uint8_t i = 0; i < monitor_typeids.size(); i++) { - register_telegram_type(set_typeids[i], F("JunkersSet"), false, MAKE_PF_CB(process_JunkersSet2)); - } - } else { - set_typeids = {0x0165, 0x0166, 0x0167, 0x0168}; - for (uint8_t i = 0; i < monitor_typeids.size(); i++) { - register_telegram_type(set_typeids[i], F("JunkersSet"), false, MAKE_PF_CB(process_JunkersSet)); + if (has_flags(EMS_DEVICE_FLAG_JUNKERS_OLD)) { + // FR120, FR100 + set_typeids = {0x0179, 0x017A, 0x017B, 0x017C}; + for (uint8_t i = 0; i < monitor_typeids.size(); i++) { + register_telegram_type(set_typeids[i], F("JunkersSet"), false, MAKE_PF_CB(process_JunkersSet2)); + } + } else { + set_typeids = {0x0165, 0x0166, 0x0167, 0x0168}; + for (uint8_t i = 0; i < monitor_typeids.size(); i++) { + register_telegram_type(set_typeids[i], F("JunkersSet"), false, MAKE_PF_CB(process_JunkersSet)); + } } } + register_telegram_type(0x123, F("JunkersRemote"), false, MAKE_PF_CB(process_JunkersRemoteMonitor)); } if (actual_master_thermostat != device_id) { @@ -178,10 +185,6 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i for (uint8_t i = 0; i < monitor_typeids.size(); i++) { EMSESP::send_read_request(monitor_typeids[i], device_id); } - - // HA will report an error in the climate component if it doesn't have the setpoint temp, current temperatures and the mode (e.g. auto) - // The mode always comes later (1 minute) so we force a read request to suppress HA errors. - // https://github.com/emsesp/EMS-ESP/commit/9d5bd11d268a61bbba8dcabacdb96db48b8829ac#commitcomment-48028642 for (uint8_t i = 0; i < set_typeids.size(); i++) { EMSESP::send_read_request(set_typeids[i], device_id); } @@ -191,36 +194,6 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i EMSESP::send_read_request(0xA2, device_id); // read errorCode (only published on errors) } -// publish HA config -bool Thermostat::publish_ha_device_config() { - StaticJsonDocument doc; - doc["uniq_id"] = F_(thermostat); - doc["ic"] = F_(icondevice); - - char stat_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(stat_t, sizeof(stat_t), "%s/%s", Mqtt::base().c_str(), Mqtt::tag_to_topic(device_type(), DeviceValueTAG::TAG_NONE).c_str()); - doc["stat_t"] = stat_t; - - char name_s[40]; - snprintf(name_s, sizeof(name_s), FSTR_(productid_fmt), device_type_name().c_str()); - doc["name"] = name_s; - - doc["val_tpl"] = FJSON("{{value_json.id}}"); - JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = FJSON("EMS-ESP Thermostat"); - dev["sw"] = EMSESP_APP_VERSION; - dev["mf"] = brand_to_string(); - dev["mdl"] = name(); - JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp-thermostat"); - - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/thermostat/config", Mqtt::base().c_str()); - Mqtt::publish_ha(topic, doc.as()); // publish the config payload with retain flag - - return true; -} - // returns the heating circuit object based on the hc number // of nullptr if it doesn't exist yet std::shared_ptr Thermostat::heating_circuit(const uint8_t hc_num) { @@ -245,13 +218,8 @@ std::shared_ptr Thermostat::heating_circuit(const ui // determine which heating circuit the type ID is referring too // returns pointer to the HeatingCircuit or nullptr if it can't be found -// if its a new one, the object will be created and also the fetch flags set +// if its a new one, the heating circuit object will be created and also the fetch flags set std::shared_ptr Thermostat::heating_circuit(std::shared_ptr telegram) { - // only do this for the current master thermostat - if (device_id() != EMSESP::actual_master_thermostat()) { - return nullptr; - } - // look through the Monitor and Set arrays to see if there is a match uint8_t hc_num = 0; bool toggle_ = false; @@ -314,6 +282,16 @@ std::shared_ptr Thermostat::heating_circuit(std::sha } } + // not found, search timer message types + if (hc_num == 0) { + for (uint8_t i = 0; i < timer2_typeids.size(); i++) { + if (timer2_typeids[i] == telegram->type_id) { + hc_num = i + 1; + break; + } + } + } + // not found, search device-id types for remote thermostats if (telegram->src >= 0x18 && telegram->src <= 0x1B) { hc_num = telegram->src - 0x17; @@ -325,13 +303,14 @@ std::shared_ptr Thermostat::heating_circuit(std::sha return nullptr; } - // if we have the heating circuit already present, returns its object + // if we have the heating circuit already present, returns its object reference // otherwise create a new object and add it for (const auto & heating_circuit : heating_circuits_) { if (heating_circuit->hc_num() == hc_num) { return heating_circuit; } } + // register new heatingcircuits only on active monitor telegrams if (!toggle_) { return nullptr; @@ -344,27 +323,28 @@ std::shared_ptr Thermostat::heating_circuit(std::sha // if it's the first set the status flag if (heating_circuits_.size() == 0) { strlcpy(status_, "online", sizeof(status_)); - id_ = this->product_id(); } - // create a new heating circuit object + // create a new heating circuit object and add to the list auto new_hc = std::make_shared(hc_num, model()); heating_circuits_.push_back(new_hc); + new_hc->ha_climate_created(false); // set flag saying we're ready to create the MQTT Discovery Climate topic for this hc + // sort based on hc number so there's a nice order when displaying - std::sort(heating_circuits_.begin(), heating_circuits_.end()); + // TODO temporarily commented out the HC sorting until I'm 100% sure the return object still references the newly created object + // not sure if new_hc and heating_circuits_.back() will still reference the new HC after its sorted - to check! + // std::sort(heating_circuits_.begin(), heating_circuits_.end()); // register the device values register_device_values_hc(new_hc); - // now create the HA topics to send to MQTT for each sensor - if (Mqtt::ha_enabled()) { - publish_ha_config_hc(new_hc); + // don't fetch telegrams if not the master + if (device_id() != EMSESP::actual_master_thermostat()) { + return new_hc; } // set the flag saying we want its data during the next auto fetch - toggle_fetch(monitor_typeids[hc_num - 1], toggle_); - if (set_typeids.size()) { toggle_fetch(set_typeids[hc_num - 1], toggle_); } @@ -377,88 +357,96 @@ std::shared_ptr Thermostat::heating_circuit(std::sha if (timer_typeids.size()) { toggle_fetch(timer_typeids[hc_num - 1], toggle_); } + if (timer2_typeids.size()) { + toggle_fetch(timer2_typeids[hc_num - 1], toggle_); + } - return heating_circuits_.back(); // even after sorting, this should still point back to the newly created HC + return new_hc; // return back point to new HC object } -// publish config topic for HA MQTT Discovery for each of the heating circuit +// publish config topic for HA MQTT Discovery for a heating circuit // e.g. homeassistant/climate/ems-esp/thermostat_hc1/config void Thermostat::publish_ha_config_hc(std::shared_ptr hc) { uint8_t hc_num = hc->hc_num(); StaticJsonDocument doc; - char str1[20]; - snprintf(str1, sizeof(str1), "Thermostat hc%d", hc_num); - - char str2[20]; - snprintf(str2, sizeof(str2), "thermostat_hc%d", hc_num); - - char str3[25]; - snprintf(str3, sizeof(str3), "~/%s", str2); - doc["mode_cmd_t"] = str3; - doc["temp_cmd_t"] = str3; - doc["name"] = str1; - doc["uniq_id"] = str2; - doc["mode_cmd_t"] = str3; - doc["temp_cmd_t"] = str3; - doc["~"] = Mqtt::base(); // ems-esp - char topic_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; + char hc_mode_s[30]; + char seltemp_s[30]; + char currtemp_s[30]; + char mode_str_tpl[400]; + char name_s[30]; + char uniq_id_s[30]; + char temp_cmd_s[30]; + char mode_cmd_s[30]; + if (Mqtt::nested_format() == 1) { + // nested format + snprintf(hc_mode_s, sizeof(hc_mode_s), "value_json.hc%d.mode", hc_num); + snprintf(seltemp_s, sizeof(seltemp_s), "{{value_json.hc%d.seltemp}}", hc_num); + snprintf(currtemp_s, sizeof(currtemp_s), "{{value_json.hc%d.currtemp}}", hc_num); snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(EMSdevice::DeviceType::THERMOSTAT, DeviceValueTAG::TAG_NONE).c_str()); - - char mode_str_tpl[40]; - snprintf(mode_str_tpl, sizeof(mode_str_tpl), "{{value_json.hc%d.hamode}}", hc_num); - doc["mode_stat_tpl"] = mode_str_tpl; - - char seltemp_str[30]; - snprintf(seltemp_str, sizeof(seltemp_str), "{{value_json.hc%d.seltemp}}", hc_num); - doc["temp_stat_tpl"] = seltemp_str; - - char currtemp_str[30]; - snprintf(currtemp_str, sizeof(currtemp_str), "{{value_json.hc%d.hatemp}}", hc_num); - doc["curr_temp_tpl"] = currtemp_str; - - } else { + // single format + snprintf(hc_mode_s, sizeof(hc_mode_s), "value_json.mode"); + snprintf(seltemp_s, sizeof(seltemp_s), "{{value_json.seltemp}}"); + snprintf(currtemp_s, sizeof(currtemp_s), "{{value_json.currtemp}}"); snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(EMSdevice::DeviceType::THERMOSTAT, DeviceValueTAG::TAG_HC1 + hc_num - 1).c_str()); - - doc["mode_stat_tpl"] = FJSON("{{value_json.hamode}}"); - doc["temp_stat_tpl"] = FJSON("{{value_json.seltemp}}"); - doc["curr_temp_tpl"] = FJSON("{{value_json.hatemp}}"); } - doc["mode_stat_t"] = topic_t; - doc["temp_stat_t"] = topic_t; - doc["curr_temp_t"] = topic_t; - doc["min_temp"] = FJSON("5"); - doc["max_temp"] = FJSON("30"); - doc["temp_step"] = FJSON("0.5"); + snprintf(mode_str_tpl, + sizeof(mode_str_tpl), + "{%%if %s=='manual'%%}heat{%%elif %s=='day'%%}heat{%%elif %s=='night'%%}off{%%elif %s=='off'%%}off{%%else%%}auto{%%endif%%}", + hc_mode_s, + hc_mode_s, + hc_mode_s, + hc_mode_s); + + snprintf(name_s, sizeof(name_s), "Thermostat hc%d", hc_num); + snprintf(uniq_id_s, sizeof(uniq_id_s), "thermostat_hc%d", hc_num); + snprintf(temp_cmd_s, sizeof(temp_cmd_s), "~/thermostat/hc%d/seltemp", hc_num); + snprintf(mode_cmd_s, sizeof(temp_cmd_s), "~/thermostat/hc%d/mode", hc_num); + + doc["~"] = Mqtt::base(); + doc["name"] = name_s; + doc["uniq_id"] = uniq_id_s; + doc["mode_stat_t"] = topic_t; + doc["mode_stat_tpl"] = mode_str_tpl; + doc["temp_cmd_t"] = temp_cmd_s; + doc["temp_stat_t"] = topic_t; + doc["temp_stat_tpl"] = seltemp_s; + doc["mode_cmd_t"] = mode_cmd_s; + doc["curr_temp_t"] = topic_t; + doc["curr_temp_tpl"] = currtemp_s; + doc["min_temp"] = "5"; + doc["max_temp"] = "30"; + doc["temp_step"] = "0.5"; // the HA climate component only responds to auto, heat and off JsonArray modes = doc.createNestedArray("modes"); - if (hc->get_model() != EMSdevice::EMS_DEVICE_FLAG_RC10) { + + if (model() != EMSdevice::EMS_DEVICE_FLAG_RC10) { modes.add("auto"); } + modes.add("heat"); modes.add("off"); JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = FJSON("EMS-ESP Thermostat"); - dev["sw"] = EMSESP_APP_VERSION; - dev["mf"] = brand_to_string(); - dev["mdl"] = name(); - JsonArray ids = dev.createNestedArray("ids"); + JsonArray ids = dev.createNestedArray("ids"); ids.add("ems-esp-thermostat"); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; snprintf(topic, sizeof(topic), "climate/%s/thermostat_hc%d/config", Mqtt::base().c_str(), hc_num); + Mqtt::publish_ha(topic, doc.as()); // publish the config payload with retain flag + /* // enable the a special "thermostat_hc" topic to take both mode strings and floats for each of the heating circuits std::string topic2(Mqtt::MQTT_TOPIC_MAX_SIZE, '\0'); snprintf(&topic2[0], topic2.capacity() + 1, "thermostat_hc%d", hc_num); Mqtt::subscribe(EMSdevice::DeviceType::THERMOSTAT, topic2, [=](const char * m) { return thermostat_ha_cmd(m, hc_num); }); + */ } // for HA specifically when receiving over MQTT in the thermostat topic @@ -652,38 +640,50 @@ std::string Thermostat::mode_tostring(uint8_t mode) { } // type 0xB1 - data from the RC10 thermostat (0x17) -// set day (curr temp: 16deg, set temp 19deg) // Data: 04 23 00 BA 00 00 00 BA void Thermostat::process_RC10Monitor(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); if (hc == nullptr) { return; } - uint8_t mode = 1 << hc->mode; - has_update(telegram->read_value(mode, 0)); // 1: off, 2: night, 4: day - hc->mode = mode >> 1; // for enum 0, 1, 2 - has_update(telegram->read_value(hc->setpoint_roomTemp, 1, 1)); // is * 2, force as single byte - has_update(telegram->read_value(hc->curr_roomTemp, 2)); // is * 10 - has_update(telegram->read_value(hc->reduceminutes, 5)); - hc->hamode = hc->mode == 2 ? 1 : 0; // set special HA mode + telegram->read_value(mode, 0); // 1: nofrost, 2: night, 4: day + has_update(hc->mode, mode >> 1); // store as enum 0, 1, 2 + has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte + has_update(telegram, hc->roomTemp, 2); // is * 10 + has_update(telegram, hc->reduceminutes, 5); + + add_ha_climate(hc); +} + +// add the HVAC/Climate HA component for the HC +void Thermostat::add_ha_climate(std::shared_ptr hc) { + if (!Mqtt::ha_enabled() || (hc->ha_climate_created())) { + return; + } + + // only if it has a valid seltemp and currtemp + // mode always defaults to auto + if (Helpers::hasValue(hc->roomTemp) && Helpers::hasValue(hc->selTemp)) { + publish_ha_config_hc(hc); + hc->ha_climate_created(true); // only create it once + } } // type 0xB0 - for reading the mode from the RC10 thermostat (0x17) -// night (temp: 16deg, night temp 14deg, set return day 8h) // Data: 00 FF 00 1C 20 08 01 void Thermostat::process_RC10Set(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); if (hc == nullptr) { return; } - has_update(telegram->read_value(ibaClockOffset_, 0)); - has_update(telegram->read_value(backlight_, 1)); - has_update(telegram->read_value(wwMode_, 2)); - has_update(telegram->read_value(hc->nighttemp, 3)); - has_update(telegram->read_value(hc->daytemp, 4)); - has_update(telegram->read_value(hc->reducehours, 5)); - has_update(telegram->read_value(heatingpid_, 6)); + has_update(telegram, ibaClockOffset_, 0); + has_update(telegram, backlight_, 1); + has_update(telegram, wwMode_, 2); + has_update(telegram, hc->nighttemp, 3); + has_update(telegram, hc->daytemp, 4); + has_update(telegram, hc->reducehours, 5); + has_update(telegram, heatingpid_, 6); } #pragma GCC diagnostic push @@ -692,13 +692,13 @@ void Thermostat::process_RC10Set(std::shared_ptr telegram) { // type 0xB2, mode setting Data: 04 00 // not used, we read mode from monitor 0xB1 void Thermostat::process_RC10Set_2(std::shared_ptr telegram) { - // std::shared_ptr hc = heating_circuit(telegram); - // if (hc == nullptr) { - // return; - // } + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } // uint8_t mode = 1 << hc->mode; - // has_update(telegram->read_value(mode, 0)); // 1: off, 2: night, 4: day - // hc->mode = mode >> 1; // for enum 0, 1, 2 + // telegram->read_value(mode, 0); // 1: nofrost, 2: night, 4: day + // has_update(hc->mode, mode >> 1); // store as enum 0, 1, 2 } #pragma GCC diagnostic pop @@ -709,8 +709,7 @@ void Thermostat::process_RC20Set(std::shared_ptr telegram) { if (hc == nullptr) { return; } - has_update(telegram->read_value(hc->mode, 23)); - hc->hamode = hc->mode; // set special HA mode + has_update(telegram, hc->mode, 23); } // type 0xAE - data from the RC20 thermostat (0x17) - not for RC20's @@ -721,34 +720,39 @@ void Thermostat::process_RC20Monitor_2(std::shared_ptr telegram) if (hc == nullptr) { return; } - // has_update(telegram->read_bitvalue(hc->modetype, 0, 7)); // day/night-mode MSB 7th bit is day // modes byte 0,1: day: 8002, night: 0000, auto-day:0402, auto-night:0400 - has_update(telegram->read_bitvalue(hc->modetype, 1, 1)); // day/night - has_update(telegram->read_value(hc->setpoint_roomTemp, 2, 1)); // is * 2, force as single byte - has_update(telegram->read_value(hc->curr_roomTemp, 3)); // is * 10 - // RC25 extension: - has_update(telegram->read_bitvalue(hc->summermode, 1, 0)); + has_bitupdate(telegram, hc->modetype, 1, 1); // day/night + has_update(telegram, hc->selTemp, 2, 1); // is * 2, force as single byte + has_update(telegram, hc->roomTemp, 3); // is * 10 + has_bitupdate(telegram, hc->summermode, 1, 0); + + add_ha_climate(hc); } // 0xAD - for reading the mode from the RC20/ES72 thermostat (0x17) // see https://github.com/emsesp/EMS-ESP/issues/334#issuecomment-611698259 // offset: 01-nighttemp, 02-daytemp, 03-mode, 0B-program(1-9), 0D-setpoint_roomtemp(temporary) +// 17 00 AD 00 01 27 29 01 4B 05 01 FF 28 19 0A 02 00 00 // RC25(0x17) -> All(0x00), ?(0xAD), data: 01 27 2D 00 44 05 01 FF 28 19 0A 07 00 00 F6 12 5A 11 00 28 05 05 00 void Thermostat::process_RC20Set_2(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); if (hc == nullptr) { return; } - has_update(telegram->read_value(hc->nighttemp, 1)); // is * 2, - has_update(telegram->read_value(hc->daytemp, 2)); // is * 2, - has_update(telegram->read_value(hc->mode, 3)); - hc->hamode = hc->mode; // set special HA mode - has_update(telegram->read_enumvalue(hc->program, 11, 1)); // 1 .. 9 predefined programs + has_update(telegram, hc->heatingtype, 0); + has_update(telegram, hc->nighttemp, 1); // is * 2, + has_update(telegram, hc->daytemp, 2); // is * 2, + has_update(telegram, hc->mode, 3); + has_enumupdate(telegram, hc->program, 11, 1); // 1 .. 9 predefined programs + has_update(telegram, hc->tempautotemp, 13); + // RC25 extension: - has_update(telegram->read_value(ibaMinExtTemperature_, 14)); - has_update(telegram->read_value(hc->minflowtemp, 15)); - has_update(telegram->read_value(hc->maxflowtemp, 16)); - has_update(telegram->read_value(hc->summertemp, 17)); + has_update(telegram, ibaMinExtTemperature_, 14); + has_update(telegram, hc->minflowtemp, 15); + has_update(telegram, hc->maxflowtemp, 16); + has_update(telegram, hc->summertemp, 17); + + add_ha_climate(hc); } // 0xAF - for reading the roomtemperature from the RC20/ES72 thermostat (0x18, 0x19, ..) @@ -757,10 +761,10 @@ void Thermostat::process_RC20Remote(std::shared_ptr telegram) { if (hc == nullptr) { return; } - has_update(telegram->read_value(hc->curr_roomTemp, 0)); + has_update(telegram, hc->roomTemp, 0); + add_ha_climate(hc); } - // type 0x0165, ff void Thermostat::process_JunkersSet(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); @@ -768,13 +772,14 @@ void Thermostat::process_JunkersSet(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->daytemp, 17)); // is * 2 - has_update(telegram->read_value(hc->nighttemp, 16)); // is * 2 - has_update(telegram->read_value(hc->nofrosttemp, 15)); // is * 2 - has_update(telegram->read_value(hc->control, 1)); // remote: 0-off, 1-FB10, 2-FB100 - has_update(telegram->read_enumvalue(hc->program, 13, 1)); // 1-6: 1 = A, 2 = B,... - has_update(telegram->read_enumvalue(hc->mode, 14, 1)); // 0 = nofrost, 1 = eco, 2 = heat, 3 = auto - hc->hamode = hc->mode ? hc->mode - 1 : 0; // set special HA mode: off, on, auto + has_update(telegram, hc->daytemp, 17); // is * 2 + has_update(telegram, hc->nighttemp, 16); // is * 2 + has_update(telegram, hc->nofrosttemp, 15); // is * 2 + has_update(telegram, hc->control, 1); // remote: 0-off, 1-FB10, 2-FB100 + has_enumupdate(telegram, hc->program, 13, 1); // 1-6: 1 = A, 2 = B,... + has_enumupdate(telegram, hc->mode, 14, 1); // 0 = nofrost, 1 = eco, 2 = heat, 3 = auto + + add_ha_climate(hc); } // type 0x0179, ff @@ -784,19 +789,30 @@ void Thermostat::process_JunkersSet2(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->daytemp, 7)); // is * 2 - has_update(telegram->read_value(hc->nighttemp, 6)); // is * 2 - has_update(telegram->read_value(hc->nofrosttemp, 5)); // is * 2 - has_update(telegram->read_enumvalue(hc->program, 10, 1)); // 1-6: 1 = A, 2 = B,... - has_update(telegram->read_enumvalue(hc->mode, 4, 1)); // 0 = nofrost, 1 = eco, 2 = heat, 3 = auto - hc->hamode = hc->mode ? hc->mode - 1 : 0; // set special HA mode: off, on, auto + has_update(telegram, hc->daytemp, 7); // is * 2 + has_update(telegram, hc->nighttemp, 6); // is * 2 + has_update(telegram, hc->nofrosttemp, 5); // is * 2 + has_enumupdate(telegram, hc->program, 10, 1); // 1-6: 1 = A, 2 = B,... + has_enumupdate(telegram, hc->mode, 4, 1); // 0 = nofrost, 1 = eco, 2 = heat, 3 = auto + + add_ha_climate(hc); +} + +// type 0x123 - FR10/FR110 Junkers as remote +void Thermostat::process_JunkersRemoteMonitor(std::shared_ptr telegram) { + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } + has_update(telegram, hc->roomTemp, 0); // roomTemp from remote + add_ha_climate(hc); } // type 0xA3 - for external temp settings from the the RC* thermostats (e.g. RC35) void Thermostat::process_RCOutdoorTemp(std::shared_ptr telegram) { - has_update(telegram->read_value(dampedoutdoortemp_, 0)); - has_update(telegram->read_value(tempsensor1_, 3)); // sensor 1 - is * 10 - has_update(telegram->read_value(tempsensor2_, 5)); // sensor 2 - is * 10 + has_update(telegram, dampedoutdoortemp_, 0); + has_update(telegram, tempsensor1_, 3); // sensor 1 - is * 10 + has_update(telegram, tempsensor2_, 5); // sensor 2 - is * 10 } // 0x91 - data from the RC20 thermostat (0x17) - 15 bytes long @@ -806,8 +822,9 @@ void Thermostat::process_RC20Monitor(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->setpoint_roomTemp, 1, 1)); // is * 2, force as single byte - has_update(telegram->read_value(hc->curr_roomTemp, 2)); // is * 10 + has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte + has_update(telegram, hc->roomTemp, 2); // is * 10 + add_ha_climate(hc); } // type 0x0A - data from the Nefit Easy/TC100 thermostat (0x18) - 31 bytes long @@ -817,10 +834,9 @@ void Thermostat::process_EasyMonitor(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->curr_roomTemp, 8)); // is * 100 - has_update(telegram->read_value(hc->setpoint_roomTemp, 10)); // is * 100 - - hc->hamode = 1; // fixed to heat + has_update(telegram, hc->roomTemp, 8); // is * 100 + has_update(telegram, hc->selTemp, 10); // is * 100 + add_ha_climate(hc); } // Settings Parameters - 0xA5 - RC30_1 @@ -828,26 +844,56 @@ void Thermostat::process_IBASettings(std::shared_ptr telegram) { // 22 - display line on RC35 // display on Thermostat: 0 int. temp, 1 int. setpoint, 2 ext. temp., 3 burner temp., 4 ww temp, 5 functioning mode, 6 time, 7 data, 8 smoke temp - has_update(telegram->read_value(ibaMainDisplay_, 0)); - has_update(telegram->read_value(ibaLanguage_, 1)); // language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian - has_update(telegram->read_value(ibaCalIntTemperature_, 2)); // offset int. temperature sensor, by * 0.1 Kelvin - has_update(telegram->read_value(ibaBuildingType_, 6)); // building type: 0 = light, 1 = medium, 2 = heavy - has_update(telegram->read_value(ibaMinExtTemperature_, 5)); // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 - has_update(telegram->read_value(ibaClockOffset_, 12)); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s - has_update(telegram->read_value(ibaDamping_, 21)); // damping 0-off, 0xff-on + has_update(telegram, ibaMainDisplay_, 0); + has_update(telegram, ibaLanguage_, 1); // language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian + has_update(telegram, ibaCalIntTemperature_, 2); // offset int. temperature sensor, by * 0.1 Kelvin + has_update(telegram, ibaBuildingType_, 6); // building type: 0 = light, 1 = medium, 2 = heavy + has_update(telegram, ibaMinExtTemperature_, 5); // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 + has_update(telegram, ibaClockOffset_, 12); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s + has_update(telegram, ibaDamping_, 21); // damping 0-off, 0xff-on } // Settings WW 0x37 - RC35 void Thermostat::process_RC35wwSettings(std::shared_ptr telegram) { - has_update(telegram->read_value(wwProgMode_, 0)); // 0-like hc, 0xFF own prog - has_update(telegram->read_value(wwCircProg_, 1)); // 0-like hc, 0xFF own prog - has_update(telegram->read_value(wwMode_, 2)); // 0 off, 1-on, 2-auto - has_update(telegram->read_value(wwCircMode_, 3)); // 0 off, 1-on, 2-auto - has_update(telegram->read_value(wwDisinfect_, 4)); // 0-off, 0xFF on - has_update(telegram->read_value(wwDisinfectDay_, 5)); // 0-6 Day of week, 7 every day - has_update(telegram->read_value(wwDisinfectHour_, 6)); - has_update(telegram->read_value(wwMaxTemp_, 8)); // Limiter 60 degrees - has_update(telegram->read_value(wwOneTimeKey_, 9)); // 0-off, 0xFF on + has_update(telegram, wwProgMode_, 0); // 0-like hc, 0xFF own prog + has_update(telegram, wwCircProg_, 1); // 0-like hc, 0xFF own prog + has_update(telegram, wwMode_, 2); // 0-off, 1-on, 2-auto + has_update(telegram, wwCircMode_, 3); // 0-off, 1-on, 2-auto + has_update(telegram, wwDisinfecting_, 4); // 0-off, 0xFF on + has_update(telegram, wwDisinfectDay_, 5); // 0-6 Day of week, 7 every day + has_update(telegram, wwDisinfectHour_, 6); + has_update(telegram, wwMaxTemp_, 8); // Limiter 60 degrees + has_update(telegram, wwOneTimeKey_, 9); // 0-off, 0xFF on +} + +// type 0x38 (ww) and 0x39 (circ) +void Thermostat::process_RC35wwTimer(std::shared_ptr telegram) { + if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1)) + || (!telegram->offset && telegram->type_id == 0x38 && !strlen(wwSwitchTime_) && telegram->message_length > 1) + || (!telegram->offset && telegram->type_id == 0x39 && !strlen(wwCircSwitchTime_) && telegram->message_length > 1)) { + uint8_t no = telegram->offset / 2; + uint8_t day = telegram->message_data[0] >> 5; + uint8_t on = telegram->message_data[0] & 1; + uint8_t time = telegram->message_data[1]; + + std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + char data[sizeof(wwSwitchTime_)]; + if (day == 7) { + snprintf(data, sizeof(data), "%02d not_set", no); + } else { + snprintf(data, sizeof(data), "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); + } + if (telegram->type_id == 0x38) { + strlcpy(wwSwitchTime_, data, sizeof(wwSwitchTime_)); + has_update(wwSwitchTime_); + } else { + strlcpy(wwCircSwitchTime_, data, sizeof(wwCircSwitchTime_)); + has_update(wwCircSwitchTime_); + } + if (is_fetch(telegram->type_id)) { + toggle_fetch(telegram->type_id, false); // dont fetch again + } + } } // type 0x6F - FR10/FR50/FR100/FR110/FR120 Junkers @@ -862,14 +908,16 @@ void Thermostat::process_JunkersMonitor(std::shared_ptr telegram return; } - has_update(telegram->read_value(hc->setpoint_roomTemp, 2)); // value is * 10 - has_update(telegram->read_enumvalue(hc->modetype, 0, 1)); // 1 = nofrost, 2 = eco, 3 = heat + has_enumupdate(telegram, hc->modetype, 0, 1); // 1 = nofrost, 2 = eco, 3 = heat + has_update(telegram, hc->selTemp, 2); // value is * 10 if ((hc->control == 1) || (hc->control == 2)) { - has_update(telegram->read_value(hc->curr_roomTemp, 6)); // roomTemp from remote + has_update(telegram, hc->roomTemp, 6); // roomTemp from remote } else { - has_update(telegram->read_value(hc->curr_roomTemp, 4)); // value is * 10 + has_update(telegram, hc->roomTemp, 4); // value is * 10 } + + add_ha_climate(hc); } // type 0x02A5 - data from Worchester CRF200 @@ -878,12 +926,14 @@ void Thermostat::process_CRFMonitor(std::shared_ptr telegram) { if (hc == nullptr) { return; } - has_update(telegram->read_value(hc->curr_roomTemp, 0)); // is * 10 - has_update(telegram->read_bitvalue(hc->modetype, 2, 0)); - has_update(telegram->read_bitvalue(hc->mode, 2, 4)); // bit 4, mode (auto=0 or off=1) - hc->hamode = 2 - 2 * hc->mode; // set special HA mode - has_update(telegram->read_value(hc->setpoint_roomTemp, 6, 1)); // is * 2, force as single byte - has_update(telegram->read_value(hc->targetflowtemp, 4)); + + has_update(telegram, hc->roomTemp, 0); // is * 10 + has_bitupdate(telegram, hc->modetype, 2, 0); // bit 0, modetype (off=0 , on=1) + has_bitupdate(telegram, hc->mode, 2, 4); // bit 4, mode (auto=0, off=1) + has_update(telegram, hc->selTemp, 6, 1); // is * 2, force as single byte + has_update(telegram, hc->targetflowtemp, 4); + + add_ha_climate(hc); } // type 0x02A5 - data from the Nefit RC1010/3000 thermostat (0x18) and RC300/310s on 0x10 @@ -893,10 +943,9 @@ void Thermostat::process_RC300Monitor(std::shared_ptr telegram) return; } - has_update(telegram->read_value(hc->curr_roomTemp, 0)); // is * 10 - has_update(telegram->read_bitvalue(hc->modetype, 10, 1)); - has_update(telegram->read_bitvalue(hc->mode, 10, 0)); // bit 1, mode (auto=1 or manual=0) - hc->hamode = hc->mode + 1; // set special HA mode + has_update(telegram, hc->roomTemp, 0); // is * 10 + has_bitupdate(telegram, hc->modetype, 10, 1); + has_bitupdate(telegram, hc->mode, 10, 0); // bit 1, mode (auto=1 or manual=0) // if manual, take the current setpoint temp at pos 6 // if auto, take the next setpoint temp at pos 7 @@ -905,10 +954,12 @@ void Thermostat::process_RC300Monitor(std::shared_ptr telegram) // pos 3 actual setpoint (optimized), i.e. changes with temporary change, summer/holiday-modes // pos 6 actual setpoint according to programmed changes eco/comfort // pos 7 next setpoint in the future, time to next setpoint in pos 8/9 - has_update(telegram->read_value(hc->setpoint_roomTemp, 3, 1)); // is * 2, force as single byte - has_update(telegram->read_bitvalue(hc->summermode, 2, 4)); - has_update(telegram->read_value(hc->targetflowtemp, 4)); - has_update(telegram->read_value(hc->curroominfl, 27)); + has_update(telegram, hc->selTemp, 3, 1); // is * 2, force as single byte + has_bitupdate(telegram, hc->summermode, 2, 4); + has_update(telegram, hc->targetflowtemp, 4); + has_update(telegram, hc->curroominfl, 27); + + add_ha_climate(hc); } // type 0x02B9 EMS+ for reading from RC300/RC310 thermostat @@ -923,17 +974,23 @@ void Thermostat::process_RC300Set(std::shared_ptr telegram) { // comfort is position 2, there are 3 levels in pos 3, 2, 1 // eco is position 4 // auto is position 8, temporary until next switch - // actual setpoint taken from RC300Monitor (Michael 12.06.2020) - // has_update(telegram->read_value(hc->setpoint_roomTemp, 8, 1); // single byte conversion, value is * 2 - auto? - // has_update(telegram->read_value(hc->setpoint_roomTemp, 10, 1); // single byte conversion, value is * 2 - manual + // actual setpoint taken from RC300Monitor (MichaelDvP 12.06.2020) + // has_update(telegram, hc->selTemp, 8, 1); // single byte conversion, value is * 2 - auto? + // has_update(telegram, hc->selTemp, 10, 1); // single byte conversion, value is * 2 - manual // check why mode is both in the Monitor and Set for the RC300. It'll be read twice! - // has_update(telegram->read_value(hc->mode, 0); // Auto = xFF, Manual = x00 eg. 10 00 FF 08 01 B9 FF - has_update(telegram->read_value(hc->daytemp, 2)); // is * 2 - has_update(telegram->read_value(hc->nighttemp, 4)); // is * 2 - has_update(telegram->read_value(hc->tempautotemp, 8)); - has_update(telegram->read_value(hc->manualtemp, 10)); // is * 2 - has_update(telegram->read_enumvalue(hc->program, 11, 1)); // timer program 1 or 2 + // has_update(telegram, hc->mode, 0); // Auto = xFF, Manual = x00 eg. 10 00 FF 08 01 B9 FF + has_update(telegram, hc->daytemp, 2); // is * 2 + has_update(telegram, hc->nighttemp, 4); // is * 2 + has_update(telegram, hc->tempautotemp, 8); + // uint8_t tat = hc->tempautotemp; + // telegram->read_value(tat, 8); + // if (tat == 0xFF) { + // tat = 0; + // } + // has_update(hc->tempautotemp, tat); + has_update(telegram, hc->manualtemp, 10); // is * 2 + has_enumupdate(telegram, hc->program, 11, 1); // timer program 1 or 2 } // types 0x2AF ff @@ -943,32 +1000,32 @@ void Thermostat::process_RC300Summer(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->roominfluence, 0)); - has_update(telegram->read_value(hc->offsettemp, 2)); - // dont use these values if we have telegram 0x471 ff - if (!is_fetch(summer2_typeids[hc->hc_num() - 1])) { - has_update(telegram->read_value(hc->summertemp, 6)); - has_update(telegram->read_value(hc->summer_setmode, 7)); + has_update(telegram, hc->roominfluence, 0); + has_update(telegram, hc->offsettemp, 2); + if (!is_fetch(summer2_typeids[hc->hc()])) { + has_update(telegram, hc->summertemp, 6); + has_update(telegram, hc->summer_setmode, 7); } if (hc->heatingtype < 3) { - has_update(telegram->read_value(hc->designtemp, 4)); + has_update(telegram, hc->designtemp, 4); } else { - has_update(telegram->read_value(hc->designtemp, 5)); + has_update(telegram, hc->designtemp, 5); } - has_update(telegram->read_value(hc->minflowtemp, 8)); - has_update(telegram->read_value(hc->fastHeatup, 10)); + has_update(telegram, hc->minflowtemp, 8); + has_update(telegram, hc->fastHeatup, 10); } // types 0x471 ff +// (0x473), data: 00 11 04 01 01 1C 08 04 void Thermostat::process_RC300Summer2(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); if (hc == nullptr) { return; } - has_update(telegram->read_value(hc->summer_setmode, 0)); - has_update(telegram->read_value(hc->summertemp, 1)); + has_update(telegram, hc->summer_setmode, 0); + has_update(telegram, hc->summertemp, 1); } // types 0x29B ff @@ -978,37 +1035,38 @@ void Thermostat::process_RC300Curve(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->controlmode, 0)); // 1-outdoor, 2-simple, 3-MPC, 4-room, 5-power, 6-const - has_update(telegram->read_value(hc->heatingtype, 1)); // 1=radiator, 2=convector, 3=floor - has_update(telegram->read_value(hc->nofrosttemp, 6)); + has_update(telegram, hc->controlmode, 0); // 1-outdoor, 2-simple, 3-MPC, 4-room, 5-power, 6-const + has_update(telegram, hc->heatingtype, 1); // 1=radiator, 2=convector, 3=floor + has_update(telegram, hc->nofrosttemp, 6); if (hc->heatingtype < 3) { - has_update(telegram->read_value(hc->maxflowtemp, 8)); + has_update(telegram, hc->maxflowtemp, 8); } else { - has_update(telegram->read_value(hc->maxflowtemp, 7)); + has_update(telegram, hc->maxflowtemp, 7); } } // types 0x31B (and 0x31C?) void Thermostat::process_RC300WWtemp(std::shared_ptr telegram) { - has_update(telegram->read_value(wwSetTemp_, 0)); - has_update(telegram->read_value(wwSetTempLow_, 1)); + has_update(telegram, wwSetTemp_, 0); + has_update(telegram, wwSetTempLow_, 1); } // type 02F5 // RC300WWmode(0x2F5), data: 01 FF 04 00 00 00 08 05 00 08 04 00 00 00 00 00 00 00 00 00 01 void Thermostat::process_RC300WWmode(std::shared_ptr telegram) { // circulation pump see: https://github.com/Th3M3/buderus_ems-wiki/blob/master/Einstellungen%20der%20Bedieneinheit%20RC310.md - has_update(telegram->read_value(wwCircPump_, 1)); // FF=off, 0=on ? + has_update(telegram, wwCircPump_, 1); // FF=off, 0=on ? - has_update(telegram->read_value(wwMode_, 2)); // 0=off, 1=low, 2=high, 3=auto, 4=own prog - has_update(telegram->read_value(wwCircMode_, 3)); // 0=off, 1=on, 2=auto, 4=own? - has_update(telegram->read_value(wwChargeDuration_, 10)); // value in steps of 15 min - has_update(telegram->read_value(wwCharge_, 11)); - - has_update(telegram->read_value(wwDisinfect_, 5)); // 0-off, 0xFF on - has_update(telegram->read_value(wwDisinfectHour_, 6)); // value in steps of 15 min - has_update(telegram->read_value(wwDisinfectDay_, 7)); // 0-6 Day of week, 7 every day + has_update(telegram, wwMode_, 2); // 0=off, 1=low, 2=high, 3=auto, 4=own prog + has_update(telegram, wwCircMode_, 3); // 0=off, 1=on, 2=auto, 4=own? + has_update(telegram, wwChargeDuration_, 10); // value in steps of 15 min + has_update(telegram, wwCharge_, 11); // boolv0xFF on + has_update(telegram, wwDisinfecting_, 5); // 0-off, 0xFF on + has_update(telegram, wwDisinfectHour_, 6); // value in steps of 15 min + has_update(telegram, wwDisinfectDay_, 7); // 0-6 Day of week, 7 every day + has_update(telegram, wwDailyHeating_, 8); // 0-off, 0xFF on + has_update(telegram, wwDailyHeatTime_, 9); // value in steps of 15 min } // types 0x31D and 0x31E @@ -1016,30 +1074,30 @@ void Thermostat::process_RC300WWmode(std::shared_ptr telegram) { void Thermostat::process_RC300WWmode2(std::shared_ptr telegram) { // 0x31D for WW system 1, 0x31E for WW system 2 // pos 1 = holiday mode - // pos 2 = current status of ww setpoint - // pos 3 = current status of ww circulation pump + // pos 2 = current status of DHW setpoint + // pos 3 = current status of DHW circulation pump if (telegram->type_id == 0x031D) { - has_update(telegram->read_value(wwExtra1_, 0)); // 0=no, 1=yes + has_update(telegram, wwExtra1_, 0); // 0=no, 1=yes } else { - has_update(telegram->read_value(wwExtra2_, 0)); // 0=no, 1=yes + has_update(telegram, wwExtra2_, 0); // 0=no, 1=yes } } // 0x23A damped outdoor temp void Thermostat::process_RC300OutdoorTemp(std::shared_ptr telegram) { - has_update(telegram->read_value(dampedoutdoortemp2_, 0)); // is *10 + has_update(telegram, dampedoutdoortemp2_, 0); // is *10 } // 0x240 RC300 parameter void Thermostat::process_RC300Settings(std::shared_ptr telegram) { - has_update(telegram->read_enumvalue(ibaBuildingType_, 9, 1)); // 1=light, 2=medium, 3=heavy - has_update(telegram->read_value(ibaMinExtTemperature_, 10)); + has_enumupdate(telegram, ibaBuildingType_, 9, 1); // 1=light, 2=medium, 3=heavy + has_update(telegram, ibaMinExtTemperature_, 10); } // 0x267 RC300 floordrying void Thermostat::process_RC300Floordry(std::shared_ptr telegram) { - has_update(telegram->read_value(floordrystatus_, 0)); - has_update(telegram->read_value(floordrytemp_, 1)); + has_update(telegram, floordrystatus_, 0); + has_update(telegram, floordrytemp_, 1); } // type 0x41 - data from the RC30 thermostat(0x10) - 14 bytes long @@ -1049,8 +1107,10 @@ void Thermostat::process_RC30Monitor(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->setpoint_roomTemp, 1, 1)); // is * 2, force as single byte - has_update(telegram->read_value(hc->curr_roomTemp, 2)); + has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte + has_update(telegram, hc->roomTemp, 2); + + add_ha_climate(hc); } // type 0xA7 - for reading the mode from the RC30 thermostat (0x10) @@ -1059,9 +1119,9 @@ void Thermostat::process_RC30Set(std::shared_ptr telegram) { if (hc == nullptr) { return; } + has_update(telegram, hc->mode, 23); - has_update(telegram->read_value(hc->mode, 23)); - hc->hamode = hc->mode; // set special HA mode + add_ha_climate(hc); } // type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4) - data from the RC35 thermostat (0x10) - 16 bytes @@ -1082,14 +1142,24 @@ void Thermostat::process_RC35Monitor(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->setpoint_roomTemp, 2, 1)); // is * 2, force to single byte, is 0 in summermode - has_update(telegram->read_value(hc->curr_roomTemp, 3)); // is * 10 - or 0x7D00 if thermostat is mounted on boiler + has_update(telegram, hc->selTemp, 2, 1); // is * 2, force to single byte, is 0 in summermode + int16_t roomTemp = hc->roomTemp; + has_update(telegram, hc->roomTemp, 3); // is * 10 - or 0x7D00 if thermostat is mounted on boiler + // publish zero if there was a roomtemp, but now is missing + if (Helpers::hasValue(roomTemp) && !Helpers::hasValue(hc->roomTemp)) { + roomTemp = hc->roomTemp; + hc->roomTemp = 0; + has_update(hc->roomTemp); + hc->roomTemp = roomTemp; + } - has_update(telegram->read_bitvalue(hc->modetype, 1, 1)); - has_update(telegram->read_bitvalue(hc->summermode, 1, 0)); - has_update(telegram->read_bitvalue(hc->holidaymode, 0, 5)); + has_bitupdate(telegram, hc->modetype, 1, 1); + has_bitupdate(telegram, hc->summermode, 1, 0); + has_bitupdate(telegram, hc->holidaymode, 0, 5); - has_update(telegram->read_value(hc->targetflowtemp, 14)); + has_update(telegram, hc->targetflowtemp, 14); + + add_ha_climate(hc); } // type 0x3D (HC1), 0x47 (HC2), 0x51 (HC3), 0x5B (HC4) - Working Mode Heating - for reading the mode from the RC35 thermostat (0x10) @@ -1104,32 +1174,34 @@ void Thermostat::process_RC35Set(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->heatingtype, 0)); // 0- off, 1-radiator, 2-convector, 3-floor - has_update(telegram->read_value(hc->nighttemp, 1)); // is * 2 - has_update(telegram->read_value(hc->daytemp, 2)); // is * 2 - has_update(telegram->read_value(hc->holidaytemp, 3)); // is * 2 - has_update(telegram->read_value(hc->roominfluence, 4)); // is * 1 - has_update(telegram->read_value(hc->offsettemp, 6)); // is * 2 - has_update(telegram->read_value(hc->mode, 7)); // night, day, auto - hc->hamode = hc->mode; // set special HA mode + has_update(telegram, hc->heatingtype, 0); // 0- off, 1-radiator, 2-convector, 3-floor + has_update(telegram, hc->nighttemp, 1); // is * 2 + has_update(telegram, hc->daytemp, 2); // is * 2 + has_update(telegram, hc->holidaytemp, 3); // is * 2 + has_update(telegram, hc->roominfluence, 4); // is * 1 + has_update(telegram, hc->offsettemp, 6); // is * 2 + has_update(telegram, hc->mode, 7); // night, day, auto - has_update(telegram->read_value(hc->wwprio, 21)); // 0xFF for on - has_update(telegram->read_value(hc->summertemp, 22)); // is * 1 - has_update(telegram->read_value(hc->nofrosttemp, 23)); // is * 1 - has_update(telegram->read_value(hc->flowtempoffset, 24)); // is * 1, only in mixed circuits - has_update(telegram->read_value(hc->reducemode, 25)); // 0-nofrost, 1-reduce, 2-roomhold, 3-outdoorhold - has_update(telegram->read_value(hc->control, 26)); // 0-off, 1-RC20 (remote), 2-RC35 - has_update(telegram->read_value(hc->controlmode, 33)); // 0-outdoortemp, 1-roomtemp - has_update(telegram->read_value(hc->tempautotemp, 37)); - has_update(telegram->read_value(hc->noreducetemp, 38)); // outdoor temperature for no reduce - has_update(telegram->read_value(hc->minflowtemp, 16)); - if (hc->heatingtype == 3) { - has_update(telegram->read_value(hc->designtemp, 36)); // is * 1 - has_update(telegram->read_value(hc->maxflowtemp, 35)); // is * 1 - } else { - has_update(telegram->read_value(hc->designtemp, 17)); // is * 1 - has_update(telegram->read_value(hc->maxflowtemp, 15)); // is * 1 + has_update(telegram, hc->wwprio, 21); // 0xFF for on + has_update(telegram, hc->summertemp, 22); // is * 1 + has_update(telegram, hc->nofrosttemp, 23); // is * 1 + has_update(telegram, hc->flowtempoffset, 24); // is * 1, only in mixed circuits + has_update(telegram, hc->reducemode, 25); // 0-nofrost, 1-reduce, 2-roomhold, 3-outdoorhold + has_update(telegram, hc->control, 26); // 0-off, 1-RC20 (remote), 2-RC35 + has_update(telegram, hc->controlmode, 33); // 0-outdoortemp, 1-roomtemp + has_update(telegram, hc->tempautotemp, 37); + has_update(telegram, hc->noreducetemp, 38); // outdoor temperature for no reduce + has_update(telegram, hc->minflowtemp, 16); + + if (hc->heatingtype == 3) { // floor heating + has_update(telegram, hc->designtemp, 36); // is * 1 + has_update(telegram, hc->maxflowtemp, 35); // is * 1 + } else { // radiator/convector + has_update(telegram, hc->designtemp, 17); // is * 1 + has_update(telegram, hc->maxflowtemp, 15); // is * 1 } + + add_ha_climate(hc); } // type 0x3F (HC1), 0x49 (HC2), 0x53 (HC3), 0x5D (HC4) - timer setting @@ -1139,12 +1211,42 @@ void Thermostat::process_RC35Timer(std::shared_ptr telegram) { return; } - has_update(telegram->read_value(hc->program, 84)); // 0 .. 10, 0-userprogram 1, 10-userprogram 2 - has_update(telegram->read_value(hc->pause, 85)); // time in hours - has_update(telegram->read_value(hc->party, 86)); // time in hours + uint8_t prog = telegram->type_id == timer_typeids[hc->hc()] ? 0 : 1; + if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1)) + || (!telegram->offset && telegram->message_length > 1 && !prog && !strlen(hc->switchtime1)) + || (!telegram->offset && telegram->message_length > 1 && prog && !strlen(hc->switchtime2))) { + char data[sizeof(hc->switchtime1)]; + uint8_t no = telegram->offset / 2; + uint8_t day = telegram->message_data[0] >> 5; + uint8_t on = telegram->message_data[0] & 1; + uint8_t time = telegram->message_data[1]; + + std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + if (day == 7) { + snprintf(data, sizeof(data), "%02d not_set", no); + } else { + snprintf(data, sizeof(data), "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); + } + if (!prog) { + strlcpy(hc->switchtime1, data, sizeof(hc->switchtime1)); + has_update(hc->switchtime1); // always publish + } else { + strlcpy(hc->switchtime2, data, sizeof(hc->switchtime2)); + has_update(hc->switchtime2); + if (is_fetch(telegram->type_id)) { + toggle_fetch(telegram->type_id, false); + } + } + } + + has_update(telegram, hc->program, 84); // 0 .. 10, 0-userprogram 1, 10-userprogram 2 + has_update(telegram, hc->pause, 85); // time in hours + has_update(telegram, hc->party, 86); // time in hours + if (telegram->message_length + telegram->offset >= 92 && telegram->offset <= 87) { - snprintf(hc->vacation, - sizeof(hc->vacation), + char data[sizeof(hc->vacation)]; + snprintf(data, + sizeof(data), "%02d.%02d.%04d-%02d.%02d.%04d", telegram->message_data[87 - telegram->offset], telegram->message_data[88 - telegram->offset], @@ -1152,10 +1254,13 @@ void Thermostat::process_RC35Timer(std::shared_ptr telegram) { telegram->message_data[90 - telegram->offset], telegram->message_data[91 - telegram->offset], telegram->message_data[92 - telegram->offset] + 2000); + has_update(hc->vacation, data, sizeof(hc->vacation)); } + if (telegram->message_length + telegram->offset >= 98 && telegram->offset <= 93) { - snprintf(hc->holiday, - sizeof(hc->holiday), + char data[sizeof(hc->holiday)]; + snprintf(data, + sizeof(data), "%02d.%02d.%04d-%02d.%02d.%04d", telegram->message_data[93 - telegram->offset], telegram->message_data[94 - telegram->offset], @@ -1163,6 +1268,7 @@ void Thermostat::process_RC35Timer(std::shared_ptr telegram) { telegram->message_data[96 - telegram->offset], telegram->message_data[97 - telegram->offset], telegram->message_data[98 - telegram->offset] + 2000); + has_update(hc->holiday, data, sizeof(hc->holiday)); } } @@ -1185,28 +1291,27 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { return; } - auto timeold = dateTime_; - // render time to HH:MM:SS DD/MM/YYYY + // render date to HH:MM:SS DD/MM/YYYY // had to create separate buffers because of how printf works - // IVT reports Year with high bit set.? + char date[25]; char buf1[6]; char buf2[6]; char buf3[6]; char buf4[6]; char buf5[6]; char buf6[6]; - snprintf(dateTime_, - sizeof(dateTime_), - "%s:%s:%s %s/%s/%s", - Helpers::smallitoa(buf1, telegram->message_data[2]), // hour - Helpers::smallitoa(buf2, telegram->message_data[4]), // minute - Helpers::smallitoa(buf3, telegram->message_data[5]), // second - Helpers::smallitoa(buf4, telegram->message_data[3]), // day - Helpers::smallitoa(buf5, telegram->message_data[1]), // month - Helpers::itoa(buf6, (telegram->message_data[0] & 0x7F) + 2000) // year + snprintf(date, + sizeof(date), + "%s:%s:%s %s.%s.%s", + Helpers::smallitoa(buf1, telegram->message_data[2]), // hour + Helpers::smallitoa(buf2, telegram->message_data[4]), // minute + Helpers::smallitoa(buf3, telegram->message_data[5]), // second + Helpers::smallitoa(buf4, telegram->message_data[3]), // day + Helpers::smallitoa(buf5, telegram->message_data[1]), // month + // IVT reports Year with high bit set.? + Helpers::itoa((telegram->message_data[0] & 0x7F) + 2000, buf6) // year ); - - has_update((strcmp(timeold, dateTime_) != 0)); + has_update(dateTime_, date, sizeof(dateTime_)); } // process_RCError - type 0xA2 - error message - 14 bytes long @@ -1217,24 +1322,26 @@ void Thermostat::process_RCError(std::shared_ptr telegram) { return; } - char buf[4]; - buf[0] = telegram->message_data[0]; - buf[1] = telegram->message_data[1]; - buf[2] = telegram->message_data[2]; - buf[3] = 0; - has_update(telegram->read_value(errorNumber_, 3)); - snprintf(errorCode_, sizeof(errorCode_), "%s(%d)", buf, errorNumber_); + telegram->read_value(errorNumber_, 3); + char code[sizeof(errorCode_)]; + code[0] = telegram->message_data[0]; + code[1] = telegram->message_data[1]; + code[2] = telegram->message_data[2]; + snprintf(&code[3], sizeof(code) - 3, "(%d)", errorNumber_); + has_update(errorCode_, code, sizeof(errorCode_)); } // 0x12 error log +// RCErrorMessage(0x12), data: 32 32 03 30 95 0A 0A 15 18 00 01 19 32 32 03 30 95 0A 09 05 18 00 01 19 31 38 03 +// RCErrorMessage(0x12), data: 39 95 08 09 0F 19 00 01 17 64 31 03 34 95 07 10 08 00 00 01 70 (offset 27) void Thermostat::process_RCErrorMessage(std::shared_ptr telegram) { - if (telegram->offset > 0 || telegram->message_length < 12) { + if (telegram->offset > 0 || telegram->message_length < 11) { return; } // data: displaycode(2), errornumber(2), year, month, hour, day, minute, duration(2), src-addr if (telegram->message_data[4] & 0x80) { // valid date - char code[3]; + char code[sizeof(lastCode_)]; uint16_t codeNo = EMS_VALUE_USHORT_NOTSET; code[0] = telegram->message_data[0]; code[1] = telegram->message_data[1]; @@ -1245,20 +1352,21 @@ void Thermostat::process_RCErrorMessage(std::shared_ptr telegram uint8_t day = telegram->message_data[7]; uint8_t hour = telegram->message_data[6]; uint8_t min = telegram->message_data[8]; - snprintf(lastCode_, sizeof(lastCode_), "%s(%d) %02d.%02d.%d %02d:%02d", code, codeNo, day, month, year, hour, min); + uint16_t duration; + telegram->read_value(duration, 9); + snprintf(&code[2], sizeof(code) - 2, "(%d) %02d.%02d.%d %02d:%02d (%d min)", codeNo, day, month, year, hour, min, duration); + has_update(lastCode_, code, sizeof(lastCode_)); } } // 0xA5 - Set minimum external temperature bool Thermostat::set_minexttemp(const char * value, const int8_t id) { int mt = 0; - if (!Helpers::value2number(value, mt)) { - LOG_WARNING(F("Set min external temperature: Invalid value")); + if (!Helpers::value2temperature(value, mt)) { return false; } - LOG_INFO(F("Setting min external temperature to %d C"), mt); - if (model() == EMS_DEVICE_FLAG_RC20_N) { + if ((model() == EMS_DEVICE_FLAG_RC20_N) || (model() == EMS_DEVICE_FLAG_RC25)) { write_command(0xAD, 14, mt, 0xAD); } else if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x240, 10, mt, 0x240); @@ -1273,11 +1381,9 @@ bool Thermostat::set_minexttemp(const char * value, const int8_t id) { bool Thermostat::set_clockoffset(const char * value, const int8_t id) { int co = 0; if (!Helpers::value2number(value, co)) { - LOG_WARNING(F("Set clock offset: Invalid value")); return false; } - LOG_INFO(F("Setting clock offset to %d seconds"), co); write_command(EMS_TYPE_IBASettings, 12, co, EMS_TYPE_IBASettings); return true; @@ -1286,12 +1392,13 @@ bool Thermostat::set_clockoffset(const char * value, const int8_t id) { // 0xA5 - Calibrate internal temperature bool Thermostat::set_calinttemp(const char * value, const int8_t id) { float ct = 0; - if (!Helpers::value2float(value, ct)) { - LOG_WARNING(F("Cal internal temperature: Invalid value")); + if (!Helpers::value2temperature(value, ct, true)) { return false; } + int8_t t = (int8_t)(ct * 10); - LOG_INFO(F("Calibrating internal temperature to %d.%d C"), t / 10, t < 0 ? -t % 10 : t % 10); + LOG_DEBUG(F("Calibrating internal temperature to %d.%d C"), t / 10, t < 0 ? -t % 10 : t % 10); + if (model() == EMS_DEVICE_FLAG_RC10) { write_command(0xB0, 0, t, 0xB0); } else { @@ -1305,11 +1412,9 @@ bool Thermostat::set_calinttemp(const char * value, const int8_t id) { bool Thermostat::set_display(const char * value, const int8_t id) { int ds = 0; if (!Helpers::value2number(value, ds)) { - LOG_WARNING(F("Set display: Invalid value")); return false; } - LOG_INFO(F("Setting display to %d"), ds); write_command(EMS_TYPE_IBASettings, 0, ds, EMS_TYPE_IBASettings); return true; @@ -1317,8 +1422,7 @@ bool Thermostat::set_display(const char * value, const int8_t id) { bool Thermostat::set_remotetemp(const char * value, const int8_t id) { float f = 0; - if (!Helpers::value2float(value, f)) { - LOG_WARNING(F("Set remote temperature: Invalid value")); + if (!Helpers::value2temperature(value, f)) { return false; } @@ -1333,7 +1437,9 @@ bool Thermostat::set_remotetemp(const char * value, const int8_t id) { } else { hc->remotetemp = (int16_t)(f * 10); } - Roomctrl::set_remotetemp(hc->hc_num() - 1, hc->remotetemp); + + Roomctrl::set_remotetemp(hc->hc(), hc->remotetemp); + // has_update(hc->remotetemp); return true; } @@ -1342,15 +1448,15 @@ bool Thermostat::set_remotetemp(const char * value, const int8_t id) { bool Thermostat::set_building(const char * value, const int8_t id) { uint8_t bd = 0; if (!Helpers::value2enum(value, bd, FL_(enum_ibaBuildingType))) { - LOG_WARNING(F("Set building: Invalid value")); return false; } - LOG_INFO(F("Setting building to %s"), value); + if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x240, 9, bd + 1, 0x240); } else { write_command(EMS_TYPE_IBASettings, 6, bd, EMS_TYPE_IBASettings); } + return true; } @@ -1358,13 +1464,13 @@ bool Thermostat::set_building(const char * value, const int8_t id) { bool Thermostat::set_heatingpid(const char * value, const int8_t id) { uint8_t pid = 0; if (!Helpers::value2enum(value, pid, FL_(enum_PID))) { - LOG_WARNING(F("Set heating pid: Invalid value")); return false; } - LOG_INFO(F("Setting heating pid to %s"), value); + if (model() == EMS_DEVICE_FLAG_RC10) { write_command(0xB0, 6, pid, 0xB0); } + return true; } @@ -1372,11 +1478,10 @@ bool Thermostat::set_heatingpid(const char * value, const int8_t id) { bool Thermostat::set_damping(const char * value, const int8_t id) { bool dmp; if (Helpers::value2bool(value, dmp)) { - LOG_INFO(F("Setting damping %s"), dmp ? "on" : "off"); write_command(EMS_TYPE_IBASettings, 21, dmp ? 0xFF : 0, EMS_TYPE_IBASettings); return true; } - LOG_WARNING(F("Set damping: Invalid value")); + return false; } @@ -1384,11 +1489,9 @@ bool Thermostat::set_damping(const char * value, const int8_t id) { bool Thermostat::set_language(const char * value, const int8_t id) { uint8_t lg = 0; if (!Helpers::value2enum(value, lg, FL_(enum_ibaLanguage))) { - LOG_WARNING(F("Set language: Invalid value")); return false; } - LOG_INFO(F("Setting language to %d"), lg); write_command(EMS_TYPE_IBASettings, 1, lg, EMS_TYPE_IBASettings); return true; @@ -1405,16 +1508,14 @@ bool Thermostat::set_control(const char * value, const int8_t id) { uint8_t ctrl = 0; if (model() == EMS_DEVICE_FLAG_JUNKERS && !has_flags(EMS_DEVICE_FLAG_JUNKERS_OLD)) { if (Helpers::value2enum(value, ctrl, FL_(enum_j_control))) { - LOG_INFO(F("Setting circuit-control for hc%d to %d"), hc_num, ctrl); - write_command(set_typeids[hc->hc_num() - 1], 1, ctrl); + write_command(set_typeids[hc->hc()], 1, ctrl); return true; } } else if (Helpers::value2enum(value, ctrl, FL_(enum_control))) { - LOG_INFO(F("Setting circuit-control for hc%d to %d"), hc_num, ctrl); - write_command(set_typeids[hc->hc_num() - 1], 26, ctrl); + write_command(set_typeids[hc->hc()], 26, ctrl); return true; } - LOG_WARNING(F("Set control: Invalid value")); + return false; } @@ -1424,50 +1525,45 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) { if (model() == EMS_DEVICE_FLAG_RC10) { if (!Helpers::value2enum(value, set, FL_(enum_wwMode3))) { - LOG_WARNING(F("Set ww mode: Invalid mode")); return false; } - LOG_INFO(F("Setting ww mode to %s"), value); write_command(0xB0, 2, set, 0xB0); } else if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { if (!Helpers::value2enum(value, set, FL_(enum_wwMode))) { - LOG_WARNING(F("Set ww mode: Invalid mode")); return false; } - LOG_INFO(F("Setting ww mode to %s"), value); write_command(0x02F5, 2, set, 0x02F5); } else { if (!Helpers::value2enum(value, set, FL_(enum_wwMode2))) { - LOG_WARNING(F("Set ww mode: Invalid mode")); return false; } - LOG_INFO(F("Setting ww mode to %s"), value); write_command(EMS_TYPE_wwSettings, 2, set, EMS_TYPE_wwSettings); } + return true; } // Set ww temperature, ems+ bool Thermostat::set_wwtemp(const char * value, const int8_t id) { int t = 0; - if (!Helpers::value2number(value, t)) { - LOG_WARNING(F("Set ww high temperature: Invalid value")); + if (!Helpers::value2temperature(value, t, false, 0, 90)) { return false; } - LOG_INFO(F("Setting ww high temperature to %d C"), t); + write_command(0x031B, 0, t, 0x031B); + return true; } // Set ww low temperature, ems+ bool Thermostat::set_wwtemplow(const char * value, const int8_t id) { int t = 0; - if (!Helpers::value2number(value, t)) { - LOG_WARNING(F("Set ww low temperature: Invalid value")); + if (!Helpers::value2temperature(value, t)) { return false; } - LOG_INFO(F("Setting ww low temperature to %d C"), t); + write_command(0x031B, 1, t, 0x031B); + return true; } @@ -1475,11 +1571,11 @@ bool Thermostat::set_wwtemplow(const char * value, const int8_t id) { bool Thermostat::set_wwcharge(const char * value, const int8_t id) { bool b = false; if (!Helpers::value2bool(value, b)) { - LOG_WARNING(F("Set ww charge: Invalid value")); return false; } - LOG_INFO(F("Setting ww charge to %s"), b ? F_(on) : F_(off)); + write_command(0x02F5, 11, b ? 0xFF : 0x00, 0x02F5); + return true; } @@ -1487,11 +1583,10 @@ bool Thermostat::set_wwcharge(const char * value, const int8_t id) { bool Thermostat::set_wwchargeduration(const char * value, const int8_t id) { int t = 0xFF; if (!Helpers::value2number(value, t)) { - LOG_WARNING(F("Set ww charge duration: Invalid value")); return false; } t = (t + 8) / 15; - LOG_INFO(F("Setting ww charge duration to %d min"), t * 15); + write_command(0x2F5, 10, t, 0x02F5); return true; } @@ -1501,17 +1596,15 @@ bool Thermostat::set_wwprio(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Set wwprio: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, device_id()); - return false; - } - bool b; - if (!Helpers::value2bool(value, b)) { - LOG_WARNING(F("Set wwprio: Invalid value")); return false; } - LOG_INFO(F("Setting wwprio: %s"), b ? "on" : "off"); - write_command(set_typeids[hc->hc_num() - 1], 21, b ? 0xFF : 0x00, set_typeids[hc->hc_num() - 1]); + bool b; + if (!Helpers::value2bool(value, b)) { + return false; + } + + write_command(set_typeids[hc->hc()], 21, b ? 0xFF : 0x00, set_typeids[hc->hc()]); return true; } @@ -1522,100 +1615,113 @@ bool Thermostat::set_wwcircmode(const char * value, const int8_t id) { if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { if (!Helpers::value2enum(value, set, FL_(enum_wwCircMode))) { - LOG_WARNING(F("Set ww circulation mode: Invalid mode")); return false; } - LOG_INFO(F("Setting ww circulation mode to %s"), value); write_command(0x02F5, 3, set, 0x02F5); return true; } if (!Helpers::value2enum(value, set, FL_(enum_wwMode2))) { - LOG_WARNING(F("Set ww circulation mode: Invalid mode")); return false; } - LOG_INFO(F("Setting ww circulation mode to %s"), value); + write_command(EMS_TYPE_wwSettings, 3, set, EMS_TYPE_wwSettings); + + return true; +} + +bool Thermostat::set_wwDailyHeating(const char * value, const int8_t id) { + bool b = false; + if (!Helpers::value2bool(value, b)) { + return false; + } + + write_command(0x2F5, 8, b ? 0xFF : 0x00, 0x2F5); + return true; +} + +bool Thermostat::set_wwDailyHeatTime(const char * value, const int8_t id) { + int set; + if (!Helpers::value2number(value, set)) { + return false; + } + + if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { + uint8_t t = (set + 8) / 15; + if (t > 95) { + return false; + } + + write_command(0x2F5, 9, t, 0x2F5); + } return true; } bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) { bool b = false; if (!Helpers::value2bool(value, b)) { - LOG_WARNING(F("Set ww disinfect: Invalid value")); return false; } - LOG_INFO(F("Setting ww disinfect to %s"), b ? F_(on) : F_(off)); + if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x2F5, 5, b ? 0xFF : 0x00, 0x2F5); } else { write_command(0x37, 4, b ? 0xFF : 0x00, 0x37); } + return true; } bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) { uint8_t set = 0xFF; if (!Helpers::value2enum(value, set, FL_(enum_dayOfWeek))) { - LOG_WARNING(F("Set ww disinfection day: Invalid day")); return false; } - LOG_INFO(F("Setting ww disinfection day to %s"), value); + if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x2F5, 7, set, 0x2F5); } else { write_command(0x37, 5, set, 0x37); } + return true; } bool Thermostat::set_wwDisinfectHour(const char * value, const int8_t id) { int set; - if (!Helpers::value2number(value, set)) { - LOG_WARNING(F("Set ww disinfection time: Invalid")); - return false; - } if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { - uint8_t t = (set + 8) / 15; - if (t > 95) { - LOG_WARNING(F("Set ww disinfection time: Invalid")); + if (!Helpers::value2number(value, set, 0, 1431)) { return false; } - LOG_INFO(F("Setting ww disinfection time to %s minutes"), value); - write_command(0x2F5, 6, t, 0x2F5); + write_command(0x2F5, 6, (set + 8) / 15, 0x2F5); } else { - if (set < 0 || set > 23) { - LOG_WARNING(F("Set ww disinfection hour: Invalid")); + if (!Helpers::value2number(value, set, 0, 23)) { return false; } - LOG_INFO(F("Setting ww disinfection hour to %s"), value); write_command(0x37, 6, set, 0x37); } + return true; } bool Thermostat::set_wwMaxTemp(const char * value, const int8_t id) { int t = 0; - if (!Helpers::value2number(value, t)) { - LOG_WARNING(F("Set ww max temperature: Invalid value")); + if (!Helpers::value2temperature(value, t, false, 0, 90)) { return false; } - if (t < 0 || t > 90) { - LOG_WARNING(F("Set ww max temperature: Invalid value")); - return false; - } - LOG_INFO(F("Setting ww max temperature to %d C"), t); + write_command(0x37, 8, t, 0x37); + return true; } bool Thermostat::set_wwOneTimeKey(const char * value, const int8_t id) { bool b = false; if (!Helpers::value2bool(value, b)) { - LOG_WARNING(F("Set ww loading one time key: Invalid value")); return false; } - LOG_INFO(F("Setting ww loading one time key to %s"), value); + write_command(0x37, 9, b ? 0xFF : 0x00, 0x37); + return true; } @@ -1623,33 +1729,33 @@ bool Thermostat::set_wwOneTimeKey(const char * value, const int8_t id) { bool Thermostat::set_backlight(const char * value, const int8_t id) { bool b = false; if (!Helpers::value2bool(value, b)) { - LOG_WARNING(F("Set key backlight: Invalid value")); return false; } - LOG_INFO(F("Setting key key backlight to %s"), b ? "on" : "off"); + write_command(0xB0, 1, b ? 0xFF : 0x00, 0xB0); + return true; } bool Thermostat::set_wwProgMode(const char * value, const int8_t id) { uint8_t set = 0xFF; if (!Helpers::value2enum(value, set, FL_(enum_wwProgMode))) { - LOG_WARNING(F("Set ww program mode: Invalid mode")); return false; } - LOG_INFO(F("Setting ww program mode to %s"), value); + write_command(0x37, 0, set ? 0xFF : 0x00, 0x37); + return true; } bool Thermostat::set_wwCircProg(const char * value, const int8_t id) { uint8_t set = 0xFF; if (!Helpers::value2enum(value, set, FL_(enum_wwProgMode))) { - LOG_WARNING(F("Set ww circulation program mode: Invalid mode")); return false; } - LOG_INFO(F("Setting ww circulation program mode to %s"), value); + write_command(0x37, 1, set ? 0xFF : 0x00, 0x37); + return true; } @@ -1658,11 +1764,9 @@ bool Thermostat::set_holiday(const char * value, const int8_t id, const bool vac uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Set vacation/holiday: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, device_id()); return false; } if (strlen(value) != 21) { - LOG_WARNING(F("Set vacation/holiday: Invalid value")); return false; } @@ -1675,16 +1779,13 @@ bool Thermostat::set_holiday(const char * value, const int8_t id, const bool vac data[5] = (value[18] - '0') * 100 + (value[19] - '0') * 10 + (value[20] - '0'); if (data[0] > 31 || data[1] > 12 || data[3] > 31 || data[4] > 12) { - LOG_WARNING(F("Set vacation/holiday: Invalid value")); return false; } if (!vacation || value[10] == '+') { // + for compatibility - LOG_INFO(F("Setting holidays at home for hc %d"), hc->hc_num()); - write_command(timer_typeids[hc->hc_num() - 1], 93, data, 6, 0); + write_command(timer_typeids[hc->hc()], 93, data, 6, 0); } else { - LOG_INFO(F("Setting vacations away from home for hc %d"), hc->hc_num()); - write_command(timer_typeids[hc->hc_num() - 1], 87, data, 6, 0); + write_command(timer_typeids[hc->hc()], 87, data, 6, 0); } return true; @@ -1695,21 +1796,18 @@ bool Thermostat::set_pause(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Set pause: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, device_id()); return false; } if (value == nullptr) { - read_command(timer_typeids[hc->hc_num() - 1], 85, 1); + read_command(timer_typeids[hc->hc()], 85, 1); return true; } int hrs = 0; if (!Helpers::value2number(value, hrs)) { - LOG_WARNING(F("Set pause: Invalid value")); return false; } - LOG_INFO(F("Setting pause: %d hours, hc: %d"), hrs, hc->hc_num()); - write_command(timer_typeids[hc->hc_num() - 1], 85, hrs); + write_command(timer_typeids[hc->hc()], 85, hrs); return true; } @@ -1718,21 +1816,22 @@ bool Thermostat::set_pause(const char * value, const int8_t id) { bool Thermostat::set_party(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); + if (hc == nullptr) { - LOG_WARNING(F("Set party: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, device_id()); return false; } + if (value == nullptr) { - read_command(timer_typeids[hc->hc_num() - 1], 85, 1); + read_command(timer_typeids[hc->hc()], 85, 1); return true; } + int hrs = 0; if (!Helpers::value2number(value, hrs)) { - LOG_WARNING(F("Set party: Invalid value")); return false; } - LOG_INFO(F("Setting party: %d hours, hc: %d"), hrs, hc->hc_num()); - write_command(timer_typeids[hc->hc_num() - 1], 86, hrs); + + write_command(timer_typeids[hc->hc()], 86, hrs); return true; } @@ -1741,9 +1840,8 @@ bool Thermostat::set_party(const char * value, const int8_t id) { // dw - day of week (0..6), dst- summertime (0/1) // id is ignored bool Thermostat::set_datetime(const char * value, const int8_t id) { - std::string dt(30, '\0'); + std::string dt; if (!Helpers::value2string(value, dt)) { - LOG_WARNING(F("Set date: Invalid value")); return false; } @@ -1752,7 +1850,6 @@ bool Thermostat::set_datetime(const char * value, const int8_t id) { time_t now = time(nullptr); tm * tm_ = localtime(&now); if (tm_->tm_year < 110) { // no NTP time - LOG_WARNING(F("No NTP time. Cannot set RCtime")); return false; } @@ -1764,22 +1861,30 @@ bool Thermostat::set_datetime(const char * value, const int8_t id) { data[5] = tm_->tm_sec; data[6] = (tm_->tm_wday + 6) % 7; // Bosch counts from Mo, time from Su data[7] = tm_->tm_isdst + 2; // set DST and flag for ext. clock - char time_string[25]; - strftime(time_string, 25, "%FT%T%z", tm_); - LOG_INFO(F("Date and time: %s"), time_string); - } else { + // char time_string[25]; + // strftime(time_string, 25, "%FT%T%z", tm_); + // LOG_INFO(F("Date and time: %s"), time_string); + } else if (dt.length() == 23) { data[0] = (dt[16] - '0') * 100 + (dt[17] - '0') * 10 + (dt[18] - '0'); // year data[1] = (dt[12] - '0') * 10 + (dt[13] - '0'); // month data[2] = (dt[0] - '0') * 10 + (dt[1] - '0'); // hour data[3] = (dt[9] - '0') * 10 + (dt[10] - '0'); // day data[4] = (dt[3] - '0') * 10 + (dt[4] - '0'); // min data[5] = (dt[6] - '0') * 10 + (dt[7] - '0'); // sec - data[6] = (dt[20] - '0'); // day of week + data[6] = (dt[20] - '0'); // day of week, Mo:0 data[7] = (dt[22] - '0') + 2; // DST and flag - LOG_INFO(F("Date and time: %02d.%02d.2%03d-%02d:%02d:%02d"), data[3], data[1], data[0], data[2], data[4], data[5]); + // LOG_INFO(F("Date and time: %02d.%02d.2%03d-%02d:%02d:%02d"), data[3], data[1], data[0], data[2], data[4], data[5]); + } else { + LOG_WARNING(F("Set date: invalid data, wrong length")); + return false; + } + if (data[1] == 0 || data[1] > 12 || data[2] > 23 || data[3] == 0 || data[3] > 31 || data[4] > 59 || data[5] > 59 || data[6] > 6 || data[7] > 3) { + // LOG_WARNING(F("Set date: invalid data")); + LOG_WARNING(F("Invalid date/time: %02d.%02d.2%03d-%02d:%02d:%02d-%d-%d"), data[3], data[1], data[0], data[2], data[4], data[5], data[6], data[7]); + return false; } - LOG_INFO(F("Setting date and time")); + // LOG_INFO(F("Setting date and time: %02d.%02d.2%03d-%02d:%02d:%02d-%d-%d"), data[3], data[1], data[0], data[2], data[4], data[5], data[6], data[7]); write_command(EMS_TYPE_time, 0, data, 8, EMS_TYPE_time); return true; @@ -1788,12 +1893,12 @@ bool Thermostat::set_datetime(const char * value, const int8_t id) { // sets the thermostat working mode, where mode is a string // converts string mode to HeatingCircuit::Mode bool Thermostat::set_mode(const char * value, const int8_t id) { - std::string mode(20, '\0'); if (strlen(value) >= 20) { - LOG_WARNING(F("Set mode: Invalid mode")); return false; } + std::string mode; + if (value[0] >= '0' && value[0] <= '9') { uint8_t num = value[0] - '0'; switch (model()) { @@ -1804,6 +1909,7 @@ bool Thermostat::set_mode(const char * value, const int8_t id) { case EMSdevice::EMS_DEVICE_FLAG_RC20_N: mode = read_flash_string(FL_(enum_mode2)[num]); break; + case EMSdevice::EMS_DEVICE_FLAG_RC25: case EMSdevice::EMS_DEVICE_FLAG_RC30: case EMSdevice::EMS_DEVICE_FLAG_RC35: case EMSdevice::EMS_DEVICE_FLAG_RC30_N: @@ -1820,11 +1926,9 @@ bool Thermostat::set_mode(const char * value, const int8_t id) { mode = read_flash_string(FL_(enum_mode5)[num]); break; default: - LOG_WARNING(F("Set mode: Invalid mode")); return false; } } else if (!Helpers::value2string(value, mode)) { - LOG_WARNING(F("Set mode: Invalid mode")); return false; } @@ -1860,7 +1964,6 @@ bool Thermostat::set_mode(const char * value, const int8_t id) { return set_mode_n(HeatingCircuit::Mode::COMFORT, hc_num); } - LOG_WARNING(F("Set mode: Invalid mode %s"), value); return false; } @@ -1870,14 +1973,13 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { // get hc based on number std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Set mode: Heating Circuit %d not found or activated"), hc_num); return false; } uint8_t set_mode_value, offset; - uint16_t validate_typeid = 0; - uint8_t hc_p = hc->hc_num() - 1; - uint16_t set_typeid = set_typeids[hc->hc_num() - 1]; + uint8_t hc_p = hc->hc(); + uint16_t set_typeid = set_typeids[hc_p]; + uint16_t validate_typeid = set_typeid; // set the value to send via EMS depending on the mode type switch (mode) { @@ -1905,7 +2007,7 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { offset = 0; validate_typeid = 0xB1; set_typeid = 0xB2; - if (mode == HeatingCircuit::Mode::OFF) { + if (mode == HeatingCircuit::Mode::NOFROST || mode == HeatingCircuit::Mode::OFF) { set_mode_value = 1; } else if (mode == HeatingCircuit::Mode::NIGHT) { set_mode_value = 2; @@ -1914,21 +2016,18 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { } break; case EMSdevice::EMS_DEVICE_FLAG_RC20: - offset = EMS_OFFSET_RC20Set_mode; - validate_typeid = set_typeids[hc_p]; + offset = EMS_OFFSET_RC20Set_mode; break; case EMSdevice::EMS_DEVICE_FLAG_RC20_N: // ES72 - offset = EMS_OFFSET_RC20_2_Set_mode; - validate_typeid = set_typeids[hc_p]; + case EMSdevice::EMS_DEVICE_FLAG_RC25: + offset = EMS_OFFSET_RC20_2_Set_mode; break; case EMSdevice::EMS_DEVICE_FLAG_RC30: - offset = EMS_OFFSET_RC30Set_mode; - validate_typeid = set_typeids[hc_p]; + offset = EMS_OFFSET_RC30Set_mode; break; case EMSdevice::EMS_DEVICE_FLAG_RC35: case EMSdevice::EMS_DEVICE_FLAG_RC30_N: - offset = EMS_OFFSET_RC35Set_mode; - validate_typeid = set_typeids[hc_p]; + offset = EMS_OFFSET_RC35Set_mode; break; case EMSdevice::EMS_DEVICE_FLAG_RC300: case EMSdevice::EMS_DEVICE_FLAG_RC100: @@ -1946,12 +2045,12 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { } else { offset = EMS_OFFSET_JunkersSetMessage_set_mode; } - validate_typeid = set_typeids[hc_p]; + // validate_typeid = monitor_typeids[hc_p]; if (mode == HeatingCircuit::Mode::NOFROST) { set_mode_value = 0x01; } else if (mode == HeatingCircuit::Mode::ECO || (mode == HeatingCircuit::Mode::NIGHT)) { set_mode_value = 0x02; - } else if ((mode == HeatingCircuit::Mode::DAY) || (mode == HeatingCircuit::Mode::HEAT)) { + } else if ((mode == HeatingCircuit::Mode::HEAT) || (mode == HeatingCircuit::Mode::DAY)) { set_mode_value = 0x03; // comfort } else if (mode == HeatingCircuit::Mode::AUTO) { set_mode_value = 0x04; @@ -1962,8 +2061,6 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { break; } - LOG_INFO(F("Setting thermostat mode to %s for heating circuit %d"), mode_tostring(mode).c_str(), hc->hc_num()); - // add the write command to the Tx queue // post validate is the corresponding monitor or set type IDs as they can differ per model write_command(set_typeid, offset, set_mode_value, validate_typeid); @@ -1976,20 +2073,20 @@ bool Thermostat::set_summermode(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Setting summer mode: Heating Circuit %d not found or activated"), hc_num); return false; } + uint8_t set = 0xFF; if (!Helpers::value2enum(value, set, FL_(enum_summermode))) { - LOG_WARNING(F("Setting summer mode: Invalid mode")); return false; } - LOG_INFO(F("Setting summer mode to %s for heating circuit %d"), value, hc->hc_num()); - if (is_fetch(summer2_typeids[hc->hc_num() - 1])) { - write_command(summer2_typeids[hc->hc_num() - 1], 0, set, summer2_typeids[hc->hc_num() - 1]); + + if (is_fetch(summer2_typeids[hc->hc()])) { + write_command(summer2_typeids[hc->hc()], 0, set, summer2_typeids[hc->hc()]); } else { - write_command(summer_typeids[hc->hc_num() - 1], 7, set, summer_typeids[hc->hc_num() - 1]); + write_command(summer_typeids[hc->hc()], 7, set, summer_typeids[hc->hc()]); } + return true; } @@ -1998,16 +2095,16 @@ bool Thermostat::set_fastheatup(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Set fast heatup: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, device_id()); return false; } + int set = 0; + if (!Helpers::value2number(value, set)) { - LOG_WARNING(F("Set fast heatup: Invalid value")); return false; } - LOG_INFO(F("Setting fast heatup to %d%%"), set); - write_command(summer_typeids[hc->hc_num() - 1], 10, set, summer_typeids[hc->hc_num() - 1]); + + write_command(summer_typeids[hc->hc()], 10, set, summer_typeids[hc->hc()]); return true; } @@ -2016,16 +2113,15 @@ bool Thermostat::set_reducemode(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Setting reduce mode: Heating Circuit %d not found or activated"), hc_num); return false; } + uint8_t set = 0xFF; if (!Helpers::value2enum(value, set, FL_(enum_reducemode))) { - LOG_WARNING(F("Setting reduce mode: Invalid mode")); return false; } - LOG_INFO(F("Setting reduce mode to %s for heating circuit %d"), value, hc->hc_num()); - write_command(set_typeids[hc->hc_num() - 1], 25, set, set_typeids[hc->hc_num() - 1]); + + write_command(set_typeids[hc->hc()], 25, set, set_typeids[hc->hc()]); return true; } @@ -2034,22 +2130,21 @@ bool Thermostat::set_heatingtype(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Setting heating type: Heating Circuit %d not found or activated"), hc_num); return false; } + uint8_t set = 0xFF; if (Helpers::value2enum(value, set, FL_(enum_heatingtype))) { - LOG_INFO(F("Setting heating type to %d for heating circuit %d"), set, hc->hc_num()); - if (model() == EMS_DEVICE_FLAG_RC20_N) { - write_command(set_typeids[hc->hc_num() - 1], 0, set, set_typeids[hc->hc_num() - 1]); + if ((model() == EMS_DEVICE_FLAG_RC20_N) || (model() == EMS_DEVICE_FLAG_RC25)) { + write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { - write_command(set_typeids[hc->hc_num() - 1], 0, set, set_typeids[hc->hc_num() - 1]); + write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); } else { - write_command(curve_typeids[hc->hc_num() - 1], 1, set, curve_typeids[hc->hc_num() - 1]); + write_command(curve_typeids[hc->hc()], 1, set, curve_typeids[hc->hc()]); return true; } } - LOG_WARNING(F("Setting heating type: Invalid mode")); + return false; } @@ -2058,24 +2153,22 @@ bool Thermostat::set_controlmode(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Setting control mode: Heating Circuit %d not found or activated"), hc_num); return false; } + uint8_t set = 0xFF; if (model() == EMS_DEVICE_FLAG_RC300 || model() == EMS_DEVICE_FLAG_RC100) { if (Helpers::value2enum(value, set, FL_(enum_controlmode))) { - LOG_INFO(F("Setting control mode to %d for heating circuit %d"), set, hc->hc_num()); - write_command(curve_typeids[hc->hc_num() - 1], 0, set, curve_typeids[hc->hc_num() - 1]); + write_command(curve_typeids[hc->hc()], 0, set, curve_typeids[hc->hc()]); return true; } } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { if (Helpers::value2enum(value, set, FL_(enum_controlmode2))) { - LOG_INFO(F("Setting control mode to %d for heating circuit %d"), set, hc->hc_num()); - write_command(set_typeids[hc->hc_num() - 1], 33, set, set_typeids[hc->hc_num() - 1]); + write_command(set_typeids[hc->hc()], 33, set, set_typeids[hc->hc()]); return true; } } - LOG_WARNING(F("Setting control mode: Invalid mode")); + return false; } @@ -2084,123 +2177,221 @@ bool Thermostat::set_reducehours(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Setting reducehours: Heating Circuit %d not found or activated"), hc_num); return false; } + int v; + if (Helpers::value2number(value, v)) { - LOG_WARNING(F("Setting reducetime to %d hours"), v); - write_command(set_typeids[hc->hc_num() - 1], 5, v, set_typeids[hc->hc_num() - 1]); + write_command(set_typeids[hc->hc()], 5, v, set_typeids[hc->hc()]); return true; } - LOG_WARNING(F("Setting reducehours: Invalid value")); + return false; } -// sets a single switchtime in the thermostat program for RC35 -// format "01:0,1,15:30" Number, day, on, time -// format "1:01:0,1,15:30" Prog, number, day, on, time -bool Thermostat::set_switchtime(const char * value, const int8_t id) { - uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; - std::shared_ptr hc = heating_circuit(hc_num); - if (hc == nullptr) { - LOG_WARNING(F("Setting switchtime: Heating Circuit %d not found or activated"), hc_num); - return false; - } +// sets a single switchtime in the thermostat program for RC35, ww, circ, hc.. +bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char * out, size_t len) { if (value == nullptr) { return false; } - uint8_t prog = 0; - // check for program 1 or 2 - if (strlen(value) == 4 || strlen(value) == 14) { - prog = value[0] - '1'; - value += 2; - if (prog > 1) { + uint8_t no = 44; // invalid value + uint8_t day = 8; // invalid + uint8_t on = 8; // invalid + uint8_t time = 0x91; // invalid + + if (value[0] == '{') { + StaticJsonDocument doc; + DeserializationError error = deserializeJson(doc, value); + if (error) { return false; } - prog *= 3; // offset - } - // only setpoint number returns data in response - if (strlen(value) == 2) { - uint8_t no = (value[0] - '0') * 10 + (value[1] - '0'); - if (no < 42) { - read_command(timer_typeids[hc->hc_num() - 1] + prog, 2 * no, 2); + if (!doc.containsKey("no")) { + return false; + } + no = doc["no"].as(); + if (!doc.containsKey("day") || !doc.containsKey("mode") || !doc.containsKey("time")) { + EMSESP::wait_validate(type_id); + read_command(type_id, 2 * no, 2); return true; } - return false; + const char * s_day = doc["day"]; + if (!Helpers::value2enum(s_day, day, FL_(enum_dayOfWeek))) { + return false; + } + const char * s_mode = doc["mode"]; + const char * s_time = doc["time"]; + if ((model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N)) { + bool b; + if (Helpers::value2bool(s_mode, b)) { + on = b ? 1 : 0; + } + if (strlen(s_time) == 5 && s_time[2] == ':') { + time = 6 * ((s_time[0] - '0') * 10 + (s_time[1] - '0')) + (s_time[3] - '0'); + } + } else { + Helpers::value2enum(s_mode, on, FL_(enum_switchmode)); + if (strlen(s_time) == 5 && s_time[2] == ':') { + time = 4 * ((s_time[0] - '0') * 10 + (s_time[1] - '0')) + ((s_time[3] - '0') * 10 + (s_time[4] - '0')) / 15; + } + } + if (strncmp(s_mode, "not_set", 7) == 0) { + day = 7; + on = 7; + time = 0x90; + // LOG_INFO(F("switchtime %02d cleared"), no); + } + } else { + if (strlen(value) > 1) { + no = (value[0] - '0') * 10 + (value[1] - '0'); + } + if (strlen(value) == 2) { + if (no < 42) { + EMSESP::wait_validate(type_id); + read_command(type_id, 2 * no, 2); + return true; + } + return false; + } + if (strlen(value) > 4) { + for (uint8_t i = 0; i < 7; i++) { + if (!strncmp(&value[3], read_flash_string(FL_(enum_dayOfWeek)[i]).c_str(), 2)) { + day = i; + } + } + } + if (strlen(value) > 10) { + time = 6 * ((value[6] - '0') * 10 + (value[7] - '0')) + (value[9] - '0'); + } + if (strlen(value) > 13 && value[12] == 'o') { + on = value[13] == 'n' ? 1 : 0; + } else if (strlen(value) == 13) { + on = value[12] - '0'; + } + if (strlen(value) >= 10 && strncmp(&value[3], "not_set", 7) == 0) { + day = 7; + on = 7; + time = 0x90; + // LOG_INFO(F("switchtime %02d cleared"), no); + } } - // write dataset - if (strlen(value) != 12) { - LOG_WARNING(F("Setting switchtime: Invalid data")); - return false; - } - uint8_t no = (value[0] - '0') * 10 + (value[1] - '0'); - uint8_t day = value[3] - '0'; - uint8_t on = value[5] - '0'; - uint8_t time = 6 * ((value[7] - '0') * 10 + (value[8] - '0')) + (value[10] - '0'); uint8_t data[2] = {0xE7, 0x90}; // unset switchtime - if (day != 7 && on != 7) { data[0] = (day << 5) + on; data[1] = time; } - if (no > 41 || day > 7 || (on > 1 && on != 7) || time > 0x90) { - LOG_WARNING(F("Setting switchtime: Invalid data")); + if (no > 41 || time > 0x90 || (on > 1 && on != 7)) { + LOG_WARNING(F("Setting switchtime: Invalid data: %s"), value); + // LOG_WARNING(F("Setting switchtime: Invalid data: %02d.%1d.0x%02X.%1d"), no, day, time, on); return false; } - - if ((model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N)) { - write_command(timer_typeids[hc->hc_num() - 1] + prog, no * 2, (uint8_t *)&data, 2, timer_typeids[hc->hc_num() - 1]); + if (data[0] != 0xE7) { + std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); } else { - LOG_WARNING(F("Setting switchtime: thermostat not supported")); - return false; - } - if (data[0] == 0xE7) { - LOG_INFO(F("Setting switchtime no %d for heating circuit %d undefined"), no, hc->hc_num()); - } else { - LOG_INFO(F("Setting switchtime no %d for heating circuit %d to day %d, %s, %02d:%d0"), no, hc->hc_num(), day, (on == 1) ? "on" : "off", time / 6, time % 6); + snprintf(out, len, "%02d not_set", no); } + write_command(type_id, no * 2, &data[0], 2, 0); return true; } +// set switchtime for own1 program +bool Thermostat::set_switchtime1(const char * value, const int8_t id) { + uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; + std::shared_ptr hc = heating_circuit(hc_num); + if (hc == nullptr) { + return false; + } + char out[sizeof(hc->switchtime1)] = {'\0'}; + + if (set_switchtime(value, timer_typeids[hc->hc()], out, sizeof(out))) { + if (strlen(out)) { + has_update(hc->switchtime1, out, sizeof(hc->switchtime1)); + } + return true; + } + return false; +} + +// set switchtime for own2 program +bool Thermostat::set_switchtime2(const char * value, const int8_t id) { + uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; + std::shared_ptr hc = heating_circuit(hc_num); + if (hc == nullptr) { + return false; + } + char out[sizeof(hc->switchtime2)] = {'\0'}; + + if (set_switchtime(value, timer_typeids[hc->hc()] + 3, out, sizeof(out))) { + if (strlen(out)) { + has_update(hc->switchtime2, out, sizeof(hc->switchtime2)); + } + return true; + } + return false; +} +// sets a single switchtime in the thermostat dhw program for RC35 +bool Thermostat::set_wwCircSwitchTime(const char * value, const int8_t id) { + char out[sizeof(wwCircSwitchTime_)] = {'\0'}; + + if (set_switchtime(value, 0x39, out, sizeof(out))) { + if (strlen(out)) { + has_update(wwCircSwitchTime_, out, sizeof(wwCircSwitchTime_)); + } + return true; + } + return false; +} + +// sets a single switchtime in the thermostat circulation program for RC35 +bool Thermostat::set_wwSwitchTime(const char * value, const int8_t id) { + char out[sizeof(wwSwitchTime_)] = {'\0'}; + + if (set_switchtime(value, 0x38, out, sizeof(out))) { + if (strlen(out)) { + has_update(wwSwitchTime_, out, sizeof(wwSwitchTime_)); + } + return true; + } + return false; +} + // sets the thermostat program for RC35 and RC20 bool Thermostat::set_program(const char * value, const int8_t id) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Setting program: Heating Circuit %d not found or activated"), hc_num); return false; } uint8_t set = 0xFF; - if (model() == EMS_DEVICE_FLAG_RC20_N) { + if ((model() == EMS_DEVICE_FLAG_RC20_N) || (model() == EMS_DEVICE_FLAG_RC25)) { if (Helpers::value2enum(value, set, FL_(enum_progMode3))) { - write_command(set_typeids[hc->hc_num() - 1], 11, set + 1, set_typeids[hc->hc_num() - 1]); + write_command(set_typeids[hc->hc()], 11, set + 1, set_typeids[hc->hc()]); } } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { if (Helpers::value2enum(value, set, FL_(enum_progMode2))) { - write_command(timer_typeids[hc->hc_num() - 1], 84, set, timer_typeids[hc->hc_num() - 1]); + write_command(timer_typeids[hc->hc()], 84, set, timer_typeids[hc->hc()]); } } else if (model() == EMS_DEVICE_FLAG_RC300 || model() == EMS_DEVICE_FLAG_RC100) { if (Helpers::value2enum(value, set, FL_(enum_progMode))) { - write_command(set_typeids[hc->hc_num() - 1], 11, set + 1, set_typeids[hc->hc_num() - 1]); + write_command(set_typeids[hc->hc()], 11, set + 1, set_typeids[hc->hc()]); } } else if (model() == EMS_DEVICE_FLAG_JUNKERS) { if (Helpers::value2enum(value, set, FL_(enum_progMode4))) { if (has_flags(EMS_DEVICE_FLAG_JUNKERS_OLD)) { - write_command(set_typeids[hc->hc_num() - 1], 10, set + 1, set_typeids[hc->hc_num() - 1]); + write_command(set_typeids[hc->hc()], 10, set + 1, set_typeids[hc->hc()]); } else { - write_command(set_typeids[hc->hc_num() - 1], 13, set + 1, set_typeids[hc->hc_num() - 1]); + write_command(set_typeids[hc->hc()], 13, set + 1, set_typeids[hc->hc()]); } } } if (set == 0xFF) { - LOG_WARNING(F("Setting program: Invalid number")); return false; } - LOG_INFO(F("Setting program to %d for heating circuit %d"), set, hc->hc_num()); + return true; } @@ -2210,15 +2401,14 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co // get hc based on number std::shared_ptr hc = heating_circuit(hc_num); if (hc == nullptr) { - LOG_WARNING(F("Set temperature: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, device_id()); return false; } uint8_t model = this->model(); int8_t offset = -1; // we use -1 to check if there is a value uint8_t factor = 2; // some temperatures only use 1 - uint16_t validate_typeid = monitor_typeids[hc->hc_num() - 1]; - uint16_t set_typeid = set_typeids[hc->hc_num() - 1]; + uint16_t validate_typeid = monitor_typeids[hc->hc()]; + uint16_t set_typeid = set_typeids[hc->hc()]; if (model == EMS_DEVICE_FLAG_RC10) { switch (mode) { @@ -2237,21 +2427,25 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co break; } } else if (model == EMS_DEVICE_FLAG_RC20) { - offset = EMS_OFFSET_RC20Set_temp; + if (mode == HeatingCircuit::Mode::MANUAL) { + offset = EMS_OFFSET_RC20Set_temp_manual; + } else { + offset = EMS_OFFSET_RC20Set_temp_auto; + } } else if (model == EMS_DEVICE_FLAG_RC30) { offset = EMS_OFFSET_RC30Set_temp; } else if ((model == EMS_DEVICE_FLAG_RC300) || (model == EMS_DEVICE_FLAG_RC100)) { - validate_typeid = set_typeids[hc->hc_num() - 1]; + validate_typeid = set_typeids[hc->hc()]; switch (mode) { case HeatingCircuit::Mode::SUMMER: - if (is_fetch(summer2_typeids[hc->hc_num() - 1])) { + if (is_fetch(summer2_typeids[hc->hc()])) { offset = 0x01; - set_typeid = summer2_typeids[hc->hc_num() - 1]; + set_typeid = summer2_typeids[hc->hc()]; } else { offset = 0x06; - set_typeid = summer_typeids[hc->hc_num() - 1]; + set_typeid = summer_typeids[hc->hc()]; } validate_typeid = set_typeid; factor = 1; @@ -2262,7 +2456,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co case HeatingCircuit::Mode::TEMPAUTO: offset = 0x08; // manual offset if (temperature == -1) { - factor = 0xFF; // use factor as value + factor = 1; // to write 0xFF } break; case HeatingCircuit::Mode::COMFORT: @@ -2273,12 +2467,12 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co break; case HeatingCircuit::Mode::OFFSET: offset = 2; - set_typeid = summer_typeids[hc->hc_num() - 1]; + set_typeid = summer_typeids[hc->hc()]; validate_typeid = set_typeid; factor = 1; break; case HeatingCircuit::Mode::DESIGN: - set_typeid = summer_typeids[hc->hc_num() - 1]; + set_typeid = summer_typeids[hc->hc()]; validate_typeid = set_typeid; if (hc->heatingtype == 3) { offset = 5; @@ -2288,13 +2482,13 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co factor = 1; break; case HeatingCircuit::Mode::MINFLOW: - set_typeid = summer_typeids[hc->hc_num() - 1]; + set_typeid = summer_typeids[hc->hc()]; validate_typeid = set_typeid; offset = 8; factor = 1; break; case HeatingCircuit::Mode::MAXFLOW: - set_typeid = curve_typeids[hc->hc_num() - 1]; + set_typeid = curve_typeids[hc->hc()]; validate_typeid = set_typeid; if (hc->heatingtype == 3) { offset = 7; @@ -2304,13 +2498,13 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co factor = 1; break; case HeatingCircuit::Mode::NOFROST: - set_typeid = curve_typeids[hc->hc_num() - 1]; + set_typeid = curve_typeids[hc->hc()]; validate_typeid = set_typeid; offset = 6; factor = 1; break; case HeatingCircuit::Mode::ROOMINFLUENCE: - set_typeid = summer_typeids[hc->hc_num() - 1]; + set_typeid = summer_typeids[hc->hc()]; validate_typeid = set_typeid; offset = 0; factor = 1; @@ -2324,14 +2518,14 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = 0x08; // auto offset // special case to reactivate auto temperature, see #737, #746 if (temperature == -1) { - factor = 0xFF; // use factor as value + factor = 1; } } - validate_typeid = monitor_typeids[hc->hc_num() - 1]; // get setpoint roomtemp back + validate_typeid = monitor_typeids[hc->hc()]; // get setpoint roomtemp back break; } - } else if (model == EMS_DEVICE_FLAG_RC20_N) { + } else if ((model == EMS_DEVICE_FLAG_RC20_N) || (model == EMS_DEVICE_FLAG_RC25)) { switch (mode) { case HeatingCircuit::Mode::MINFLOW: offset = 15; @@ -2356,13 +2550,19 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co break; default: case HeatingCircuit::Mode::AUTO: // automatic selection, if no type is defined, we use the standard code - uint8_t modetype = hc->get_mode_type(); - offset = (modetype == HeatingCircuit::Mode::NIGHT) ? EMS_OFFSET_RC20_2_Set_temp_night : EMS_OFFSET_RC20_2_Set_temp_day; + uint8_t mode_ = hc->get_mode(); + if (mode_ == HeatingCircuit::Mode::NIGHT) { + offset = EMS_OFFSET_RC20_2_Set_temp_night; + } else if (mode_ == HeatingCircuit::Mode::DAY) { + offset = EMS_OFFSET_RC20_2_Set_temp_day; + } else { + offset = 13; // tempautotemp + } break; } } else if ((model == EMS_DEVICE_FLAG_RC35) || (model == EMS_DEVICE_FLAG_RC30_N)) { - validate_typeid = set_typeids[hc->hc_num() - 1]; + validate_typeid = set_typeids[hc->hc()]; switch (mode) { case HeatingCircuit::Mode::NIGHT: // change the night temp offset = EMS_OFFSET_RC35Set_temp_night; @@ -2420,8 +2620,8 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co factor = 1; break; default: - case HeatingCircuit::Mode::AUTO: // automatic selection, if no type is defined, we use the standard code - validate_typeid = monitor_typeids[hc->hc_num() - 1]; //get setpoint roomtemp back + case HeatingCircuit::Mode::AUTO: // automatic selection, if no type is defined, we use the standard code + validate_typeid = monitor_typeids[hc->hc()]; //get setpoint roomtemp back if (model == EMS_DEVICE_FLAG_RC35) { uint8_t mode_ = hc->get_mode(); if (mode_ == HeatingCircuit::Mode::NIGHT) { @@ -2499,33 +2699,21 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co // if we know what to send and to where, go and do it if (offset != -1) { - char s[10]; - LOG_INFO(F("Setting thermostat temperature to %s for heating circuit %d, mode %s"), - Helpers::render_value(s, temperature, 2), - hc->hc_num(), - mode_tostring(mode).c_str()); - // add the write command to the Tx queue. value is *2 // post validate is the corresponding monitor or set type IDs as they can differ per model - if (factor == 0xFF) { - write_command(set_typeid, offset, factor, validate_typeid); - } else { - write_command(set_typeid, offset, (uint8_t)((float)temperature * (float)factor), validate_typeid); - } + write_command(set_typeid, offset, (uint8_t)((float)temperature * (float)factor), validate_typeid); return true; } - LOG_WARNING(F("Set temperature: Invalid value")); return false; } -bool Thermostat::set_temperature_value(const char * value, const int8_t id, const uint8_t mode) { +bool Thermostat::set_temperature_value(const char * value, const int8_t id, const uint8_t mode, bool relative) { float f = 0; uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; - if (Helpers::value2float(value, f)) { + if (Helpers::value2temperature(value, f, relative)) { return set_temperature(f, mode, hc_num); } else { - LOG_WARNING(F("Set temperature: Invalid value")); return false; } } @@ -2587,7 +2775,7 @@ bool Thermostat::set_noreducetemp(const char * value, const int8_t id) { } bool Thermostat::set_flowtempoffset(const char * value, const int8_t id) { - return set_temperature_value(value, id, HeatingCircuit::Mode::FLOWOFFSET); + return set_temperature_value(value, id, HeatingCircuit::Mode::FLOWOFFSET, true); } bool Thermostat::set_maxflowtemp(const char * value, const int8_t id) { @@ -2599,63 +2787,97 @@ bool Thermostat::set_minflowtemp(const char * value, const int8_t id) { } bool Thermostat::set_roominfluence(const char * value, const int8_t id) { - return set_temperature_value(value, id, HeatingCircuit::Mode::ROOMINFLUENCE); + return set_temperature_value(value, id, HeatingCircuit::Mode::ROOMINFLUENCE, true); } // register main device values, top level for all thermostats (excluding heating circuits) // as these are done in void Thermostat::register_device_values_hc() void Thermostat::register_device_values() { // Common for all thermostats - register_device_value(TAG_THERMOSTAT_DATA, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); - register_device_value(TAG_THERMOSTAT_DATA, &errorCode_, DeviceValueType::STRING, nullptr, FL_(errorCode), DeviceValueUOM::NONE); - register_device_value(TAG_THERMOSTAT_DATA, &lastCode_, DeviceValueType::STRING, nullptr, FL_(lastCode), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &errorCode_, DeviceValueType::STRING, nullptr, FL_(errorCode), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &lastCode_, DeviceValueType::STRING, nullptr, FL_(lastCode), DeviceValueUOM::NONE); switch (this->model()) { case EMS_DEVICE_FLAG_RC100: case EMS_DEVICE_FLAG_RC300: - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_datetime)); - register_device_value(TAG_THERMOSTAT_DATA, &floordrystatus_, DeviceValueType::ENUM, FL_(enum_floordrystatus), FL_(floordrystatus), DeviceValueUOM::NONE); - register_device_value(TAG_THERMOSTAT_DATA, &dampedoutdoortemp2_, DeviceValueType::SHORT, FL_(div10), FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_THERMOSTAT_DATA, &floordrytemp_, DeviceValueType::UINT, nullptr, FL_(floordrytemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &dateTime_, + DeviceValueType::STRING, + FL_(tpl_datetime), + FL_(dateTime), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_datetime)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &floordrystatus_, + DeviceValueType::ENUM, + FL_(enum_floordrystatus), + FL_(floordrystatus), + DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &dampedoutdoortemp2_, + DeviceValueType::SHORT, + FL_(div10), + FL_(dampedoutdoortemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &floordrytemp_, DeviceValueType::UINT, nullptr, FL_(floordrytemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaBuildingType_, DeviceValueType::ENUM, FL_(enum_ibaBuildingType), FL_(ibaBuildingType), DeviceValueUOM::NONE, MAKE_CF_CB(set_building)); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, nullptr, FL_(ibaMinExtTemperature), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minexttemp)); - register_device_value(TAG_DEVICE_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemp)); - register_device_value(TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value( - TAG_DEVICE_DATA_WW, &wwSetTempLow_, DeviceValueType::UINT, nullptr, FL_(wwSetTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemplow)); + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemp)); register_device_value( - TAG_DEVICE_DATA_WW, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcircmode)); - register_device_value(TAG_DEVICE_DATA_WW, + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwSetTempLow_, + DeviceValueType::UINT, + nullptr, + FL_(wwSetTempLow), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwtemplow)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircMode_, + DeviceValueType::ENUM, + FL_(enum_wwCircMode), + FL_(wwCircMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwcircmode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwChargeDuration_, DeviceValueType::UINT, FL_(mul15), FL_(wwChargeDuration), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_wwchargeduration)); - register_device_value(TAG_DEVICE_DATA_WW, &wwCharge_, DeviceValueType::BOOL, nullptr, FL_(wwCharge), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcharge)); - register_device_value(TAG_DEVICE_DATA_WW, &wwExtra1_, DeviceValueType::UINT, nullptr, FL_(wwExtra1), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwExtra2_, DeviceValueType::UINT, nullptr, FL_(wwExtra2), DeviceValueUOM::DEGREES); - register_device_value(TAG_DEVICE_DATA_WW, &wwDisinfect_, DeviceValueType::BOOL, nullptr, FL_(wwDisinfect), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfect)); - register_device_value(TAG_DEVICE_DATA_WW, + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCharge_, DeviceValueType::BOOL, nullptr, FL_(wwCharge), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcharge)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwExtra1_, DeviceValueType::UINT, nullptr, FL_(wwExtra1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwExtra2_, DeviceValueType::UINT, nullptr, FL_(wwExtra2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfecting_, + DeviceValueType::BOOL, + nullptr, + FL_(wwDisinfecting), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfect)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectDay_, DeviceValueType::ENUM, FL_(enum_dayOfWeek), FL_(wwDisinfectDay), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectDay)); - register_device_value(TAG_DEVICE_DATA_WW, + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectHour_, DeviceValueType::UINT, FL_(mul15), @@ -2666,21 +2888,29 @@ void Thermostat::register_device_values() { 1431); break; case EMS_DEVICE_FLAG_RC10: - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaCalIntTemperature_, DeviceValueType::INT, FL_(div10), FL_(ibaCalIntTemperature), - DeviceValueUOM::DEGREES, + DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &heatingpid_, + DeviceValueType::ENUM, + FL_(enum_PID), + FL_(heatingPID), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_heatingpid)); register_device_value( - TAG_THERMOSTAT_DATA, &heatingpid_, DeviceValueType::ENUM, FL_(enum_PID), FL_(heatingPID), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingpid)); - register_device_value(TAG_THERMOSTAT_DATA, &backlight_, DeviceValueType::BOOL, nullptr, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); - register_device_value(TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode3), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + DeviceValueTAG::TAG_THERMOSTAT_DATA, &backlight_, DeviceValueType::BOOL, nullptr, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode3), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); break; case EMS_DEVICE_FLAG_RC20_N: - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime - register_device_value(TAG_THERMOSTAT_DATA, + case EMS_DEVICE_FLAG_RC25: + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, nullptr, @@ -2689,13 +2919,23 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_minexttemp)); break; case EMS_DEVICE_FLAG_RC20: - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime break; case EMS_DEVICE_FLAG_RC30: - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime - register_device_value(TAG_THERMOSTAT_DATA, &ibaMainDisplay_, DeviceValueType::ENUM, FL_(enum_ibaMainDisplay), FL_(ibaMainDisplay), DeviceValueUOM::NONE); - register_device_value(TAG_THERMOSTAT_DATA, &ibaLanguage_, DeviceValueType::ENUM, FL_(enum_ibaLanguage), FL_(ibaLanguage), DeviceValueUOM::NONE); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &ibaMainDisplay_, + DeviceValueType::ENUM, + FL_(enum_ibaMainDisplay), + FL_(ibaMainDisplay), + DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &ibaLanguage_, + DeviceValueType::ENUM, + FL_(enum_ibaLanguage), + FL_(ibaLanguage), + DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaClockOffset_, DeviceValueType::INT, nullptr, @@ -2703,130 +2943,247 @@ void Thermostat::register_device_values() { DeviceValueUOM::SECONDS); // offset (in sec) to clock, 0xff=-1s, 0x02=2s break; case EMS_DEVICE_FLAG_RC30_N: - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime - register_device_value(TAG_THERMOSTAT_DATA, &ibaMainDisplay_, DeviceValueType::ENUM, FL_(enum_ibaMainDisplay), FL_(ibaMainDisplay), DeviceValueUOM::NONE); - register_device_value(TAG_THERMOSTAT_DATA, &ibaLanguage_, DeviceValueType::ENUM, FL_(enum_ibaLanguage), FL_(ibaLanguage), DeviceValueUOM::NONE); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &ibaMainDisplay_, + DeviceValueType::ENUM, + FL_(enum_ibaMainDisplay), + FL_(ibaMainDisplay), + DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &ibaLanguage_, + DeviceValueType::ENUM, + FL_(enum_ibaLanguage), + FL_(ibaLanguage), + DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaClockOffset_, DeviceValueType::INT, nullptr, FL_(ibaClockOffset), DeviceValueUOM::SECONDS); // offset (in sec) to clock, 0xff=-1s, 0x02=2s - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaCalIntTemperature_, DeviceValueType::INT, FL_(div10), FL_(ibaCalIntTemperature), - DeviceValueUOM::DEGREES, + DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp)); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, nullptr, FL_(ibaMinExtTemperature), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minexttemp)); - register_device_value(TAG_THERMOSTAT_DATA, &dampedoutdoortemp_, DeviceValueType::INT, nullptr, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dampedoutdoortemp_, DeviceValueType::INT, nullptr, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaBuildingType_, DeviceValueType::ENUM, FL_(enum_ibaBuildingType), FL_(ibaBuildingType), DeviceValueUOM::NONE, MAKE_CF_CB(set_building)); - register_device_value(TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value( - TAG_DEVICE_DATA_WW, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcircmode)); - register_device_value( - TAG_DEVICE_DATA_WW, &wwProgMode_, DeviceValueType::ENUM, FL_(enum_wwProgMode), FL_(wwProgMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwProgMode)); - register_device_value( - TAG_DEVICE_DATA_WW, &wwCircProg_, DeviceValueType::ENUM, FL_(enum_wwProgMode), FL_(wwCircProg), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircProg)); - register_device_value(TAG_DEVICE_DATA_WW, &wwDisinfect_, DeviceValueType::BOOL, nullptr, FL_(wwDisinfect), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfect)); - register_device_value(TAG_DEVICE_DATA_WW, + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircMode_, + DeviceValueType::ENUM, + FL_(enum_wwMode2), + FL_(wwCircMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwcircmode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwProgMode_, + DeviceValueType::ENUM, + FL_(enum_wwProgMode), + FL_(wwProgMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwProgMode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircProg_, + DeviceValueType::ENUM, + FL_(enum_wwProgMode), + FL_(wwCircProg), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwCircProg)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfecting_, + DeviceValueType::BOOL, + nullptr, + FL_(wwDisinfecting), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfect)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectDay_, DeviceValueType::ENUM, FL_(enum_dayOfWeek), FL_(wwDisinfectDay), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectDay)); - register_device_value(TAG_DEVICE_DATA_WW, + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectHour_, DeviceValueType::UINT, nullptr, FL_(wwDisinfectHour), - DeviceValueUOM::OCLOCK, + DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectHour), 0, 23); - register_device_value(TAG_DEVICE_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, nullptr, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); - register_device_value( - TAG_DEVICE_DATA_WW, &wwOneTimeKey_, DeviceValueType::BOOL, nullptr, FL_(wwOneTimeKey), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwOneTimeKey)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwMaxTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwMaxTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwMaxTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwOneTimeKey_, + DeviceValueType::BOOL, + nullptr, + FL_(wwOneTimeKey), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwOneTimeKey)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwSwitchTime_, + DeviceValueType::STRING, + FL_(tpl_switchtime), + FL_(wwswitchtime), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwSwitchTime)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircSwitchTime_, + DeviceValueType::STRING, + FL_(tpl_switchtime), + FL_(wwcircswitchtime), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwCircSwitchTime)); break; case EMS_DEVICE_FLAG_RC35: - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_datetime)); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &dateTime_, + DeviceValueType::STRING, + FL_(tpl_datetime), + FL_(dateTime), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_datetime)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaCalIntTemperature_, DeviceValueType::INT, FL_(div10), FL_(ibaCalIntTemperature), - DeviceValueUOM::DEGREES, + DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp)); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, nullptr, FL_(ibaMinExtTemperature), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minexttemp)); - register_device_value(TAG_THERMOSTAT_DATA, &tempsensor1_, DeviceValueType::USHORT, FL_(div10), FL_(tempsensor1), DeviceValueUOM::DEGREES); - register_device_value(TAG_THERMOSTAT_DATA, &tempsensor2_, DeviceValueType::USHORT, FL_(div10), FL_(tempsensor2), DeviceValueUOM::DEGREES); - register_device_value(TAG_THERMOSTAT_DATA, &ibaDamping_, DeviceValueType::BOOL, nullptr, FL_(damping), DeviceValueUOM::NONE, MAKE_CF_CB(set_damping)); - register_device_value(TAG_THERMOSTAT_DATA, &dampedoutdoortemp_, DeviceValueType::INT, nullptr, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); - register_device_value(TAG_THERMOSTAT_DATA, + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &tempsensor1_, DeviceValueType::USHORT, FL_(div10), FL_(tempsensor1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &tempsensor2_, DeviceValueType::USHORT, FL_(div10), FL_(tempsensor2), DeviceValueUOM::DEGREES); + register_device_value( + DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaDamping_, DeviceValueType::BOOL, nullptr, FL_(damping), DeviceValueUOM::NONE, MAKE_CF_CB(set_damping)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dampedoutdoortemp_, DeviceValueType::INT, nullptr, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaBuildingType_, DeviceValueType::ENUM, FL_(enum_ibaBuildingType), FL_(ibaBuildingType), DeviceValueUOM::NONE, MAKE_CF_CB(set_building)); - register_device_value(TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value( - TAG_DEVICE_DATA_WW, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcircmode)); - register_device_value( - TAG_DEVICE_DATA_WW, &wwProgMode_, DeviceValueType::ENUM, FL_(enum_wwProgMode), FL_(wwProgMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwProgMode)); - register_device_value( - TAG_DEVICE_DATA_WW, &wwCircProg_, DeviceValueType::ENUM, FL_(enum_wwProgMode), FL_(wwCircProg), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircProg)); - register_device_value(TAG_DEVICE_DATA_WW, &wwDisinfect_, DeviceValueType::BOOL, nullptr, FL_(wwDisinfect), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfect)); - register_device_value(TAG_DEVICE_DATA_WW, + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircMode_, + DeviceValueType::ENUM, + FL_(enum_wwMode2), + FL_(wwCircMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwcircmode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwProgMode_, + DeviceValueType::ENUM, + FL_(enum_wwProgMode), + FL_(wwProgMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwProgMode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircProg_, + DeviceValueType::ENUM, + FL_(enum_wwProgMode), + FL_(wwCircProg), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwCircProg)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfecting_, + DeviceValueType::BOOL, + nullptr, + FL_(wwDisinfecting), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfect)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectDay_, DeviceValueType::ENUM, FL_(enum_dayOfWeek), FL_(wwDisinfectDay), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectDay)); - register_device_value(TAG_DEVICE_DATA_WW, + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectHour_, DeviceValueType::UINT, nullptr, FL_(wwDisinfectHour), - DeviceValueUOM::OCLOCK, + DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectHour), 0, 23); - register_device_value(TAG_DEVICE_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, nullptr, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); - register_device_value( - TAG_DEVICE_DATA_WW, &wwOneTimeKey_, DeviceValueType::BOOL, nullptr, FL_(wwOneTimeKey), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwOneTimeKey)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwMaxTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwMaxTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwMaxTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwOneTimeKey_, + DeviceValueType::BOOL, + nullptr, + FL_(wwOneTimeKey), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwOneTimeKey)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwSwitchTime_, + DeviceValueType::STRING, + FL_(tpl_switchtime), + FL_(wwswitchtime), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwSwitchTime)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircSwitchTime_, + DeviceValueType::STRING, + FL_(tpl_switchtime), + FL_(wwcircswitchtime), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwCircSwitchTime)); break; case EMS_DEVICE_FLAG_JUNKERS: - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_datetime)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &dateTime_, + DeviceValueType::STRING, + FL_(tpl_datetime), + FL_(dateTime), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_datetime)); break; case EMS_DEVICE_FLAG_EASY: // Easy TC100 have no date/time, see issue #100, not sure about CT200, so leave it. - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime break; case EMS_DEVICE_FLAG_CRF: default: - register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime break; } } @@ -2836,64 +3193,33 @@ void Thermostat::register_device_values_hc(std::shared_ptrget_model(); // heating circuit - uint8_t tag = TAG_HC1 + hc->hc_num() - 1; + uint8_t tag = DeviceValueTAG::TAG_HC1 + hc->hc(); // different logic on how temperature values are stored, depending on model - const __FlashStringHelper * const * setpoint_temp_divider; - const __FlashStringHelper * const * curr_temp_divider; + const __FlashStringHelper * const * seltemp_divider; + const __FlashStringHelper * const * roomtemp_divider; if (model == EMS_DEVICE_FLAG_EASY) { - setpoint_temp_divider = FL_(div100); - curr_temp_divider = FL_(div100); + seltemp_divider = FL_(div100); + roomtemp_divider = FL_(div100); } else if (model == EMS_DEVICE_FLAG_JUNKERS) { - setpoint_temp_divider = FL_(div10); - curr_temp_divider = FL_(div10); + seltemp_divider = FL_(div10); + roomtemp_divider = FL_(div10); } else { - setpoint_temp_divider = FL_(div2); - curr_temp_divider = FL_(div10); + seltemp_divider = FL_(div2); + roomtemp_divider = FL_(div10); } if (has_flags(EMS_DEVICE_FLAG_NO_WRITE) || device_id() != EMSESP::actual_master_thermostat()) { - register_device_value(tag, &hc->setpoint_roomTemp, DeviceValueType::SHORT, setpoint_temp_divider, FL_(setpoint_roomTemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->selTemp, DeviceValueType::SHORT, seltemp_divider, FL_(selRoomTemp), DeviceValueUOM::DEGREES); } else { - register_device_value(tag, - &hc->setpoint_roomTemp, - DeviceValueType::SHORT, - setpoint_temp_divider, - FL_(setpoint_roomTemp), - DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_temp), - 5, - 29); - - // we add an extra key called "temp" which is identical to "seltemp". This is just for prettyness in the payload and makes it easier for consumers to understand - register_device_value( - tag, &hc->setpoint_roomTemp, DeviceValueType::SHORT, setpoint_temp_divider, FL_(temp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_temp), 5, 29); + register_device_value(tag, &hc->selTemp, DeviceValueType::SHORT, seltemp_divider, FL_(selRoomTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_temp), 5, 29); } - register_device_value(tag, &hc->curr_roomTemp, DeviceValueType::SHORT, curr_temp_divider, FL_(curr_roomTemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->roomTemp, DeviceValueType::SHORT, roomtemp_divider, FL_(roomTemp), DeviceValueUOM::DEGREES); if (device_id() != EMSESP::actual_master_thermostat()) { return; } - // special handling for Home Assistant - // we create special values called hatemp and hamode, which have empty fullnames so not shown in the web or console - if (Mqtt::ha_enabled()) { - uint8_t option = Mqtt::ha_climate_format(); - if (option == Mqtt::HA_Climate_Format::CURRENT) { - register_device_value(tag, &hc->curr_roomTemp, DeviceValueType::SHORT, curr_temp_divider, FL_(hatemp), DeviceValueUOM::NONE); - } else if (option == Mqtt::HA_Climate_Format::SETPOINT) { - register_device_value(tag, &hc->setpoint_roomTemp, DeviceValueType::SHORT, setpoint_temp_divider, FL_(hatemp), DeviceValueUOM::NONE); - } else if (option == Mqtt::HA_Climate_Format::ZERO) { - register_device_value(tag, &zero_value_, DeviceValueType::UINT, nullptr, FL_(hatemp), DeviceValueUOM::NONE); - } - - // if we're sending to HA the only valid mode types are heat, auto and off - // manual & day = heat - // night & off = off - // everything else auto - register_device_value(tag, &hc->hamode, DeviceValueType::ENUM, FL_(enum_hamode), FL_(hamode), DeviceValueUOM::NONE); - } - switch (model) { case EMS_DEVICE_FLAG_RC10: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode6), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); @@ -2911,21 +3237,23 @@ void Thermostat::register_device_values_hc(std::shared_ptrdaytemp, DeviceValueType::UINT, FL_(div2), FL_(comforttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_comforttemp)); register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp)); register_device_value(tag, &hc->designtemp, DeviceValueType::UINT, nullptr, FL_(designtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_designtemp)); - register_device_value(tag, &hc->offsettemp, DeviceValueType::INT, nullptr, FL_(offsettemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_offsettemp)); + register_device_value(tag, &hc->offsettemp, DeviceValueType::INT, nullptr, FL_(offsettemp), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_offsettemp)); register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); - register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, nullptr, FL_(roominfluence), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_roominfluence)); - register_device_value(tag, &hc->curroominfl, DeviceValueType::SHORT, FL_(div10), FL_(curroominfl), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, nullptr, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence)); + register_device_value(tag, &hc->curroominfl, DeviceValueType::SHORT, FL_(div10), FL_(curroominfl), DeviceValueUOM::DEGREES_R); register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, nullptr, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, nullptr, FL_(targetflowtemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE); + register_device_value( + tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value( tag, &hc->summer_setmode, DeviceValueType::ENUM, FL_(enum_summermode), FL_(summersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); register_device_value(tag, &hc->summermode, DeviceValueType::BOOL, nullptr, FL_(summermode), DeviceValueUOM::NONE); register_device_value( tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); - register_device_value(tag, &hc->tempautotemp, DeviceValueType::UINT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp)); + register_device_value( + tag, &hc->tempautotemp, DeviceValueType::UINT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp), 5, 30); register_device_value(tag, &hc->fastHeatup, DeviceValueType::UINT, nullptr, FL_(fastheatup), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_fastheatup)); break; case EMS_DEVICE_FLAG_CRF: @@ -2938,18 +3266,31 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); - register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype2), FL_(modetype), DeviceValueUOM::NONE); + register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype3), FL_(modetype), DeviceValueUOM::NONE); register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode3), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); - // RC25 additions, guess, not validated by users, see:https://github.com/emsesp/EMS-ESP32/issues/106 register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); register_device_value(tag, &hc->tempautotemp, DeviceValueType::UINT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp)); register_device_value( tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp)); - register_device_value(tag, &hc->summermode, DeviceValueType::BOOL, nullptr, FL_(summermode), DeviceValueUOM::NONE); + register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); + break; + case EMS_DEVICE_FLAG_RC25: + register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); + register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype3), FL_(modetype), DeviceValueUOM::NONE); + register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); + register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode3), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); + register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); + register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); + register_device_value(tag, &hc->tempautotemp, DeviceValueType::UINT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp)); + register_device_value( + tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); + register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp)); + register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); break; case EMS_DEVICE_FLAG_RC30: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); @@ -2961,25 +3302,26 @@ void Thermostat::register_device_values_hc(std::shared_ptrdaytemp, DeviceValueType::UINT, FL_(div2), FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); register_device_value(tag, &hc->designtemp, DeviceValueType::UINT, nullptr, FL_(designtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_designtemp)); - register_device_value(tag, &hc->offsettemp, DeviceValueType::INT, FL_(div2), FL_(offsettemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_offsettemp)); + register_device_value(tag, &hc->offsettemp, DeviceValueType::INT, FL_(div2), FL_(offsettemp), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_offsettemp)); register_device_value(tag, &hc->holidaytemp, DeviceValueType::UINT, FL_(div2), FL_(holidaytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_holidaytemp)); register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, nullptr, FL_(targetflowtemp), DeviceValueUOM::DEGREES); register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp)); - register_device_value(tag, &hc->summermode, DeviceValueType::BOOL, nullptr, FL_(summermode), DeviceValueUOM::NONE); + register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); register_device_value(tag, &hc->holidaymode, DeviceValueType::BOOL, nullptr, FL_(holidaymode), DeviceValueUOM::NONE); register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, nullptr, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); - register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, nullptr, FL_(roominfluence), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_roominfluence)); + register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, nullptr, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence)); register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); - register_device_value(tag, &hc->flowtempoffset, DeviceValueType::UINT, nullptr, FL_(flowtempoffset), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowtempoffset)); + register_device_value( + tag, &hc->flowtempoffset, DeviceValueType::UINT, nullptr, FL_(flowtempoffset), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_flowtempoffset)); register_device_value( tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value(tag, &hc->reducemode, DeviceValueType::ENUM, FL_(enum_reducemode), FL_(reducemode), DeviceValueUOM::NONE, MAKE_CF_CB(set_reducemode)); register_device_value( tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode2), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_control), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); - register_device_value(tag, &hc->holiday, DeviceValueType::STRING, nullptr, FL_(holidays), DeviceValueUOM::NONE, MAKE_CF_CB(set_holiday)); - register_device_value(tag, &hc->vacation, DeviceValueType::STRING, nullptr, FL_(vacations), DeviceValueUOM::NONE, MAKE_CF_CB(set_vacation)); + register_device_value(tag, &hc->holiday, DeviceValueType::STRING, FL_(tpl_holidays), FL_(holidays), DeviceValueUOM::NONE, MAKE_CF_CB(set_holiday)); + register_device_value(tag, &hc->vacation, DeviceValueType::STRING, FL_(tpl_holidays), FL_(vacations), DeviceValueUOM::NONE, MAKE_CF_CB(set_vacation)); register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode2), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); register_device_value(tag, &hc->pause, DeviceValueType::UINT, nullptr, FL_(pause), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pause)); register_device_value(tag, &hc->party, DeviceValueType::UINT, nullptr, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party)); @@ -2987,7 +3329,10 @@ void Thermostat::register_device_values_hc(std::shared_ptrnoreducetemp, DeviceValueType::INT, nullptr, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp)); register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_remotetemp)); register_device_value(tag, &hc->wwprio, DeviceValueType::BOOL, nullptr, FL_(wwprio), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwprio)); - register_device_value(tag, &dummy_, DeviceValueType::CMD, nullptr, FL_(switchtime), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime)); + register_device_value( + tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime), FL_(switchtime1), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); + register_device_value( + tag, &hc->switchtime2, DeviceValueType::STRING, FL_(tpl_switchtime), FL_(switchtime2), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime2)); break; case EMS_DEVICE_FLAG_JUNKERS: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode4), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 9cba96ec4..9b38069b9 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -25,7 +25,7 @@ namespace emsesp { class Thermostat : public EMSdevice { public: - Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand); + Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); class HeatingCircuit { public: HeatingCircuit(const uint8_t hc_num, const uint8_t model) @@ -34,12 +34,11 @@ class Thermostat : public EMSdevice { } ~HeatingCircuit() = default; - int16_t setpoint_roomTemp; - int16_t curr_roomTemp; + int16_t selTemp; + int16_t roomTemp; int16_t remotetemp; // for readback uint8_t tempautotemp; uint8_t mode; - uint8_t hamode; // special mode for HA. See https://github.com/emsesp/EMS-ESP32/issues/66 uint8_t modetype; uint8_t summermode; uint8_t holidaymode; @@ -68,8 +67,11 @@ class Thermostat : public EMSdevice { int8_t noreducetemp; // signed -20°C to +10°C uint8_t wwprio; uint8_t fastHeatup; - char holiday[22]; - char vacation[22]; + char holiday[26]; + char vacation[26]; + char switchtime1[16]; + char switchtime2[16]; + // RC 10 uint8_t reducehours; // night reduce duration uint16_t reduceminutes; // remaining minutes to night->day @@ -78,13 +80,25 @@ class Thermostat : public EMSdevice { return hc_num_; } + uint8_t hc() const { + return hc_num_ - 1; + } + uint8_t get_model() const { return model_; } // determines if the heating circuit is actually present and has data bool is_active() { - return Helpers::hasValue(setpoint_roomTemp); + return Helpers::hasValue(selTemp); + } + + bool ha_climate_created() { + return ha_climate_created_; + } + + void ha_climate_created(bool ha_climate_created) { + ha_climate_created_ = ha_climate_created; } uint8_t get_mode() const; @@ -116,19 +130,18 @@ class Thermostat : public EMSdevice { }; // for sorting based on hc number - friend inline bool operator<(const std::shared_ptr & lhs, const std::shared_ptr & rhs) { - return (lhs->hc_num_ < rhs->hc_num_); + friend inline bool operator<(const std::shared_ptr & a, const std::shared_ptr & b) { + return (a->hc_num_ < b->hc_num_); } private: - uint8_t hc_num_; // heating circuit number 1..10 - uint8_t model_; // the model type + uint8_t hc_num_; // heating circuit number 1..10 + uint8_t model_; // the model type + bool ha_climate_created_; // if we need to create the HA climate control }; static std::string mode_tostring(uint8_t mode); - virtual bool publish_ha_device_config(); - private: static uuid::log::Logger logger_; @@ -144,18 +157,17 @@ class Thermostat : public EMSdevice { std::vector monitor_typeids; std::vector set_typeids; std::vector timer_typeids; + std::vector timer2_typeids; std::vector summer_typeids; std::vector summer2_typeids; std::vector curve_typeids; // standard for all thermostats - uint8_t id_; // product id char status_[20]; // online or offline char dateTime_[25]; // date and time stamp char errorCode_[15]; // code from 0xA2 as string i.e. "A22(816)" uint16_t errorNumber_; // used internally to build error code - char lastCode_[30]; // error log - uint8_t dummy_; // for commands with no output + char lastCode_[50]; // error log // Installation parameters uint8_t ibaMainDisplay_; // display on Thermostat: 0 int temp, 1 int setpoint, 2 ext temp, 3 burner temp, 4 ww temp, 5 functioning mode, 6 time, 7 data, 9 smoke temp @@ -184,13 +196,17 @@ class Thermostat : public EMSdevice { uint8_t wwSetTempLow_; uint8_t wwCharge_; uint8_t wwChargeDuration_; - uint8_t wwDisinfect_; + uint8_t wwDisinfecting_; uint8_t wwDisinfectDay_; uint8_t wwDisinfectHour_; uint8_t wwMaxTemp_; uint8_t wwOneTimeKey_; uint8_t wwProgMode_; uint8_t wwCircProg_; + char wwSwitchTime_[16]; + char wwCircSwitchTime_[16]; + uint8_t wwDailyHeating_; + uint8_t wwDailyHeatTime_; std::vector> heating_circuits_; // each thermostat can have multiple heating circuits @@ -208,7 +224,8 @@ class Thermostat : public EMSdevice { static constexpr uint8_t EMS_OFFSET_RC20StatusMessage_setpoint = 1; // setpoint temp static constexpr uint8_t EMS_OFFSET_RC20StatusMessage_curr = 2; // current temp static constexpr uint8_t EMS_OFFSET_RC20Set_mode = 23; // position of thermostat mode - static constexpr uint8_t EMS_OFFSET_RC20Set_temp = 28; // position of thermostat setpoint temperature + static constexpr uint8_t EMS_OFFSET_RC20Set_temp_auto = 28; // position of thermostat setpoint temperature + static constexpr uint8_t EMS_OFFSET_RC20Set_temp_manual = 29; // position of thermostat setpoint temperature static constexpr uint8_t EMS_OFFSET_RC20_2_Set_mode = 3; // ES72 - see https://github.com/emsesp/EMS-ESP/issues/334 static constexpr uint8_t EMS_OFFSET_RC20_2_Set_temp_night = 1; // ES72 @@ -280,6 +297,7 @@ class Thermostat : public EMSdevice { void register_device_values_hc(std::shared_ptr hc); bool thermostat_ha_cmd(const char * message, uint8_t hc_num); + void add_ha_climate(std::shared_ptr hc); void process_RCOutdoorTemp(std::shared_ptr telegram); void process_IBASettings(std::shared_ptr telegram); @@ -287,6 +305,7 @@ class Thermostat : public EMSdevice { void process_RCError(std::shared_ptr telegram); void process_RCErrorMessage(std::shared_ptr telegram); void process_RC35wwSettings(std::shared_ptr telegram); + void process_RC35wwTimer(std::shared_ptr telegram); void process_RC35Monitor(std::shared_ptr telegram); void process_RC35Set(std::shared_ptr telegram); void process_RC35Timer(std::shared_ptr telegram); @@ -316,12 +335,14 @@ class Thermostat : public EMSdevice { void process_JunkersSet(std::shared_ptr telegram); void process_JunkersSet2(std::shared_ptr telegram); void process_EasyMonitor(std::shared_ptr telegram); + void process_JunkersRemoteMonitor(std::shared_ptr telegram); // internal helper functions bool set_mode_n(const uint8_t mode, const uint8_t hc_num); - bool set_temperature_value(const char * value, const int8_t id, const uint8_t mode); + bool set_temperature_value(const char * value, const int8_t id, const uint8_t mode, bool relative = false); bool set_temperature(const float temperature, const uint8_t mode, const uint8_t hc_num); + bool set_switchtime(const char * value, const uint16_t type_id, char * out, size_t len); // set functions - these use the id/hc bool set_mode(const char * value, const int8_t id); @@ -354,7 +375,8 @@ class Thermostat : public EMSdevice { bool set_minflowtemp(const char * value, const int8_t id); bool set_maxflowtemp(const char * value, const int8_t id); bool set_reducemode(const char * value, const int8_t id); - bool set_switchtime(const char * value, const int8_t id); + bool set_switchtime1(const char * value, const int8_t id); + bool set_switchtime2(const char * value, const int8_t id); bool set_program(const char * value, const int8_t id); bool set_controlmode(const char * value, const int8_t id); bool set_wwprio(const char * value, const int8_t id); @@ -374,6 +396,10 @@ class Thermostat : public EMSdevice { bool set_wwOneTimeKey(const char * value, const int8_t id); bool set_wwProgMode(const char * value, const int8_t id); bool set_wwCircProg(const char * value, const int8_t id); + bool set_wwSwitchTime(const char * value, const int8_t id); + bool set_wwCircSwitchTime(const char * value, const int8_t id); + bool set_wwDailyHeating(const char * value, const int8_t id); + bool set_wwDailyHeatTime(const char * value, const int8_t id); bool set_datetime(const char * value, const int8_t id); bool set_minexttemp(const char * value, const int8_t id); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 60a3a2d87..26728ed92 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -21,118 +21,38 @@ namespace emsesp { -// mapping of UOM, to match order in DeviceValueUOM enum emsdevice.h -// must be an int of 4 bytes, 32bit aligned -static const __FlashStringHelper * DeviceValueUOM_s[] __attribute__((__aligned__(sizeof(uint32_t)))) PROGMEM = { +// returns number of visible device values (entries) for this device +// this includes commands since they can also be entities and visible in the web UI +uint8_t EMSdevice::count_entities() { + uint8_t count = 0; + for (auto & dv : devicevalues_) { + if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.hasValue()) { + count++; + } + } + return count; +} - F_(degrees), - F_(percent), - F_(lmin), - F_(kwh), - F_(wh), - F_(hours), - F_(minutes), - F_(ua), - F_(bar), - F_(kw), - F_(w), - F_(kb), - F_(seconds), - F_(dbm), - F_(mv), - F_(times), - F_(oclock) - -}; - -// mapping of TAGs, to match order in DeviceValueTAG enum in emsdevice.h -// must be an int of 4 bytes, 32bit aligned -static const __FlashStringHelper * const DeviceValueTAG_s[] PROGMEM = { - - F_(tag_none), // "" - F_(tag_heartbeat), // "" - F_(tag_boiler_data), // "" - F_(tag_device_data_ww), // "ww" - F_(tag_thermostat_data), // "" - F_(tag_hc1), // "hc1" - F_(tag_hc2), // "hc2" - F_(tag_hc3), // "hc3" - F_(tag_hc4), // "hc4" - F_(tag_wwc1), // "wwc1" - F_(tag_wwc2), // "Wwc2" - F_(tag_wwc3), // "wwc3" - F_(tag_wwc4), // "wwc4" - F_(tag_hs1), // "hs1" - F_(tag_hs2), // "hs2" - F_(tag_hs3), // "hs3" - F_(tag_hs4), // "hs4" - F_(tag_hs5), // "hs5" - F_(tag_hs6), // "hs6" - F_(tag_hs7), // "hs7" - F_(tag_hs8), // "hs8" - F_(tag_hs9), // "hs9" - F_(tag_hs10), // "hs10" - F_(tag_hs11), // "hs11" - F_(tag_hs12), // "hs12" - F_(tag_hs13), // "hs13" - F_(tag_hs14), // "hs14" - F_(tag_hs15), // "hs15" - F_(tag_hs16) // "hs16" - -}; - -// MQTT topics derived from tags -static const __FlashStringHelper * const DeviceValueTAG_mqtt[] PROGMEM = { - - F_(tag_none), // "" - F_(heartbeat), // "heartbeat" - F_(tag_boiler_data_mqtt), // "" - F_(tag_device_data_ww_mqtt), // "ww" - F_(tag_thermostat_data), // "" - F_(tag_hc1), // "hc1" - F_(tag_hc2), // "hc2" - F_(tag_hc3), // "hc3" - F_(tag_hc4), // "hc4" - F_(tag_wwc1), // "wwc1" - F_(tag_wwc2), // "Wwc2" - F_(tag_wwc3), // "wwc3" - F_(tag_wwc4), // "wwc4" - F_(tag_hs1), // "hs1" - F_(tag_hs2), // "hs2" - F_(tag_hs3), // "hs3" - F_(tag_hs4), // "hs4" - F_(tag_hs5), // "hs5" - F_(tag_hs6), // "hs6" - F_(tag_hs7), // "hs7" - F_(tag_hs8), // "hs8" - F_(tag_hs9), // "hs9" - F_(tag_hs10), // "hs10" - F_(tag_hs11), // "hs11" - F_(tag_hs12), // "hs12" - F_(tag_hs13), // "hs13" - F_(tag_hs14), // "hs14" - F_(tag_hs15), // "hs15" - F_(tag_hs16) // "hs16" - -}; +// see if there are entities, excluding any commands +bool EMSdevice::has_entities() { + for (const auto & dv : devicevalues_) { + if (dv.type != DeviceValueType::CMD) { + return true; + } + } + return false; +} const std::string EMSdevice::tag_to_string(uint8_t tag) { - return read_flash_string(DeviceValueTAG_s[tag]); + return read_flash_string(DeviceValue::DeviceValueTAG_s[tag]); } const std::string EMSdevice::tag_to_mqtt(uint8_t tag) { - return read_flash_string(DeviceValueTAG_mqtt[tag]); + return read_flash_string(DeviceValue::DeviceValueTAG_mqtt[tag]); } const std::string EMSdevice::uom_to_string(uint8_t uom) { - if (uom == DeviceValueUOM::NONE) { - return std::string{}; - } - return read_flash_string(DeviceValueUOM_s[uom - 1]); // offset by 1 to account for NONE -} - -const std::vector EMSdevice::devicevalues() const { - return devicevalues_; + return read_flash_string(DeviceValue::DeviceValueUOM_s[uom]); } const std::string EMSdevice::brand_to_string() const { @@ -202,6 +122,10 @@ const std::string EMSdevice::device_type_2_device_name(const uint8_t device_type return read_flash_string(F_(dallassensor)); break; + case DeviceType::ANALOGSENSOR: + return read_flash_string(F_(analogsensor)); + break; + case DeviceType::CONTROLLER: return read_flash_string(F_(controller)); break; @@ -261,6 +185,10 @@ uint8_t EMSdevice::device_name_2_device_type(const char * topic) { return DeviceType::DALLASSENSOR; } + if (!strcmp(lowtopic, reinterpret_cast(F_(analogsensor)))) { + return DeviceType::ANALOGSENSOR; + } + return DeviceType::UNKNOWN; } @@ -304,44 +232,31 @@ uint8_t EMSdevice::decode_brand(uint8_t value) { // returns string of a human friendly description of the EMS device const std::string EMSdevice::to_string() const { - std::string str(160, '\0'); - // for devices that haven't been lookup yet, don't show all details if (product_id_ == 0) { - snprintf(&str[0], str.capacity() + 1, "%s (DeviceID:0x%02X)", name_.c_str(), device_id_); - return str; + return name_ + " (DeviceID:" + Helpers::hextoa(device_id_) + ")"; } if (brand_ == Brand::NO_BRAND) { - snprintf(&str[0], str.capacity() + 1, "%s (DeviceID:0x%02X, ProductID:%d, Version:%s)", name_.c_str(), device_id_, product_id_, version_.c_str()); - } else { - snprintf(&str[0], - str.capacity() + 1, - "%s %s (DeviceID:0x%02X ProductID:%d, Version:%s)", - brand_to_string().c_str(), - name_.c_str(), - device_id_, - product_id_, - version_.c_str()); + return name_ + " (DeviceID:" + Helpers::hextoa(device_id_) + ", ProductID:" + Helpers::itoa(product_id_) + ", Version:" + version_ + ")"; } - return str; + return brand_to_string() + " " + name_ + " (DeviceID:" + Helpers::hextoa(device_id_) + ", ProductID:" + Helpers::itoa(product_id_) + ", Version:" + version_ + + ")"; } // returns out brand + device name const std::string EMSdevice::to_string_short() const { - std::string str(160, '\0'); if (brand_ == Brand::NO_BRAND) { - snprintf(&str[0], str.capacity() + 1, "%s: %s", device_type_name().c_str(), name_.c_str()); - } else { - snprintf(&str[0], str.capacity() + 1, "%s: %s %s", device_type_name().c_str(), brand_to_string().c_str(), name_.c_str()); + return device_type_name() + ": " + name_; } - return str; + + return device_type_name() + ": " + brand_to_string() + " " + name_; } // for each telegram that has the fetch value set (true) do a read request void EMSdevice::fetch_values() { - EMSESP::logger().debug(F("Fetching values for device ID 0x%02X"), device_id()); + EMSESP::logger().debug(F("Fetching values for deviceID 0x%02X"), device_id()); for (const auto & tf : telegram_functions_) { if (tf.fetch_) { @@ -350,9 +265,9 @@ void EMSdevice::fetch_values() { } } -// toggle on/off automatic fetch for a telegram id +// toggle on/off automatic fetch for a telegramID void EMSdevice::toggle_fetch(uint16_t telegram_id, bool toggle) { - EMSESP::logger().debug(F("Toggling fetch for device ID 0x%02X, telegram ID 0x%02X to %d"), device_id(), telegram_id, toggle); + EMSESP::logger().debug(F("Toggling fetch for deviceID 0x%02X, telegramID 0x%02X to %d"), device_id(), telegram_id, toggle); for (auto & tf : telegram_functions_) { if (tf.telegram_type_id_ == telegram_id) { @@ -361,7 +276,7 @@ void EMSdevice::toggle_fetch(uint16_t telegram_id, bool toggle) { } } -// get status of automatic fetch for a telegram id +// get status of automatic fetch for a telegramID bool EMSdevice::is_fetch(uint16_t telegram_id) { for (auto & tf : telegram_functions_) { if (tf.telegram_type_id_ == telegram_id) { @@ -371,16 +286,17 @@ bool EMSdevice::is_fetch(uint16_t telegram_id) { return false; } -// list of registered device entries, adding the HA entity if it exists +// list of registered device entries +// called from the command 'entities' void EMSdevice::list_device_entries(JsonObject & output) { for (const auto & dv : devicevalues_) { if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.type != DeviceValueType::CMD) { // if we have a tag prefix it char key[50]; - if (!EMSdevice::tag_to_string(dv.tag).empty()) { - snprintf(key, 50, "%s.%s", EMSdevice::tag_to_string(dv.tag).c_str(), read_flash_string(dv.short_name).c_str()); + if (!EMSdevice::tag_to_mqtt(dv.tag).empty()) { + snprintf(key, sizeof(key), "%s.%s", EMSdevice::tag_to_mqtt(dv.tag).c_str(), read_flash_string(dv.short_name).c_str()); } else { - snprintf(key, 50, "%s", read_flash_string(dv.short_name).c_str()); + snprintf(key, sizeof(key), "%s", read_flash_string(dv.short_name).c_str()); } JsonArray details = output.createNestedArray(key); @@ -390,49 +306,61 @@ void EMSdevice::list_device_entries(JsonObject & output) { // add uom if (!uom_to_string(dv.uom).empty() && uom_to_string(dv.uom) != " ") { - details.add(EMSdevice::uom_to_string(dv.uom)); - } - - // add ha sensor name - if (Mqtt::ha_enabled()) { - details.add(device_entity_ha(dv)); + if (EMSESP::system_.fahrenheit() && (dv.uom == DeviceValueUOM::DEGREES || dv.uom == DeviceValueUOM::DEGREES_R)) { + details.add(EMSdevice::uom_to_string(DeviceValueUOM::FAHRENHEIT)); + } else { + details.add(EMSdevice::uom_to_string(dv.uom)); + } } } } } -// creates the HA sensor entity from a device value -const std::string EMSdevice::device_entity_ha(DeviceValue const & dv) { - std::string entity_name(50, '\0'); - if (EMSdevice::tag_to_string(dv.tag).empty()) { - snprintf(&entity_name[0], entity_name.capacity() + 1, "sensor.%s %s", this->device_type_name().c_str(), read_flash_string(dv.full_name).c_str()); - } else { - snprintf(&entity_name[0], - entity_name.capacity() + 1, - "sensor.%s %s %s", - this->device_type_name().c_str(), - EMSdevice::tag_to_string(dv.tag).c_str(), - read_flash_string(dv.full_name).c_str()); - } - std::replace(entity_name.begin(), entity_name.end(), ' ', '_'); - return Helpers::toLower(entity_name); -} - // list all the telegram type IDs for this device void EMSdevice::show_telegram_handlers(uuid::console::Shell & shell) { if (telegram_functions_.size() == 0) { return; } - - shell.printf(F(" This %s will respond to telegram type IDs: "), device_type_name().c_str()); + /* + // colored list of type-ids + shell.printf(F(" This %s will listen to telegram type IDs: "), device_type_name().c_str()); for (const auto & tf : telegram_functions_) { + if (tf.received_ && !tf.fetch_) { + shell.printf(COLOR_BRIGHT_GREEN); + } else if (tf.received_) { + shell.printf(COLOR_YELLOW); + } else { + shell.printf(COLOR_BRIGHT_RED); + } shell.printf(F("0x%02X "), tf.telegram_type_id_); } + shell.printf(COLOR_RESET); + */ + shell.printf(F(" Received telegram type IDs: ")); + for (const auto & tf : telegram_functions_) { + if (tf.received_ && !tf.fetch_) { + shell.printf(F("0x%02X "), tf.telegram_type_id_); + } + } + shell.println(); + shell.printf(F(" Fetched telegram type IDs: ")); + for (const auto & tf : telegram_functions_) { + if (tf.fetch_) { + shell.printf(F("0x%02X "), tf.telegram_type_id_); + } + } + shell.println(); + shell.printf(F(" Pending telegram type IDs: ")); + for (const auto & tf : telegram_functions_) { + if (!tf.received_ && !tf.fetch_) { + shell.printf(F("0x%02X "), tf.telegram_type_id_); + } + } shell.println(); } // list all the telegram type IDs for this device, outputting to a string (max size 200) -char * EMSdevice::show_telegram_handlers(char * result) { +char * EMSdevice::show_telegram_handlers(char * result, uint8_t handlers) { uint8_t size = telegram_functions_.size(); strlcpy(result, "", 200); @@ -441,13 +369,14 @@ char * EMSdevice::show_telegram_handlers(char * result) { return result; } - char str[10]; uint8_t i = 0; for (const auto & tf : telegram_functions_) { - snprintf(str, sizeof(str), "0x%02X", tf.telegram_type_id_); - strlcat(result, str, 200); - if (++i < size) { - strlcat(result, " ", 200); + if (handlers == Handlers::ALL || (handlers == Handlers::RECEIVED && tf.received_ && !tf.fetch_) + || (handlers == Handlers::FETCHED && tf.received_ && tf.fetch_) || (handlers == Handlers::PENDING && !tf.received_ && !tf.fetch_)) { + if (i++ > 0) { + strlcat(result, " ", 200); + } + strlcat(result, Helpers::hextoa(tf.telegram_type_id_, true).c_str(), 200); } } @@ -484,8 +413,8 @@ void EMSdevice::register_device_value(uint8_t tag, const __FlashStringHelper * full_name, uint8_t uom, bool has_cmd, - int32_t min, - uint32_t max) { + int16_t min, + uint16_t max) { // initialize the device value depending on it's type if (type == DeviceValueType::STRING) { *(char *)(value_p) = {'\0'}; @@ -512,11 +441,31 @@ void EMSdevice::register_device_value(uint8_t tag, }; } - // set state - // if fullname is empty don't set the flag to visible (used for hamode and hatemp) - uint8_t state = (full_name) ? DeviceValueState::DV_VISIBLE : DeviceValueState::DV_DEFAULT; + // this is the unique id set for the device entity. it's a simple sequence number + uint8_t dv_id = get_next_dv_id(); - devicevalues_.emplace_back(device_type_, tag, value_p, type, options, options_size, short_name, full_name, uom, 0, has_cmd, min, max, state); + // determine state + uint8_t state = DeviceValueState::DV_VISIBLE; // default to visible + if (!full_name) { + state = DeviceValueState::DV_DEFAULT; // don't show if the full_name is empty + } else { + // scan through customizations to see if it's on the exclusion list by matching the productID and deviceID + EMSESP::webCustomizationService.read([&](WebCustomization & settings) { + for (EntityCustomization entityCustomization : settings.entityCustomizations) { + if ((entityCustomization.product_id == product_id()) && (entityCustomization.device_id == device_id())) { + for (uint8_t entity_id : entityCustomization.entity_ids) { + if (entity_id == dv_id) { + state = DeviceValueState::DV_DEFAULT; // it's on the list, exclude it by making it not visible + break; + } + } + } + } + }); + } + + // add the device + devicevalues_.emplace_back(device_type_, tag, value_p, type, options, options_size, short_name, full_name, uom, 0, has_cmd, min, max, state, dv_id); } // function with min and max values @@ -528,8 +477,8 @@ void EMSdevice::register_device_value(uint8_t tag, const __FlashStringHelper * const * name, uint8_t uom, const cmd_function_p f, - int32_t min, - uint32_t max) { + int16_t min, + uint16_t max) { auto short_name = name[0]; auto full_name = name[1]; @@ -542,11 +491,11 @@ void EMSdevice::register_device_value(uint8_t tag, uint8_t flags = CommandFlag::ADMIN_ONLY; // executing commands require admin privileges - if (tag >= TAG_HC1 && tag <= TAG_HC4) { + if (tag >= DeviceValueTAG::TAG_HC1 && tag <= DeviceValueTAG::TAG_HC8) { flags |= CommandFlag::MQTT_SUB_FLAG_HC; - } else if (tag >= TAG_WWC1 && tag <= TAG_WWC4) { + } else if (tag >= DeviceValueTAG::TAG_WWC1 && tag <= DeviceValueTAG::TAG_WWC4) { flags |= CommandFlag::MQTT_SUB_FLAG_WWC; - } else if (tag == TAG_DEVICE_DATA_WW) { + } else if (tag == DeviceValueTAG::TAG_DEVICE_DATA_WW) { flags |= CommandFlag::MQTT_SUB_FLAG_WW; } @@ -576,6 +525,82 @@ void EMSdevice::register_device_value(uint8_t tag, register_device_value(tag, value_p, type, options, name, uom, nullptr, 0, 0); } +// publish a single value on change +void EMSdevice::publish_value(void * value_p) { + if (!Mqtt::publish_single() || value_p == nullptr) { + return; + } + for (auto & dv : devicevalues_) { + if (dv.value_p == value_p && dv.has_state(DeviceValueState::DV_VISIBLE)) { + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + if ((dv.tag >= DeviceValueTAG::TAG_HC1 && dv.tag <= DeviceValueTAG::TAG_HC8) + || (dv.tag >= DeviceValueTAG::TAG_WWC1 && dv.tag <= DeviceValueTAG::TAG_WWC4)) { + snprintf(topic, + sizeof(topic), + "%s/%s/%s", + device_type_2_device_name(device_type_).c_str(), + tag_to_mqtt(dv.tag).c_str(), + read_flash_string(dv.short_name).c_str()); + } else { + snprintf(topic, sizeof(topic), "%s/%s", device_type_2_device_name(device_type_).c_str(), read_flash_string(dv.short_name).c_str()); + } + + int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + char payload[30] = {'\0'}; + uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; + + switch (dv.type) { + case DeviceValueType::CMD: // publish a dummy value to show subscription in mqtt + strlcpy(payload, "-", 2); + break; + case DeviceValueType::ENUM: { + if ((*(uint8_t *)(value_p)) < dv.options_size) { + if (EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX) { + Helpers::render_value(payload, *(uint8_t *)(value_p), 0); + } else { + strlcpy(payload, read_flash_string(dv.options[*(uint8_t *)(value_p)]).c_str(), sizeof(payload)); + } + } + break; + } + + case DeviceValueType::USHORT: + Helpers::render_value(payload, *(uint16_t *)(value_p), divider, fahrenheit); + break; + case DeviceValueType::UINT: + Helpers::render_value(payload, *(uint8_t *)(value_p), divider, fahrenheit); + break; + case DeviceValueType::SHORT: + Helpers::render_value(payload, *(int16_t *)(value_p), divider, fahrenheit); + break; + case DeviceValueType::INT: + Helpers::render_value(payload, *(int8_t *)(value_p), divider, fahrenheit); + break; + case DeviceValueType::ULONG: + Helpers::render_value(payload, *(uint32_t *)(value_p), divider, fahrenheit); + break; + case DeviceValueType::BOOL: { + Helpers::render_boolean(payload, (bool)(*(uint8_t *)(value_p))); + break; + } + case DeviceValueType::TIME: + Helpers::render_value(payload, *(uint32_t *)(value_p), divider); + break; + case DeviceValueType::STRING: + default: + if (Helpers::hasValue((char *)(value_p))) { + strlcpy(payload, (char *)(value_p), sizeof(payload)); + } + break; + } + + if (payload[0] != '\0') { + Mqtt::publish(topic, payload); + } + } + } +} + // looks up the UOM for a given key from the device value table const std::string EMSdevice::get_value_uom(const char * key) { // the key may have a TAG string prefixed at the beginning. If so, remove it @@ -583,9 +608,8 @@ const std::string EMSdevice::get_value_uom(const char * key) { strlcpy(new_key, key, sizeof(new_key)); char * key_p = new_key; - size_t sz = sizeof(DeviceValueTAG_s) / sizeof(__FlashStringHelper *); - for (uint8_t i = 0; i < sz; i++) { - auto tag = read_flash_string(DeviceValueTAG_s[i]); + for (uint8_t i = 0; i < DeviceValue::tag_count; i++) { + auto tag = read_flash_string(DeviceValue::DeviceValueTAG_s[i]); if (!tag.empty()) { std::string key2 = key; // copy char to a std::string if ((key2.find(tag) != std::string::npos) && (key[tag.length()] == ' ')) { @@ -612,165 +636,251 @@ const std::string EMSdevice::get_value_uom(const char * key) { } // prepare array of device values used for the WebUI -// this is loosely based of the function generate_values_json used for the MQTT and Console +// this is loosely based of the function generate_values used for the MQTT and Console // except additional data is stored in the JSON document needed for the Web UI like the UOM and command // v = value, u=uom, n=name, c=cmd -void EMSdevice::generate_values_json_web(JsonObject & output) { - output["type"] = device_type_name(); - JsonArray data = output.createNestedArray("data"); +void EMSdevice::generate_values_web(JsonObject & output) { + output["label"] = to_string_short(); + JsonArray data = output.createNestedArray("data"); - for (const auto & dv : devicevalues_) { + for (auto & dv : devicevalues_) { // check conditions: // 1. full_name cannot be empty - // 2. it can't be a command (like publish) - // 3. it must have a valid value + // 2. it must have a valid value, if it is not a command like 'reset' - // ignore if full_name empty and also commands - if (dv.has_state(DeviceValueState::DV_VISIBLE) && (dv.type != DeviceValueType::CMD) && check_dv_hasvalue(dv)) { - JsonObject obj; // create the object, if needed + if (dv.has_state(DeviceValueState::DV_VISIBLE) && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { + JsonObject obj = data.createNestedObject(); // create the object, we know there is a value + uint8_t fahrenheit = 0; // handle Booleans (true, false) if (dv.type == DeviceValueType::BOOL) { - obj = data.createNestedObject(); - obj["v"] = *(bool *)(dv.value_p) ? "on" : "off"; + bool value_b = *(bool *)(dv.value_p); + if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + obj["v"] = value_b ? "true" : "false"; + } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + obj["v"] = value_b ? 1 : 0; + } else { + char s[7]; + obj["v"] = Helpers::render_boolean(s, value_b); + } } // handle TEXT strings else if (dv.type == DeviceValueType::STRING) { - obj = data.createNestedObject(); obj["v"] = (char *)(dv.value_p); } // handle ENUMs else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { - obj = data.createNestedObject(); obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; } - // handle Integers and Floats + // handle commands without value + // else if (dv.type == DeviceValueType::CMD) { + // obj["v"] = "-"; + // } + else { // If a divider is specified, do the division to 2 decimals places and send back as double/float // otherwise force as an integer whole // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler - uint8_t divider = 0; - uint8_t factor = 1; - if (dv.options_size == 1) { - const char * s = read_flash_string(dv.options[0]).c_str(); - if (s[0] == '*') { - factor = Helpers::atoint(&s[1]); - } else { - divider = Helpers::atoint(s); - } - } + int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; - if (dv.type == DeviceValueType::INT) { - obj = data.createNestedObject(); - obj["v"] = (divider) ? Helpers::round2(*(int8_t *)(dv.value_p), divider) : *(int8_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::UINT) { - obj = data.createNestedObject(); - obj["v"] = (divider) ? Helpers::round2(*(uint8_t *)(dv.value_p), divider) : *(uint8_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::SHORT) { - obj = data.createNestedObject(); - obj["v"] = (divider) ? Helpers::round2(*(int16_t *)(dv.value_p), divider) : *(int16_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::USHORT) { - obj = data.createNestedObject(); - obj["v"] = (divider) ? Helpers::round2(*(uint16_t *)(dv.value_p), divider) : *(uint16_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::ULONG) { - obj = data.createNestedObject(); - obj["v"] = divider ? Helpers::round2(*(uint32_t *)(dv.value_p), divider) : *(uint32_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::TIME) { + if ((dv.type == DeviceValueType::INT) && Helpers::hasValue(*(int8_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::UINT) && Helpers::hasValue(*(uint8_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::SHORT) && Helpers::hasValue(*(int16_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::USHORT) && Helpers::hasValue(*(uint16_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::ULONG) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint32_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { uint32_t time_value = *(uint32_t *)(dv.value_p); - obj = data.createNestedObject(); - obj["v"] = (divider > 0) ? time_value / divider : time_value * factor; // sometimes we need to divide by 60 + obj["v"] = (divider > 0) ? time_value / divider : time_value; // sometimes we need to divide by 60 } } - // check if we've added a data element then add the remaining elements - if (obj.containsKey("v")) { - obj["u"] = dv.uom; // add the unit of measure (uom) + // add the unit of measure (uom) + obj["u"] = fahrenheit ? (uint8_t)DeviceValueUOM::FAHRENHEIT : dv.uom; - // add name, prefixing the tag if it exists - if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - obj["n"] = dv.full_name; + // add name, prefixing the tag if it exists + if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { + obj["n"] = dv.full_name; + } else if (dv.tag < DeviceValueTAG::TAG_HC1) { + obj["n"] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + } else { + obj["n"] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + } + + // add commands and options + if (dv.has_cmd) { + // add the name of the Command function + if (dv.tag >= DeviceValueTAG::TAG_HC1) { + obj["c"] = tag_to_mqtt(dv.tag) + "/" + read_flash_string(dv.short_name); } else { - char name[50]; - snprintf(name, sizeof(name), "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); - obj["n"] = name; + obj["c"] = dv.short_name; } - - // add commands and options - if (dv.has_cmd) { - // add the name of the Command function - if (dv.tag >= DeviceValueTAG::TAG_HC1) { - obj["c"] = tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); - } else { - obj["c"] = dv.short_name; - } - // add the Command options - if (dv.type == DeviceValueType::ENUM) { - JsonArray l = obj.createNestedArray("l"); - for (uint8_t i = 0; i < dv.options_size; i++) { - if (!read_flash_string(dv.options[i]).empty()) { - l.add(read_flash_string(dv.options[i])); - } + // add the Command options + if (dv.type == DeviceValueType::ENUM || (dv.type == DeviceValueType::CMD && dv.options_size > 1)) { + JsonArray l = obj.createNestedArray("l"); + for (uint8_t i = 0; i < dv.options_size; i++) { + if (!read_flash_string(dv.options[i]).empty()) { + l.add(read_flash_string(dv.options[i])); } } - if (dv.type == DeviceValueType::BOOL) { - JsonArray l = obj.createNestedArray("l"); - l.add("off"); - l.add("on"); - } + } + if (dv.type == DeviceValueType::BOOL) { + JsonArray l = obj.createNestedArray("l"); + l.add("off"); + l.add("on"); + } + // add command template + if ((dv.type == DeviceValueType::STRING || dv.type == DeviceValueType::CMD) && dv.options_size == 1) { + obj["o"] = dv.options[0]; } } } } - -#if defined(EMSESP_DEBUG) -// serializeJson(data, Serial); // debug only -#endif } -// builds json with specific single device value information -// cnd is the endpoint or name of the device entity +// disable/exclude a device entity based on its unique id +void EMSdevice::exclude_entity(uint8_t id) { + for (auto & dv : devicevalues_) { + if (dv.id == id) { + dv.remove_state(DeviceValueState::DV_VISIBLE); // this will remove from MQTT payloads and showing in web & console + dv.remove_state(DeviceValueState::DV_ACTIVE); // this will ensure it'll be removed from any HA MQTT /config topics + return; + } + } +} + +// as generate_values_web() but stripped down to only show all entities and their state +void EMSdevice::generate_values_web_all(JsonArray & output) { + for (auto & dv : devicevalues_) { + // ignore commands and entities that have an empty full name + if ((dv.type != DeviceValueType::CMD) && (dv.full_name)) { + JsonObject obj = output.createNestedObject(); + + // create the value + if (dv.hasValue()) { + // handle Booleans (true, false) + if (dv.type == DeviceValueType::BOOL) { + bool value_b = *(bool *)(dv.value_p); + if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + obj["v"] = value_b; + } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + obj["v"] = value_b ? 1 : 0; + } else { + char s[7]; + obj["v"] = Helpers::render_boolean(s, value_b); + } + } + + // handle TEXT strings + else if (dv.type == DeviceValueType::STRING) { + obj["v"] = (char *)(dv.value_p); + } + + // handle ENUMs + else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { + obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; + } + + // handle Integers and Floats + else { + // If a divider is specified, do the division to 2 decimals places and send back as double/float + // otherwise force as an integer whole + // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler + uint8_t divider = 0; + uint8_t factor = 1; + if (dv.options_size == 1) { + const char * s = read_flash_string(dv.options[0]).c_str(); + if (s[0] == '*') { + factor = Helpers::atoint(&s[1]); + } else { + divider = Helpers::atoint(s); + } + } + + if (dv.type == DeviceValueType::INT) { + obj["v"] = (divider) ? Helpers::round2(*(int8_t *)(dv.value_p), divider) : *(int8_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::UINT) { + obj["v"] = (divider) ? Helpers::round2(*(uint8_t *)(dv.value_p), divider) : *(uint8_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::SHORT) { + obj["v"] = (divider) ? Helpers::round2(*(int16_t *)(dv.value_p), divider) : *(int16_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::USHORT) { + obj["v"] = (divider) ? Helpers::round2(*(uint16_t *)(dv.value_p), divider) : *(uint16_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::ULONG) { + obj["v"] = divider ? Helpers::round2(*(uint32_t *)(dv.value_p), divider) : *(uint32_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::TIME) { + uint32_t time_value = *(uint32_t *)(dv.value_p); + obj["v"] = (divider > 0) ? time_value / divider : time_value * factor; // sometimes we need to divide by 60 + } + } + } + + // add name, prefixing the tag if it exists + if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { + obj["n"] = dv.full_name; + } else { + char name[50]; + snprintf(name, sizeof(name), "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); + obj["n"] = name; + } + + // shortname + if (dv.tag >= DeviceValueTAG::TAG_HC1) { + obj["s"] = tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); + } else { + obj["s"] = dv.short_name; + } + + // is it marked as excluded? + obj["x"] = !dv.has_state(DeviceValueState::DV_VISIBLE); + + // add the unique ID + obj["i"] = dv.id; + } + } +} + +// builds json for a specific device value / entity +// cmd is the endpoint or name of the device entity // returns false if failed, otherwise true bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8_t id) { JsonObject json = output; int8_t tag = id; // check if we have hc or wwc - if (id >= 1 && id <= 4) { + if (id >= 1 && id <= 8) { tag = DeviceValueTAG::TAG_HC1 + id - 1; - } else if (id >= 8 && id <= 11) { - tag = DeviceValueTAG::TAG_WWC1 + id - 8; + } else if (id >= 9 && id <= 12) { + tag = DeviceValueTAG::TAG_WWC1 + id - 9; } else if (id != -1) { return false; // error } // search device value with this tag for (auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_VISIBLE) - && (strcmp(cmd, Helpers::toLower(read_flash_string(dv.short_name)).c_str()) == 0 && (tag <= 0 || tag == dv.tag))) { - uint8_t divider = 0; - uint8_t factor = 1; - if (dv.options_size == 1) { - const char * s = read_flash_string(dv.options[0]).c_str(); - if (s[0] == '*') { - factor = Helpers::atoint(&s[1]); - } else { - divider = Helpers::atoint(s); - } - } + if (strcmp(cmd, Helpers::toLower(read_flash_string(dv.short_name)).c_str()) == 0 && (tag <= 0 || tag == dv.tag)) { + int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; + const char * type = "type"; - const char * min = "min"; - const char * max = "max"; const char * value = "value"; json["name"] = dv.short_name; - // prefix tag if it's included - if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - json["fullname"] = dv.full_name; - } else { - json["fullname"] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + + if (dv.full_name != nullptr) { + const char * fullname = "fullname"; + if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { + json[fullname] = dv.full_name; + } else { + json[fullname] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + } } if (!tag_to_mqtt(dv.tag).empty()) { @@ -780,16 +890,13 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 switch (dv.type) { case DeviceValueType::ENUM: { if (*(uint8_t *)(dv.value_p) < dv.options_size) { - if (EMSESP::enum_format() == ENUM_FORMAT_NUMBER) { + if (EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX) { json[value] = (uint8_t)(*(uint8_t *)(dv.value_p)); } else { json[value] = dv.options[*(uint8_t *)(dv.value_p)]; // text } } - json[type] = F_(enum); - // uint8_t min_ = (read_flash_string(dv.options[0]) == "") ? 1 : 0; - // json[min] = min_; - // json[max] = dv.options_size - 1; + json[type] = F_(enum); JsonArray enum_ = json.createNestedArray(F_(enum)); for (uint8_t i = 0; i < dv.options_size; i++) { enum_.add(dv.options[i]); @@ -799,93 +906,76 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 case DeviceValueType::USHORT: if (Helpers::hasValue(*(uint16_t *)(dv.value_p))) { - json[value] = divider ? Helpers::round2(*(uint16_t *)(dv.value_p), divider) : *(uint16_t *)(dv.value_p) * factor; + json[value] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); } json[type] = F_(number); - json[min] = 0; - json[max] = divider ? EMS_VALUE_USHORT_NOTSET / divider : EMS_VALUE_USHORT_NOTSET - 1; break; case DeviceValueType::UINT: if (Helpers::hasValue(*(uint8_t *)(dv.value_p))) { - json[value] = divider ? Helpers::round2(*(uint8_t *)(dv.value_p), divider) : *(uint8_t *)(dv.value_p) * factor; + json[value] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); } json[type] = F_(number); - json[min] = 0; - if (dv.uom == DeviceValueUOM::PERCENT) { - json[max] = 100; - } else { - json[max] = divider ? EMS_VALUE_UINT_NOTSET / divider : EMS_VALUE_UINT_NOTSET - 1; - } break; case DeviceValueType::SHORT: if (Helpers::hasValue(*(int16_t *)(dv.value_p))) { - json[value] = divider ? Helpers::round2(*(int16_t *)(dv.value_p), divider) : *(int16_t *)(dv.value_p) * factor; + json[value] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); } json[type] = F_(number); - json[min] = divider ? -EMS_VALUE_SHORT_NOTSET / divider : -EMS_VALUE_SHORT_NOTSET; - json[max] = divider ? EMS_VALUE_SHORT_NOTSET / divider : EMS_VALUE_SHORT_NOTSET - 1; break; case DeviceValueType::INT: if (Helpers::hasValue(*(int8_t *)(dv.value_p))) { - json[value] = divider ? Helpers::round2(*(int8_t *)(dv.value_p), divider) : *(int8_t *)(dv.value_p) * factor; + json[value] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); } json[type] = F_(number); - if (dv.uom == DeviceValueUOM::PERCENT) { - json[min] = -100; - json[max] = 100; - } else { - json[min] = divider ? -EMS_VALUE_INT_NOTSET / divider : -EMS_VALUE_INT_NOTSET; - json[max] = divider ? EMS_VALUE_INT_NOTSET / divider : EMS_VALUE_INT_NOTSET - 1; - } break; case DeviceValueType::ULONG: if (Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - json[value] = divider ? Helpers::round2(*(uint32_t *)(dv.value_p), divider) : *(uint32_t *)(dv.value_p) * factor; + json[value] = Helpers::round2(*(uint32_t *)(dv.value_p), divider); } json[type] = F_(number); - json[min] = 0; - json[max] = divider ? EMS_VALUE_ULONG_NOTSET / divider : EMS_VALUE_ULONG_NOTSET; break; - case DeviceValueType::BOOL: { + case DeviceValueType::BOOL: if (Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { - uint8_t bool_format = EMSESP::bool_format(); - if (bool_format == BOOL_FORMAT_ONOFF) { - json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? F_(on) : F_(off); - } else if (bool_format == BOOL_FORMAT_ONOFF_CAP) { - json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? F_(ON) : F_(OFF); - } else if (bool_format == BOOL_FORMAT_TRUEFALSE) { - json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? true : false; + bool value_b = (bool)(*(uint8_t *)(dv.value_p)); + if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + json[value] = value_b; + } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + json[value] = value_b ? 1 : 0; } else { - json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? 1 : 0; + char s[7]; + json[value] = Helpers::render_boolean(s, value_b); } } json[type] = F("boolean"); break; - } case DeviceValueType::TIME: if (Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - json[value] = (divider) ? *(uint32_t *)(dv.value_p) / divider : *(uint32_t *)(dv.value_p) * factor; + json[value] = Helpers::round2(*(uint32_t *)(dv.value_p), divider); } json[type] = F_(number); - json[min] = 0; - json[max] = divider ? EMS_VALUE_ULONG_NOTSET / divider : EMS_VALUE_ULONG_NOTSET; break; case DeviceValueType::STRING: if (Helpers::hasValue((char *)(dv.value_p))) { json[value] = (char *)(dv.value_p); } - json[type] = F_(text); + json[type] = F("string"); break; case DeviceValueType::CMD: json[type] = F_(command); + if (dv.options_size > 1) { + JsonArray enum_ = json.createNestedArray(F_(enum)); + for (uint8_t i = 0; i < dv.options_size; i++) { + enum_.add(dv.options[i]); + } + } break; default: @@ -893,25 +983,23 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 break; } + // set the min and max + int16_t dv_set_min, dv_set_max; + if (dv.get_min_max(dv_set_min, dv_set_max)) { + json["min"] = dv_set_min; + json["max"] = dv_set_max; + } + // add uom if it's not a " " (single space) if (!uom_to_string(dv.uom).empty() && uom_to_string(dv.uom) != " ") { - json["uom"] = EMSdevice::uom_to_string(dv.uom); + json["uom"] = fahrenheit ? "°F" : uom_to_string(dv.uom); } json["writeable"] = dv.has_cmd; - // if we have individual limits, overwrite the common limits - if (dv.min != 0 || dv.max != 0) { - json[min] = dv.min; - json[max] = dv.max; - } - - // show the HA entity name if available - if (Mqtt::ha_enabled()) { - json["ha_entityname"] = device_entity_ha(dv); - } + json["visible"] = dv.has_state(DeviceValue::DeviceValueState::DV_VISIBLE); // if there is no value, mention it - if (!json.containsKey("value")) { + if (!json.containsKey(value)) { json[value] = "not set"; } @@ -926,36 +1014,40 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 return false; } +// mqtt publish all single values from one device (used for time schedule) +void EMSdevice::publish_all_values() { + for (auto & dv : devicevalues_) { + publish_value(dv.value_p); + } +} + // For each value in the device create the json object pair and add it to given json // return false if empty // this is used to create both the MQTT payloads, Console messages and Web API calls -bool EMSdevice::generate_values_json(JsonObject & output, const uint8_t tag_filter, const bool nested, const uint8_t output_target) { +bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, const bool nested, const uint8_t output_target) { bool has_values = false; // to see if we've added a value. it's faster than doing a json.size() at the end uint8_t old_tag = 255; // NAN JsonObject json = output; for (auto & dv : devicevalues_) { - // check conditions: - // 1. it must have a valid value - // 2. it must be visible, unless our output destination is MQTT - // 3. it must match the given tag filter or have an empty tag - - // check if it exists. We set the value activated once here - bool has_value = check_dv_hasvalue(dv); - if (has_value) { + // check if it exists, there is a value for the entity. Set the flag to ACTIVE + if (dv.hasValue()) { dv.add_state(DeviceValueState::DV_ACTIVE); } else { dv.remove_state(DeviceValueState::DV_ACTIVE); } - bool conditions = ((tag_filter == DeviceValueTAG::TAG_NONE) || (tag_filter == dv.tag)) && has_value; - if (output_target != OUTPUT_TARGET::MQTT) { - conditions &= - dv.has_state(DeviceValueState::DV_VISIBLE); // value must be visible if outputting to API (web or console). This is for ID, hamode, hatemp etc - } + // check conditions: + // 1. it must have a valid value (state is active) + // 2. it must have a visible, unless the output_target is MQTT + // 3. it must match the given tag filter or have an empty tag + bool conditions = ((tag_filter == DeviceValueTAG::TAG_NONE) || (tag_filter == dv.tag)) && dv.has_state(DeviceValueState::DV_ACTIVE); + // 4. for MQTT we want to always show the special HA entities (they have an empty fullname) + bool visible = ((dv.has_state(DeviceValueState::DV_VISIBLE)) || ((output_target == OUTPUT_TARGET::MQTT) && (!dv.full_name))); + conditions &= visible; if (conditions) { - has_values = true; // we actually have data + has_values = true; // flagged if we actually have data // we have a tag if it matches the filter given, and that the tag name is not empty/"" bool have_tag = ((dv.tag != tag_filter) && !tag_to_string(dv.tag).empty()); @@ -980,18 +1072,22 @@ bool EMSdevice::generate_values_json(JsonObject & output, const uint8_t tag_filt } } - // handle Booleans (true, false) - if (dv.type == DeviceValueType::BOOL) { + // handle Booleans + if (dv.type == DeviceValueType::BOOL && Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { // see how to render the value depending on the setting - uint8_t bool_format = EMSESP::bool_format(); - if (bool_format == BOOL_FORMAT_ONOFF) { - json[name] = *(uint8_t *)(dv.value_p) ? F_(on) : F_(off); - } else if (bool_format == BOOL_FORMAT_ONOFF_CAP) { - json[name] = *(uint8_t *)(dv.value_p) ? F_(ON) : F_(OFF); - } else if (bool_format == BOOL_FORMAT_TRUEFALSE) { - json[name] = (bool)(*(uint8_t *)(dv.value_p)) ? true : false; + bool value_b = (bool)*(uint8_t *)(dv.value_p); + if (Mqtt::ha_enabled() && (output_target == OUTPUT_TARGET::MQTT)) { + char s[7]; + json[name] = Helpers::render_boolean(s, value_b); // for HA always render as string } else { - json[name] = (uint8_t)(*(uint8_t *)(dv.value_p)) ? 1 : 0; + if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + json[name] = value_b; + } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + json[name] = value_b ? 1 : 0; + } else { + char s[7]; + json[name] = Helpers::render_boolean(s, value_b); + } } } @@ -1001,22 +1097,22 @@ bool EMSdevice::generate_values_json(JsonObject & output, const uint8_t tag_filt } // handle ENUMs - else if (dv.type == DeviceValueType::ENUM) { - if (*(uint8_t *)(dv.value_p) < dv.options_size) { - // check for numeric enum-format, but "hamode" always as text - if ((EMSESP::enum_format() == ENUM_FORMAT_NUMBER) && (dv.short_name != FL_(hamode)[0])) { - json[name] = (uint8_t)(*(uint8_t *)(dv.value_p)); - } else { - json[name] = dv.options[*(uint8_t *)(dv.value_p)]; - } + else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { + // check for numeric enum-format + if ((EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX)) { + json[name] = (uint8_t)(*(uint8_t *)(dv.value_p)); + } else { + json[name] = dv.options[*(uint8_t *)(dv.value_p)]; } } - // handle Integers and Floats + // handle Numbers // If a divider is specified, do the division to 2 decimals places and send back as double/float // otherwise force as a whole integer // note: the strange nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler else { + // If a divider is specified, do the division to 2 decimals places and send back as double/float + // otherwise force as an integer whole uint8_t divider = 0; uint8_t factor = 1; if (dv.options_size == 1) { @@ -1028,42 +1124,48 @@ bool EMSdevice::generate_values_json(JsonObject & output, const uint8_t tag_filt } } + // fahrenheit, 0 is no converstion other 1 or 2. not sure why? + uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 + : (dv.uom == DeviceValueUOM::DEGREES) ? 2 + : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 + : 0; + // always convert temperatures to floats with 1 decimal place - bool make_float = (divider || (dv.uom == DeviceValueUOM::DEGREES)); + bool make_float = (divider || (dv.uom == DeviceValueUOM::DEGREES) || (dv.uom == DeviceValueUOM::DEGREES_R)); if (dv.type == DeviceValueType::INT) { if (make_float) { - json[name] = Helpers::round2(*(int8_t *)(dv.value_p), divider); + json[name] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); } else { json[name] = *(int8_t *)(dv.value_p) * factor; } } else if (dv.type == DeviceValueType::UINT) { if (make_float) { - json[name] = Helpers::round2(*(uint8_t *)(dv.value_p), divider); + json[name] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); } else { json[name] = *(uint8_t *)(dv.value_p) * factor; } } else if (dv.type == DeviceValueType::SHORT) { if (make_float) { - json[name] = Helpers::round2(*(int16_t *)(dv.value_p), divider); + json[name] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); } else { json[name] = *(int16_t *)(dv.value_p) * factor; } } else if (dv.type == DeviceValueType::USHORT) { if (make_float) { - json[name] = Helpers::round2(*(uint16_t *)(dv.value_p), divider); + json[name] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); } else { json[name] = *(uint16_t *)(dv.value_p) * factor; } } else if (dv.type == DeviceValueType::ULONG) { if (make_float) { - json[name] = Helpers::round2(*(uint32_t *)(dv.value_p), divider); + json[name] = Helpers::round2(*(uint32_t *)(dv.value_p), divider, fahrenheit); } else { json[name] = *(uint32_t *)(dv.value_p) * factor; } - } else if (dv.type == DeviceValueType::TIME) { + } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { uint32_t time_value = *(uint32_t *)(dv.value_p); - time_value = (divider) ? time_value / divider : time_value * factor; // sometimes we need to divide by 60 + time_value = Helpers::round2(time_value, divider); // sometimes we need to divide by 60 if (output_target == EMSdevice::OUTPUT_TARGET::API_VERBOSE) { char time_s[40]; snprintf(time_s, @@ -1080,6 +1182,10 @@ bool EMSdevice::generate_values_json(JsonObject & output, const uint8_t tag_filt json[name] = time_value; } } + // commenting out - we don't want Commands in MQTT or Console + // else if (dv.type == DeviceValueType::CMD && output_target != EMSdevice::OUTPUT_TARGET::MQTT) { + // json[name] = ""; + // } } } } @@ -1087,52 +1193,53 @@ bool EMSdevice::generate_values_json(JsonObject & output, const uint8_t tag_filt return has_values; } -// create the Home Assistant configs for each value +// create the Home Assistant configs for each device value / entity // this is called when an MQTT publish is done via an EMS Device in emsesp.cpp -// if the main Device Entity config for the device hasn't been setup its also done here void EMSdevice::publish_mqtt_ha_entity_config() { - // create the main device config if not doing already - if (!ha_config_done()) { - bool ok = publish_ha_device_config(); - ha_config_done(ok); // see if it worked - } + // create the main device config if not already done, per device type + bool create_device_config = !ha_config_done(); for (auto & dv : devicevalues_) { -#if defined(EMSESP_STANDALONE) - // debug messages to go with the test called 'dv' - if (strcmp(read_flash_string(dv.short_name).c_str(), "wwseltemp") == 0) { - EMSESP::logger().warning(F("publish_mqtt_ha_entity_config: wwseltemp state=%d, active=%d config_created=%d"), - dv.get_state(), - dv.has_state(DV_ACTIVE), - dv.has_state(DV_HA_CONFIG_CREATED)); - } -#endif - - // if the HA config has already been created and now the value has gone dormant, delete the config - // https://github.com/emsesp/EMS-ESP32/issues/196 - if (dv.has_state(DV_ACTIVE)) { - if (!dv.has_state(DV_HA_CONFIG_CREATED)) { - // add it - Mqtt::publish_ha_sensor_config(dv.type, dv.tag, dv.full_name, dv.device_type, dv.short_name, dv.uom, false, dv.has_cmd); - dv.add_state(DV_HA_CONFIG_CREATED); + if (dv.has_state(DeviceValueState::DV_ACTIVE)) { + // add it if not already done and if it's visible (not on the exclusion list) + // don't do this for commands (like reset) + if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.has_state(DeviceValueState::DV_VISIBLE) && dv.type != DeviceValueType::CMD) { + Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); + dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); + if (create_device_config) { + create_device_config = false; + } } } else { - if (dv.has_state(DV_HA_CONFIG_CREATED)) { - // remove it - Mqtt::publish_ha_sensor_config(dv.type, dv.tag, dv.full_name, dv.device_type, dv.short_name, dv.uom, true, dv.has_cmd); - dv.remove_state(DV_HA_CONFIG_CREATED); + if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED)) { + // if the HA config has already been created and now the value has gone dormant, delete the config + // https://github.com/emsesp/EMS-ESP32/issues/196 + Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), true, create_device_config); // remove /config + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); } } } + + ha_config_done(true); // assume we've created the config } // remove all config topics in HA void EMSdevice::ha_config_clear() { for (auto & dv : devicevalues_) { - Mqtt::publish_ha_sensor_config(dv.type, dv.tag, dv.full_name, dv.device_type, dv.short_name, dv.uom, true, dv.has_cmd); // delete topic - dv.remove_state(DV_HA_CONFIG_CREATED); + Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); } - ha_config_done(false); + + ha_config_done(false); // this will force the recreation of the main HA device config +} + +bool EMSdevice::has_telegram_id(uint16_t id) { + for (const auto & tf : telegram_functions_) { + if (tf.telegram_type_id_ == id) { + return true; + } + } + return false; } // return the name of the telegram type @@ -1165,7 +1272,6 @@ bool EMSdevice::handle_telegram(std::shared_ptr telegram) { tf.fetch_ = false; return false; } - if (telegram->message_length > 0) { tf.received_ = true; tf.process_function_(telegram); @@ -1197,51 +1303,4 @@ void EMSdevice::read_command(const uint16_t type_id, const uint8_t offset, const EMSESP::send_read_request(type_id, device_id(), offset, length); } -// checks whether the device value has an actual value -// returns true if its valid -// state is stored in the dv object -bool EMSdevice::check_dv_hasvalue(const DeviceValue & dv) { - bool has_value = false; - switch (dv.type) { - case DeviceValueType::BOOL: - has_value = Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL); - break; - case DeviceValueType::STRING: - has_value = Helpers::hasValue((char *)(dv.value_p)); - break; - case DeviceValueType::ENUM: - has_value = Helpers::hasValue(*(uint8_t *)(dv.value_p)); - break; - case DeviceValueType::INT: - has_value = Helpers::hasValue(*(int8_t *)(dv.value_p)); - break; - case DeviceValueType::UINT: - has_value = Helpers::hasValue(*(uint8_t *)(dv.value_p)); - break; - case DeviceValueType::SHORT: - has_value = Helpers::hasValue(*(int16_t *)(dv.value_p)); - break; - case DeviceValueType::USHORT: - has_value = Helpers::hasValue(*(uint16_t *)(dv.value_p)); - break; - case DeviceValueType::ULONG: - has_value = Helpers::hasValue(*(uint32_t *)(dv.value_p)); - break; - case DeviceValueType::TIME: - has_value = Helpers::hasValue(*(uint32_t *)(dv.value_p)); - break; - default: - break; - } - -#if defined(EMSESP_DEBUG) - // https://github.com/emsesp/EMS-ESP32/issues/196 - if (dv.has_state(DeviceValueState::DV_ACTIVE) && !has_value) { - EMSESP::logger().warning(F("[DEBUG] Lost device value %s"), dv.short_name); - } -#endif - - return has_value; -} - } // namespace emsesp diff --git a/src/emsdevice.h b/src/emsdevice.h index dd936ccb1..a88b9df5b 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -19,140 +19,35 @@ #ifndef EMSESP_EMSDEVICE_H_ #define EMSESP_EMSDEVICE_H_ -#include -#include -#include - #include "emsfactory.h" #include "telegram.h" #include "mqtt.h" #include "helpers.h" +#include "emsdevicevalue.h" namespace emsesp { -enum DeviceValueType : uint8_t { - BOOL, - INT, - UINT, - SHORT, - USHORT, - ULONG, - TIME, // same as ULONG (32 bits) - ENUM, - STRING, - CMD // special for commands only - -}; - -// Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp. Sequence is important!! -// also used with HA as uom -enum DeviceValueUOM : uint8_t { - - NONE = 0, // 0 - DEGREES, // 1 - PERCENT, // 2 - LMIN, // 3 - KWH, // 4 - WH, // 5 - HOURS, // 6 - MINUTES, // 7 - UA, // 8 - BAR, // 9 - KW, // 10 - W, // 11 - KB, // 12 - SECONDS, // 13 - DBM, // 14 - MV, // 15 - TIMES, // 16 - OCLOCK // 17 - -}; - -// Home Assistant icons (https://materialdesignicons.com) -// the following are used with the UOMs (unit of measurements) -MAKE_PSTR(icondegrees, "mdi:coolant-temperature") // DeviceValueUOM::DEGREES -MAKE_PSTR(iconpercent, "mdi:percent-outline") // DeviceValueUOM::PERCENT -MAKE_PSTR(icontime, "mdi:clock-outline") // DeviceValueUOM::SECONDS MINUTES & HOURS -MAKE_PSTR(iconkb, "mdi:memory") // DeviceValueUOM::KB -MAKE_PSTR(iconlmin, "mdi:water-boiler") // DeviceValueUOM::LMIN -MAKE_PSTR(iconkwh, "mdi:transmission-tower") // DeviceValueUOM::KWH & WH -MAKE_PSTR(iconua, "mdi:lightning-bolt-circle") // DeviceValueUOM::UA -MAKE_PSTR(iconbar, "mdi:gauge") // DeviceValueUOM::BAR -MAKE_PSTR(iconkw, "mdi:omega") // DeviceValueUOM::KW & W -MAKE_PSTR(icondbm, "mdi:wifi-strength-2") // DeviceValueUOM::DBM -MAKE_PSTR(iconnum, "mdi:counter") // DeviceValueUOM::NONE - -MAKE_PSTR(icondevice, "mdi:home-automation") // for devices in HA - -// TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp -enum DeviceValueTAG : uint8_t { - TAG_NONE = 0, // wild card - TAG_HEARTBEAT, - TAG_BOILER_DATA, - TAG_DEVICE_DATA_WW, - TAG_THERMOSTAT_DATA, - TAG_HC1, - TAG_HC2, - TAG_HC3, - TAG_HC4, - TAG_WWC1, - TAG_WWC2, - TAG_WWC3, - TAG_WWC4, - TAG_HS1, - TAG_HS2, - TAG_HS3, - TAG_HS4, - TAG_HS5, - TAG_HS6, - TAG_HS7, - TAG_HS8, - TAG_HS9, - TAG_HS10, - TAG_HS11, - TAG_HS12, - TAG_HS13, - TAG_HS14, - TAG_HS15, - TAG_HS16 - -}; - -// states of a device value -enum DeviceValueState : uint8_t { - - DV_DEFAULT = 0, // 0 - does not yet have a value - DV_ACTIVE = (1 << 0), // 1 - has a value - DV_VISIBLE = (1 << 1), // 2 - shown on web and console - DV_HA_CONFIG_CREATED = (1 << 2) // 4 - set if the HA config has been created - -}; - class EMSdevice { public: virtual ~EMSdevice() = default; // destructor of base class must always be virtual because it's a polymorphic class static constexpr uint8_t EMS_DEVICES_MAX_TELEGRAMS = 20; - // virtual functions overrules by derived classes - virtual bool publish_ha_device_config() = 0; - // device_type defines which derived class to use, e.g. BOILER, THERMOSTAT etc.. - EMSdevice(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) + EMSdevice(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : device_type_(device_type) , device_id_(device_id) , product_id_(product_id) - , version_(version) , name_(name) , flags_(flags) , brand_(brand) { + strlcpy(version_, version, sizeof(version_)); } - const std::string device_type_name() const; + const std::string device_type_name() const; + static const std::string device_type_2_device_name(const uint8_t device_type); static uint8_t device_name_2_device_type(const char * topic); - static const std::string uom_to_string(uint8_t uom); static const std::string tag_to_string(uint8_t tag); static const std::string tag_to_mqtt(uint8_t tag); @@ -191,11 +86,11 @@ class EMSdevice { return device_type_; // see enum DeviceType below } - inline void version(std::string & version) { - version_ = version; + inline void version(const char * version) { + strlcpy(version_, version, sizeof(version_)); } - inline std::string version() const { + inline const char * version() { return version_; } @@ -215,6 +110,7 @@ class EMSdevice { return name_; } + // unique id of a device inline uint8_t unique_id() const { return unique_id_; } @@ -227,8 +123,52 @@ class EMSdevice { return has_update_; } - inline void has_update(bool has_update) { - has_update_ |= has_update; + inline void has_update(bool flag) { + has_update_ = flag; + } + + inline void has_update(void * value) { + has_update_ = true; + publish_value(value); + } + + inline void has_update(char * value, char * newvalue, size_t len) { + if (strcmp(value, newvalue) != 0) { + strlcpy(value, newvalue, len); + has_update_ = true; + publish_value(value); + } + } + + inline void has_update(uint8_t & value, uint8_t newvalue) { + if (value != newvalue) { + value = newvalue; + has_update_ = true; + publish_value((void *)&value); + } + } + + inline void has_enumupdate(std::shared_ptr telegram, uint8_t & value, const uint8_t index, uint8_t s = 0) { + if (telegram->read_enumvalue(value, index, s)) { + has_update_ = true; + publish_value((void *)&value); + } + } + + template + inline void has_update(std::shared_ptr telegram, Value & value, const uint8_t index, uint8_t s = 0) { + if (telegram->read_value(value, index, s)) { + has_update_ = true; + publish_value((void *)&value); + } + } + + template + inline void has_bitupdate(std::shared_ptr telegram, BitValue & value, const uint8_t index, uint8_t b) { + if (telegram->read_bitvalue(value, index, b)) { + has_update_ = true; + publish_value((void *)&value); + } } const std::string brand_to_string() const; @@ -237,10 +177,13 @@ class EMSdevice { const std::string to_string() const; const std::string to_string_short() const; + enum Handlers : uint8_t { ALL, RECEIVED, FETCHED, PENDING }; + void show_telegram_handlers(uuid::console::Shell & shell); - char * show_telegram_handlers(char * result); + char * show_telegram_handlers(char * result, uint8_t handlers); void show_mqtt_handlers(uuid::console::Shell & shell); void list_device_entries(JsonObject & output); + void exclude_entity(uint8_t entity_id); using process_function_p = std::function)>; @@ -249,10 +192,12 @@ class EMSdevice { const std::string get_value_uom(const char * key); bool get_value_info(JsonObject & root, const char * cmd, const int8_t id); + void get_dv_info(JsonObject & json); enum OUTPUT_TARGET : uint8_t { API_VERBOSE, API_SHORTNAMES, MQTT }; - bool generate_values_json(JsonObject & output, const uint8_t tag_filter, const bool nested, const uint8_t output_target); - void generate_values_json_web(JsonObject & output); + bool generate_values(JsonObject & output, const uint8_t tag_filter, const bool nested, const uint8_t output_target); + void generate_values_web(JsonObject & output); + void generate_values_web_all(JsonArray & output); void register_device_value(uint8_t tag, void * value_p, @@ -262,8 +207,9 @@ class EMSdevice { const __FlashStringHelper * full_name, uint8_t uom, bool has_cmd, - int32_t min, - uint32_t max); + int16_t min, + uint16_t max); + void register_device_value(uint8_t tag, void * value_p, uint8_t type, @@ -271,8 +217,9 @@ class EMSdevice { const __FlashStringHelper * const * name, uint8_t uom, const cmd_function_p f, - int32_t min, - uint32_t max); + int16_t min, + uint16_t max); + void register_device_value(uint8_t tag, void * value_p, uint8_t type, @@ -280,6 +227,7 @@ class EMSdevice { const __FlashStringHelper * const * name, uint8_t uom, const cmd_function_p f); + void register_device_value(uint8_t tag, void * value_p, uint8_t type, @@ -293,6 +241,9 @@ class EMSdevice { void read_command(const uint16_t type_id, uint8_t offset = 0, uint8_t length = 0); + void publish_value(void * value); + void publish_all_values(); + void publish_mqtt_ha_entity_config(); const std::string telegram_type_name(std::shared_ptr telegram); @@ -300,16 +251,22 @@ class EMSdevice { void fetch_values(); void toggle_fetch(uint16_t telegram_id, bool toggle); bool is_fetch(uint16_t telegram_id); + bool has_telegram_id(uint16_t id); + void ha_config_clear(); bool ha_config_done() const { return ha_config_done_; } - void ha_config_done(const bool v) { ha_config_done_ = v; } - void ha_config_clear(); + bool ha_config_firstrun() const { + return ha_config_firstrun_; + } + void ha_config_firstrun(const bool v) { + ha_config_firstrun_ = v; + } enum Brand : uint8_t { NO_BRAND = 0, // 0 @@ -325,6 +282,7 @@ class EMSdevice { enum DeviceType : uint8_t { SYSTEM = 0, // this is us (EMS-ESP) DALLASSENSOR, // for internal dallas sensors + ANALOGSENSOR, // for internal analog sensors BOILER, THERMOSTAT, MIXER, @@ -374,34 +332,31 @@ class EMSdevice { static constexpr uint8_t EMS_DEVICE_FLAG_RC10 = 2; static constexpr uint8_t EMS_DEVICE_FLAG_RC20 = 3; static constexpr uint8_t EMS_DEVICE_FLAG_RC20_N = 4; // Variation on RC20, Older, like ES72 - static constexpr uint8_t EMS_DEVICE_FLAG_RC30_N = 5; // variation on RC30, Newer models - static constexpr uint8_t EMS_DEVICE_FLAG_RC30 = 6; - static constexpr uint8_t EMS_DEVICE_FLAG_RC35 = 7; - static constexpr uint8_t EMS_DEVICE_FLAG_RC300 = 8; - static constexpr uint8_t EMS_DEVICE_FLAG_RC100 = 9; - static constexpr uint8_t EMS_DEVICE_FLAG_JUNKERS = 10; - static constexpr uint8_t EMS_DEVICE_FLAG_CRF = 11; // CRF200 only monitor + static constexpr uint8_t EMS_DEVICE_FLAG_RC25 = 5; + static constexpr uint8_t EMS_DEVICE_FLAG_RC30_N = 6; // variation on RC30, Newer models + static constexpr uint8_t EMS_DEVICE_FLAG_RC30 = 7; + static constexpr uint8_t EMS_DEVICE_FLAG_RC35 = 8; + static constexpr uint8_t EMS_DEVICE_FLAG_RC300 = 9; + static constexpr uint8_t EMS_DEVICE_FLAG_RC100 = 10; + static constexpr uint8_t EMS_DEVICE_FLAG_JUNKERS = 11; + static constexpr uint8_t EMS_DEVICE_FLAG_CRF = 12; // CRF200 only monitor - void reserve_device_values(uint8_t elements) { - devicevalues_.reserve(elements); - } - - void reserve_telgram_functions(uint8_t elements) { - telegram_functions_.reserve(elements); - } + uint8_t count_entities(); + bool has_entities(); private: uint8_t unique_id_; uint8_t device_type_ = DeviceType::SYSTEM; uint8_t device_id_ = 0; uint8_t product_id_ = 0; - std::string version_; + char version_[6]; std::string name_; // the long name for the EMS model uint8_t flags_ = 0; uint8_t brand_ = Brand::NO_BRAND; - bool ha_config_done_ = false; - bool has_update_ = false; + bool ha_config_done_ = false; + bool has_update_ = false; + bool ha_config_firstrun_ = true; // this means a first setup of HA is needed after a restart struct TelegramFunction { uint16_t telegram_type_id_; // it's type_id @@ -419,78 +374,14 @@ class EMSdevice { } }; - // DeviceValue holds all the attributes for a device value (also a device parameter) - struct DeviceValue { - uint8_t device_type; // EMSdevice::DeviceType - uint8_t tag; // DeviceValueTAG::* - void * value_p; // pointer to variable of any type - uint8_t type; // DeviceValueType::* - const __FlashStringHelper * const * options; // options as a flash char array - uint8_t options_size; // number of options in the char array, calculated - const __FlashStringHelper * short_name; // used in MQTT - const __FlashStringHelper * full_name; // used in Web and Console - uint8_t uom; // DeviceValueUOM::* - uint8_t ha; // DevcieValueHA:: - bool has_cmd; // true if there is a Console/MQTT command which matches the short_name - int32_t min; - uint32_t max; - uint8_t state; // DeviceValueState::* - - DeviceValue(uint8_t device_type, - uint8_t tag, - void * value_p, - uint8_t type, - const __FlashStringHelper * const * options, - uint8_t options_size, - const __FlashStringHelper * short_name, - const __FlashStringHelper * full_name, - uint8_t uom, - uint8_t ha, - bool has_cmd, - int32_t min, - uint32_t max, - uint8_t state) - : device_type(device_type) - , tag(tag) - , value_p(value_p) - , type(type) - , options(options) - , options_size(options_size) - , short_name(short_name) - , full_name(full_name) - , uom(uom) - , ha(ha) - , has_cmd(has_cmd) - , min(min) - , max(max) - , state(state) { - } - - // state flags - inline void add_state(uint8_t s) { - state |= s; - } - inline bool has_state(uint8_t s) const { - return (state & s) == s; - } - inline void remove_state(uint8_t s) { - state &= ~s; - } - inline uint8_t get_state() const { - return state; - } - }; - const std::vector devicevalues() const; - std::vector telegram_functions_; // each EMS device has its own set of registered telegram types - std::vector devicevalues_; - const std::string device_entity_ha(DeviceValue const & dv); + // device values + std::vector devicevalues_; - bool check_dv_hasvalue(const DeviceValue & dv); - - void init_devicevalues(uint8_t size) { - devicevalues_.reserve(size); + uint8_t dv_index_ = 0; // unique counter for each added device value + uint8_t get_next_dv_id() { + return (dv_index_++); } }; diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp new file mode 100644 index 000000000..037829b21 --- /dev/null +++ b/src/emsdevicevalue.cpp @@ -0,0 +1,250 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "emsdevicevalue.h" + +#include "emsesp.h" + +namespace emsesp { + +// mapping of UOM, to match order in DeviceValueUOM enum emsdevice.h +// also maps to DeviceValueUOM in interface/src/project/types.ts for the Web UI +// must be an int of 4 bytes, 32bit aligned +const __FlashStringHelper * DeviceValue::DeviceValueUOM_s[] __attribute__((__aligned__(sizeof(uint32_t)))) PROGMEM = { + + F_(blank), + F_(degrees), + F_(degrees), + F_(percent), + F_(lmin), + F_(kwh), + F_(wh), + F_(hours), + F_(minutes), + F_(ua), + F_(bar), + F_(kw), + F_(w), + F_(kb), + F_(seconds), + F_(dbm), + F_(fahrenheit), + F_(mv), + F_(sqm) + +}; + +// mapping of TAGs, to match order in DeviceValueTAG enum in emsdevice.h +// must be an int of 4 bytes, 32bit aligned +const __FlashStringHelper * const DeviceValue::DeviceValueTAG_s[] PROGMEM = { + + F_(tag_none), // "" + F_(tag_heartbeat), // "" + F_(tag_boiler_data), // "" + F_(tag_device_data_ww), // "ww" + F_(tag_thermostat_data), // "" + F_(tag_hc1), // "hc1" + F_(tag_hc2), // "hc2" + F_(tag_hc3), // "hc3" + F_(tag_hc4), // "hc4" + F_(tag_hc5), // "hc5" + F_(tag_hc6), // "hc6" + F_(tag_hc7), // "hc7" + F_(tag_hc8), // "hc8" + F_(tag_wwc1), // "wwc1" + F_(tag_wwc2), // "Wwc2" + F_(tag_wwc3), // "wwc3" + F_(tag_wwc4), // "wwc4" + F_(tag_hs1), // "hs1" + F_(tag_hs2), // "hs2" + F_(tag_hs3), // "hs3" + F_(tag_hs4), // "hs4" + F_(tag_hs5), // "hs5" + F_(tag_hs6), // "hs6" + F_(tag_hs7), // "hs7" + F_(tag_hs8), // "hs8" + F_(tag_hs9), // "hs9" + F_(tag_hs10), // "hs10" + F_(tag_hs11), // "hs11" + F_(tag_hs12), // "hs12" + F_(tag_hs13), // "hs13" + F_(tag_hs14), // "hs14" + F_(tag_hs15), // "hs15" + F_(tag_hs16) // "hs16" + +}; + +// MQTT topics derived from tags +const __FlashStringHelper * const DeviceValue::DeviceValueTAG_mqtt[] PROGMEM = { + + F_(tag_none), // "" + F_(heartbeat), // "heartbeat" + F_(tag_boiler_data_mqtt), // "" + F_(tag_device_data_ww_mqtt), // "ww" + F_(tag_thermostat_data), // "" + F_(tag_hc1), // "hc1" + F_(tag_hc2), // "hc2" + F_(tag_hc3), // "hc3" + F_(tag_hc4), // "hc4" + F_(tag_hc5), // "hc5" + F_(tag_hc6), // "hc6" + F_(tag_hc7), // "hc7" + F_(tag_hc8), // "hc8" + F_(tag_wwc1), // "wwc1" + F_(tag_wwc2), // "Wwc2" + F_(tag_wwc3), // "wwc3" + F_(tag_wwc4), // "wwc4" + F_(tag_hs1), // "hs1" + F_(tag_hs2), // "hs2" + F_(tag_hs3), // "hs3" + F_(tag_hs4), // "hs4" + F_(tag_hs5), // "hs5" + F_(tag_hs6), // "hs6" + F_(tag_hs7), // "hs7" + F_(tag_hs8), // "hs8" + F_(tag_hs9), // "hs9" + F_(tag_hs10), // "hs10" + F_(tag_hs11), // "hs11" + F_(tag_hs12), // "hs12" + F_(tag_hs13), // "hs13" + F_(tag_hs14), // "hs14" + F_(tag_hs15), // "hs15" + F_(tag_hs16) // "hs16" + +}; + +// count #tags once at compile time +size_t DeviceValue::tag_count = sizeof(DeviceValue::DeviceValueTAG_s) / sizeof(__FlashStringHelper *); + +// checks whether the device value has an actual value +// returns true if its valid +// state is stored in the dv object +bool DeviceValue::hasValue() { + bool has_value = false; + switch (type) { + case DeviceValueType::BOOL: + has_value = Helpers::hasValue(*(uint8_t *)(value_p), EMS_VALUE_BOOL); + break; + case DeviceValueType::STRING: + has_value = Helpers::hasValue((char *)(value_p)); + break; + case DeviceValueType::ENUM: + has_value = Helpers::hasValue(*(uint8_t *)(value_p)); + break; + case DeviceValueType::INT: + has_value = Helpers::hasValue(*(int8_t *)(value_p)); + break; + case DeviceValueType::UINT: + has_value = Helpers::hasValue(*(uint8_t *)(value_p)); + break; + case DeviceValueType::SHORT: + has_value = Helpers::hasValue(*(int16_t *)(value_p)); + break; + case DeviceValueType::USHORT: + has_value = Helpers::hasValue(*(uint16_t *)(value_p)); + break; + case DeviceValueType::ULONG: + has_value = Helpers::hasValue(*(uint32_t *)(value_p)); + break; + case DeviceValueType::TIME: + has_value = Helpers::hasValue(*(uint32_t *)(value_p)); + break; + case DeviceValueType::CMD: + has_value = false; // commands don't have values! + break; + default: + break; + } + +#if defined(EMSESP_DEBUG) + // https://github.com/emsesp/EMS-ESP32/issues/196 + // if (has_state(DeviceValueState::DV_ACTIVE) && !has_value) { + // emsesp::EMSESP::logger().warning(F("[DEBUG] Lost device value %s"), short_name); + // } +#endif + + return has_value; +} + +// set the min and max value for a device value +// converts to signed int, which means rounding to an whole integer +// returns false if there is no min/max needed +// Types BOOL, ENUM, STRING and CMD are not used +bool DeviceValue::get_min_max(int16_t & dv_set_min, int16_t & dv_set_max) { + uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (uom == DeviceValueUOM::DEGREES) ? 2 : (uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; + + // if we have individual limits set already, just do the conversion + // limits are not scaled with divider and temperatures are °C + if (min != 0 || max != 0) { + dv_set_min = Helpers::round2(min, 0, fahrenheit); + dv_set_max = Helpers::round2(max, 0, fahrenheit); + return true; + } + + // init default values to 0 and 0 + dv_set_min = 0; + dv_set_max = 0; + + int8_t divider = (options_size == 1) ? Helpers::atoint(uuid::read_flash_string(options[0]).c_str()) : 0; + + if (type == DeviceValueType::USHORT) { + dv_set_min = Helpers::round2(0, divider, fahrenheit); + dv_set_max = Helpers::round2(EMS_VALUE_USHORT_NOTSET, divider, fahrenheit); + return true; + } + + if (type == DeviceValueType::SHORT) { + dv_set_min = Helpers::round2(-EMS_VALUE_SHORT_NOTSET, divider, fahrenheit); + dv_set_max = Helpers::round2(EMS_VALUE_SHORT_NOTSET, divider, fahrenheit); + return true; + } + + if (type == DeviceValueType::UINT) { + if (uom == DeviceValueUOM::PERCENT) { + dv_set_max = 100; + } else { + dv_set_max = Helpers::round2(EMS_VALUE_UINT_NOTSET, divider, fahrenheit); + } + return true; + } + + if (type == DeviceValueType::INT) { + if (uom == DeviceValueUOM::PERCENT) { + dv_set_min = -100; + dv_set_max = 100; + } else { + dv_set_min = Helpers::round2(-EMS_VALUE_INT_NOTSET, divider, fahrenheit); + dv_set_max = Helpers::round2(EMS_VALUE_INT_NOTSET, divider, fahrenheit); + } + return true; + } + + if (type == DeviceValueType::ULONG) { + dv_set_max = Helpers::round2(EMS_VALUE_ULONG_NOTSET, divider); + return true; + } + + if (type == DeviceValueType::TIME) { + dv_set_max = Helpers::round2(EMS_VALUE_ULONG_NOTSET, divider); + return true; + } + + return false; // nothing changed, not supported +} + +} // namespace emsesp diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h new file mode 100644 index 000000000..9b7512e7f --- /dev/null +++ b/src/emsdevicevalue.h @@ -0,0 +1,190 @@ + +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef EMSESP_EMSDEVICEVALUE_H_ +#define EMSESP_EMSDEVICEVALUE_H_ + +#include +#include + +#include "helpers.h" // for conversions +#include "default_settings.h" // for enum types +#include // for read_flash_string + +namespace emsesp { + +// DeviceValue holds the information for a device entity +class DeviceValue { + public: + enum DeviceValueType : uint8_t { + BOOL, + INT, + UINT, + SHORT, + USHORT, + ULONG, + TIME, // same as ULONG (32 bits) + ENUM, + STRING, + CMD // special for commands only + }; + + // Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp. Sequence is important!! + // also used with HA as uom + enum DeviceValueUOM : uint8_t { + NONE = 0, // 0 + DEGREES, // 1 + DEGREES_R, // 2 + PERCENT, // 3 + LMIN, // 4 + KWH, // 5 + WH, // 6 + HOURS, // 7 + MINUTES, // 8 + UA, // 9 + BAR, // 10 + KW, // 11 + W, // 12 + KB, // 13 + SECONDS, // 14 + DBM, // 15 + FAHRENHEIT, // 16 + MV, // 17 + SQM // 18 + }; + + // TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp + enum DeviceValueTAG : uint8_t { + TAG_NONE = 0, // wild card + TAG_HEARTBEAT, + TAG_BOILER_DATA, + TAG_DEVICE_DATA_WW, + TAG_THERMOSTAT_DATA, + TAG_HC1, + TAG_HC2, + TAG_HC3, + TAG_HC4, + TAG_HC5, + TAG_HC6, + TAG_HC7, + TAG_HC8, + TAG_WWC1, + TAG_WWC2, + TAG_WWC3, + TAG_WWC4, + TAG_HS1, + TAG_HS2, + TAG_HS3, + TAG_HS4, + TAG_HS5, + TAG_HS6, + TAG_HS7, + TAG_HS8, + TAG_HS9, + TAG_HS10, + TAG_HS11, + TAG_HS12, + TAG_HS13, + TAG_HS14, + TAG_HS15, + TAG_HS16 + }; + + // states of a device value + enum DeviceValueState : uint8_t { + DV_DEFAULT = 0, // 0 - does not yet have a value + DV_ACTIVE = (1 << 0), // 1 - has a valid value + DV_VISIBLE = (1 << 1), // 2 - shown on web and console, otherwise hidden + DV_HA_CONFIG_CREATED = (1 << 2) // 4 - set if the HA config has been created + }; + + uint8_t device_type; // EMSdevice::DeviceType + uint8_t tag; // DeviceValueTAG::* + void * value_p; // pointer to variable of any type + uint8_t type; // DeviceValueType::* + const __FlashStringHelper * const * options; // options as a flash char array + uint8_t options_size; // number of options in the char array, calculated + const __FlashStringHelper * short_name; // used in MQTT + const __FlashStringHelper * full_name; // used in Web and Console + uint8_t uom; // DeviceValueUOM::* + uint8_t ha; // DevcieValueHA:: + bool has_cmd; // true if there is a Console/MQTT command which matches the short_name + int16_t min; // min range + uint16_t max; // max range + uint8_t state; // DeviceValueState::* + uint8_t id; // internal unique counter + + DeviceValue(uint8_t device_type, + uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const * options, + uint8_t options_size, + const __FlashStringHelper * short_name, + const __FlashStringHelper * full_name, + uint8_t uom, + uint8_t ha, + bool has_cmd, + int16_t min, + uint16_t max, + uint8_t state, + uint8_t id) + : device_type(device_type) + , tag(tag) + , value_p(value_p) + , type(type) + , options(options) + , options_size(options_size) + , short_name(short_name) + , full_name(full_name) + , uom(uom) + , ha(ha) + , has_cmd(has_cmd) + , min(min) + , max(max) + , state(state) + , id(id) { + } + + bool hasValue(); + bool get_min_max(int16_t & dv_set_min, int16_t & dv_set_max); + + // state flags + inline void add_state(uint8_t s) { + state |= s; + } + inline bool has_state(uint8_t s) const { + return (state & s) == s; + } + inline void remove_state(uint8_t s) { + state &= ~s; + } + inline uint8_t get_state() const { + return state; + } + + static const __FlashStringHelper * DeviceValueUOM_s[]; + static const __FlashStringHelper * const DeviceValueTAG_s[]; + static const __FlashStringHelper * const DeviceValueTAG_mqtt[]; + static size_t tag_count; // # tags +}; + +}; // namespace emsesp + +#endif diff --git a/src/emsesp.cpp b/src/emsesp.cpp index d31849933..1485f7150 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -23,18 +23,20 @@ namespace emsesp { #if defined(EMSESP_STANDALONE) uint32_t heap_start = 0; #else -uint32_t heap_start = ESP.getFreeHeap(); // get initial available heap memory +uint32_t heap_start = ESP.getFreeHeap(); // get initial available heap memory #endif AsyncWebServer webServer(80); #if defined(EMSESP_STANDALONE) -FS dummyFS; -ESP8266React EMSESP::esp8266React(&webServer, &dummyFS); -WebSettingsService EMSESP::webSettingsService = WebSettingsService(&webServer, &dummyFS, EMSESP::esp8266React.getSecurityManager()); +FS dummyFS; +ESP8266React EMSESP::esp8266React(&webServer, &dummyFS); +WebSettingsService EMSESP::webSettingsService = WebSettingsService(&webServer, &dummyFS, EMSESP::esp8266React.getSecurityManager()); +WebCustomizationService EMSESP::webCustomizationService = WebCustomizationService(&webServer, &dummyFS, EMSESP::esp8266React.getSecurityManager()); #else -ESP8266React EMSESP::esp8266React(&webServer, &LITTLEFS); -WebSettingsService EMSESP::webSettingsService = WebSettingsService(&webServer, &LITTLEFS, EMSESP::esp8266React.getSecurityManager()); +ESP8266React EMSESP::esp8266React(&webServer, &LITTLEFS); +WebSettingsService EMSESP::webSettingsService = WebSettingsService(&webServer, &LITTLEFS, EMSESP::esp8266React.getSecurityManager()); +WebCustomizationService EMSESP::webCustomizationService = WebCustomizationService(&webServer, &LITTLEFS, EMSESP::esp8266React.getSecurityManager()); #endif WebStatusService EMSESP::webStatusService = WebStatusService(&webServer, EMSESP::esp8266React.getSecurityManager()); @@ -60,6 +62,7 @@ Mqtt EMSESP::mqtt_; // mqtt handler System EMSESP::system_; // core system services Console EMSESP::console_; // telnet and serial console DallasSensor EMSESP::dallassensor_; // Dallas sensors +AnalogSensor EMSESP::analogsensor_; // Analog sensors Shower EMSESP::shower_; // Shower logic // static/common variables @@ -74,8 +77,6 @@ uint32_t EMSESP::last_fetch_ = 0; uint8_t EMSESP::publish_all_idx_ = 0; uint8_t EMSESP::unique_id_count_ = 0; bool EMSESP::trace_raw_ = false; -uint8_t EMSESP::bool_format_ = 1; -uint8_t EMSESP::enum_format_ = 1; uint16_t EMSESP::wait_validate_ = 0; bool EMSESP::wait_km_ = true; @@ -94,7 +95,7 @@ void EMSESP::fetch_device_values(const uint8_t device_id) { } } -// see if the device ID exists +// see if the deviceID exists bool EMSESP::valid_device(const uint8_t device_id) { for (const auto & emsdevice : emsdevices) { if (emsdevice) { @@ -117,7 +118,7 @@ void EMSESP::fetch_device_values_type(const uint8_t device_type) { // clears list of recognized devices void EMSESP::clear_all_devices() { - // temporary removed: clearing the list causes a crash, the associated commands and mqtt should also be removed. + // temporarily removed: clearing the list causes a crash, the associated commands and mqtt should also be removed. // emsdevices.clear(); // remove entries, but doesn't delete actual devices } @@ -132,6 +133,36 @@ uint8_t EMSESP::count_devices(const uint8_t device_type) { return count; } +// return total number of devices excluding the Controller +uint8_t EMSESP::count_devices() { + uint8_t count = 0; + for (const auto & emsdevice : emsdevices) { + if (emsdevice) { + count += (emsdevice->device_type() != EMSdevice::DeviceType::CONTROLLER); + } + } + return count; +} + +// returns the index of a device if there are more of the same type +// or 0 if there is only one or none +uint8_t EMSESP::device_index(const uint8_t device_type, const uint8_t unique_id) { + if (count_devices(device_type) <= 1) { + return 0; // none or only 1 device exists + } + uint8_t index = 1; + for (const auto & emsdevice : emsdevices) { + if (emsdevice->device_type() == device_type) { + // did we find it? + if (emsdevice->unique_id() == unique_id) { + return index; + } + index++; + } + } + return 0; // didn't find it +} + // scans for new devices void EMSESP::scan_devices() { EMSESP::clear_all_devices(); @@ -139,19 +170,20 @@ void EMSESP::scan_devices() { } /** -* if thermostat master is 0x18 it handles only ww and hc1, hc2..hc4 handled by devices 0x19..0x1B +* if thermostat master is 0x18 it handles only ww and hc1, hc2..hc8 handled by devices 0x19..0x1F * we send to right device and match all reads to 0x18 */ uint8_t EMSESP::check_master_device(const uint8_t device_id, const uint16_t type_id, const bool read) { if (actual_master_thermostat_ == 0x18) { - uint16_t mon_ids[4] = {0x02A5, 0x02A6, 0x02A7, 0x02A8}; - uint16_t set_ids[4] = {0x02B9, 0x02BA, 0x02BB, 0x02BC}; - uint16_t summer_ids[4] = {0x02AF, 0x02B0, 0x02B1, 0x02B2}; - uint16_t curve_ids[4] = {0x029B, 0x029C, 0x029D, 0x029E}; + uint16_t mon_ids[] = {0x02A5, 0x02A6, 0x02A7, 0x02A8, 0x02A9, 0x02AA, 0x02AB, 0x02AC}; + uint16_t set_ids[] = {0x02B9, 0x02BA, 0x02BB, 0x02BC, 0x02BD, 0x02BE, 0x02BF, 0x02C0}; + uint16_t summer_ids[] = {0x02AF, 0x02B0, 0x02B1, 0x02B2, 0x02B3, 0x02B4, 0x02B5, 0x02B6}; + uint16_t curve_ids[] = {0x029B, 0x029C, 0x029D, 0x029E, 0x029F, 0x02A0, 0x02A1, 0x02A2}; + uint16_t summer2_ids[] = {0x0471, 0x0472, 0x0473, 0x0474, 0x0475, 0x0476, 0x0477, 0x0478}; uint16_t master_ids[] = {0x02F5, 0x031B, 0x031D, 0x031E, 0x023A, 0x0267, 0x0240}; // look for heating circuits - for (uint8_t i = 0; i < 4; i++) { - if (type_id == mon_ids[i] || type_id == set_ids[i] || type_id == summer_ids[i] || type_id == curve_ids[i]) { + for (uint8_t i = 0; i < sizeof(mon_ids) / 2; i++) { + if (type_id == mon_ids[i] || type_id == set_ids[i] || type_id == summer_ids[i] || type_id == curve_ids[i] || type_id == summer2_ids[i]) { if (read) { // receiving telegrams and map all to master thermostat at 0x18 (src manipulated) return 0x18; @@ -180,7 +212,7 @@ uint8_t EMSESP::actual_master_thermostat() { return actual_master_thermostat_; } -// to watch both type IDs and device IDs +// to watch both type IDs and deviceIDs void EMSESP::watch_id(uint16_t watch_id) { watch_id_ = watch_id; } @@ -222,20 +254,21 @@ uint8_t EMSESP::bus_status() { // check if we have Tx issues. uint32_t total_sent = txservice_.telegram_read_count() + txservice_.telegram_write_count(); + uint32_t total_fail = txservice_.telegram_read_fail_count() + txservice_.telegram_write_fail_count(); // nothing sent and also no errors - must be ok - if ((total_sent == 0) && (txservice_.telegram_fail_count() == 0)) { + if ((total_sent == 0) && (total_fail == 0)) { return BUS_STATUS_CONNECTED; } // nothing sent, but have Tx errors - if ((total_sent == 0) && (txservice_.telegram_fail_count() != 0)) { + if ((total_sent == 0) && (total_fail != 0)) { return BUS_STATUS_TX_ERRORS; } // Tx Failure rate > 10% - if (txservice_.telegram_fail_count() < total_sent) { - if (((txservice_.telegram_fail_count() * 100) / total_sent) > EMSbus::EMS_TX_ERROR_LIMIT) { + if (total_fail < total_sent) { + if (((total_fail * 100) / total_sent) > EMSbus::EMS_TX_ERROR_LIMIT) { return BUS_STATUS_TX_ERRORS; } } @@ -265,13 +298,15 @@ void EMSESP::show_ems(uuid::console::Shell & shell) { shell.printfln(F("EMS Bus info:")); EMSESP::webSettingsService.read([&](WebSettings & settings) { shell.printfln(F(" Tx mode: %d"), settings.tx_mode); }); shell.printfln(F(" Bus protocol: %s"), EMSbus::is_ht3() ? F("HT3") : F("Buderus")); + shell.printfln(F(" #recognized EMS devices: %d"), (EMSESP::emsdevices).size()); shell.printfln(F(" #telegrams received: %d"), rxservice_.telegram_count()); shell.printfln(F(" #read requests sent: %d"), txservice_.telegram_read_count()); shell.printfln(F(" #write requests sent: %d"), txservice_.telegram_write_count()); shell.printfln(F(" #incomplete telegrams: %d"), rxservice_.telegram_error_count()); - shell.printfln(F(" #tx fails (after %d retries): %d"), TxService::MAXIMUM_TX_RETRIES, txservice_.telegram_fail_count()); + shell.printfln(F(" #read fails (after %d retries): %d"), TxService::MAXIMUM_TX_RETRIES, txservice_.telegram_read_fail_count()); + shell.printfln(F(" #write fails (after %d retries): %d"), TxService::MAXIMUM_TX_RETRIES, txservice_.telegram_write_fail_count()); shell.printfln(F(" Rx line quality: %d%%"), rxservice_.quality()); - shell.printfln(F(" Tx line quality: %d%%"), txservice_.quality()); + shell.printfln(F(" Tx line quality: %d%%"), (txservice_.read_quality() + txservice_.read_quality()) / 2); shell.println(); } @@ -315,7 +350,7 @@ void EMSESP::show_ems(uuid::console::Shell & shell) { // generate_values_json is called in verbose mode void EMSESP::show_device_values(uuid::console::Shell & shell) { if (emsdevices.empty()) { - shell.printfln(F("No EMS devices detected. Try using 'scan devices' from the ems menu.")); + shell.printfln(F("No EMS devices detected.")); shell.println(); return; } @@ -325,11 +360,12 @@ void EMSESP::show_device_values(uuid::console::Shell & shell) { for (const auto & emsdevice : emsdevices) { if ((emsdevice) && (emsdevice->device_type() == device_class.first)) { // print header - shell.printfln(F("%s: %s"), emsdevice->device_type_name().c_str(), emsdevice->to_string().c_str()); + shell.printfln(F("%s: %s (%d)"), emsdevice->device_type_name().c_str(), emsdevice->to_string().c_str(), emsdevice->count_entities()); - DynamicJsonDocument doc(EMSESP_JSON_SIZE_XLARGE_DYN); // use max size + DynamicJsonDocument doc(EMSESP_JSON_SIZE_XXLARGE_DYN); // use max size JsonObject json = doc.to(); - emsdevice->generate_values_json(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::API_VERBOSE); // verbose mode and nested + + emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::API_VERBOSE); // verbose mode and nested // print line uint8_t id = 0; @@ -351,6 +387,9 @@ void EMSESP::show_device_values(uuid::console::Shell & shell) { // if there is a uom print it std::string uom = emsdevice->get_value_uom(key); + if (uom == "°C" && EMSESP::system_.fahrenheit()) { + uom = "°F"; + } if (!uom.empty()) { shell.print(' '); shell.print(uom); @@ -366,24 +405,64 @@ void EMSESP::show_device_values(uuid::console::Shell & shell) { } } -// show Dallas temperature sensors +// show Dallas temperature sensors and Analog sensors void EMSESP::show_sensor_values(uuid::console::Shell & shell) { - if (!have_sensors()) { - return; + if (dallassensor_.have_sensors()) { + shell.printfln(F("Temperature sensors:")); + char s[10]; + char s2[10]; + uint8_t fahrenheit = EMSESP::system_.fahrenheit() ? 2 : 0; + + for (const auto & sensor : dallassensor_.sensors()) { + if (Helpers::hasValue(sensor.temperature_c)) { + shell.printfln(F(" %s: %s%s °%c%s (offset %s, ID: %s)"), + sensor.name().c_str(), + COLOR_BRIGHT_GREEN, + Helpers::render_value(s, sensor.temperature_c, 10, fahrenheit), + (fahrenheit == 0) ? 'C' : 'F', + COLOR_RESET, + Helpers::render_value(s2, sensor.offset(), 10, fahrenheit), + sensor.id_str().c_str()); + } else { + shell.printfln(F(" %s (offset %s, ID: %s)"), + sensor.name().c_str(), + Helpers::render_value(s, sensor.offset(), 10, fahrenheit), + sensor.id_str().c_str()); + } + } + shell.println(); } - shell.printfln(F("Dallas temperature sensors:")); - uint8_t i = 1; - char s[7]; - char s2[7]; - for (const auto & device : sensor_devices()) { - shell.printfln(F(" Sensor %d, ID: %s, Temperature: %s °C (offset %s)"), - i++, - device.to_string().c_str(), - Helpers::render_value(s, device.temperature_c, 10), - Helpers::render_value(s2, device.offset(), 10)); + if (analogsensor_.have_sensors()) { + char s[10]; + char s2[10]; + shell.printfln(F("Analog sensors:")); + for (const auto & sensor : analogsensor_.sensors()) { + switch (sensor.type()) { + case AnalogSensor::AnalogType::ADC: + shell.printfln(F(" %s: %s%s %s%s (Type: ADC, Factor: %s, Offset: %d)"), + sensor.name().c_str(), + COLOR_BRIGHT_GREEN, + Helpers::render_value(s, sensor.value(), 2), + EMSdevice::uom_to_string(sensor.uom()).c_str(), + COLOR_RESET, + Helpers::render_value(s2, sensor.factor(), 4), + sensor.offset()); + break; + default: + case AnalogSensor::AnalogType::DIGITAL_IN: + case AnalogSensor::AnalogType::COUNTER: + shell.printfln(F(" %s: %s%d%s (Type: %s)"), + sensor.name().c_str(), + COLOR_BRIGHT_GREEN, + (uint16_t)sensor.value(), // as int + COLOR_RESET, + sensor.type() == AnalogSensor::AnalogType::COUNTER ? "Counter" : "Digital in"); + break; + } + } + shell.println(); } - shell.println(); } // MQTT publish everything, immediately @@ -393,13 +472,14 @@ void EMSESP::publish_all(bool force) { reset_mqtt_ha(); return; } + if (Mqtt::connected()) { publish_device_values(EMSdevice::DeviceType::BOILER); publish_device_values(EMSdevice::DeviceType::THERMOSTAT); publish_device_values(EMSdevice::DeviceType::SOLAR); publish_device_values(EMSdevice::DeviceType::MIXER); - publish_other_values(); - publish_sensor_values(true); + publish_other_values(); // switch and heat pump + publish_sensor_values(true); // includes dallas and analog sensors system_.send_heartbeat(); } } @@ -409,10 +489,12 @@ void EMSESP::publish_all_loop() { if (!Mqtt::connected() || !publish_all_idx_) { return; } - // wait for free queue before sending next message, v3 queues HA-messages + + // wait for free queue before sending next message, HA-messages are also queued if (!Mqtt::is_empty()) { return; } + switch (publish_all_idx_++) { case 1: publish_device_values(EMSdevice::DeviceType::BOILER); @@ -427,7 +509,7 @@ void EMSESP::publish_all_loop() { publish_device_values(EMSdevice::DeviceType::MIXER); break; case 5: - publish_other_values(); + publish_other_values(); // switch and heat pump break; case 6: publish_sensor_values(true, true); @@ -444,7 +526,8 @@ void EMSESP::publish_all_loop() { } } -// force HA to re-create all the devices +// force HA to re-create all the devices next time they are detected +// also removes the old HA topics void EMSESP::reset_mqtt_ha() { if (!Mqtt::ha_enabled()) { return; @@ -454,27 +537,38 @@ void EMSESP::reset_mqtt_ha() { emsdevice->ha_config_clear(); } dallassensor_.reload(); + analogsensor_.reload(); } // create json doc for the devices values and add to MQTT publish queue +// this will also create the HA /config topic // generate_values_json is called to build the device value (dv) object array void EMSESP::publish_device_values(uint8_t device_type) { DynamicJsonDocument doc(EMSESP_JSON_SIZE_XLARGE_DYN); // use max size JsonObject json = doc.to(); bool need_publish = false; - bool nested = (Mqtt::nested_format() == 1); // 1 is nested, 2 is single + bool nested = (Mqtt::is_nested()); // group by device type for (const auto & emsdevice : emsdevices) { if (emsdevice && (emsdevice->device_type() == device_type)) { + // specially for HA + // we may have some RETAINED /config topics that reference fields in the data payloads that no longer exist + // remove them immediately to prevent HA from complaining + // we need to do this first before the data payload is published, and only done once! + if (Mqtt::ha_enabled() && emsdevice->ha_config_firstrun()) { + emsdevice->ha_config_clear(); + emsdevice->ha_config_firstrun(false); + } + // if its a boiler, generate json for each group and publish it directly. not nested if (device_type == DeviceType::BOILER) { - if (emsdevice->generate_values_json(json, DeviceValueTAG::TAG_BOILER_DATA, false, EMSdevice::OUTPUT_TARGET::MQTT)) { + if (emsdevice->generate_values(json, DeviceValueTAG::TAG_BOILER_DATA, false, EMSdevice::OUTPUT_TARGET::MQTT)) { Mqtt::publish(Mqtt::tag_to_topic(device_type, DeviceValueTAG::TAG_BOILER_DATA), json); } doc.clear(); - if (emsdevice->generate_values_json(json, DeviceValueTAG::TAG_DEVICE_DATA_WW, false, EMSdevice::OUTPUT_TARGET::MQTT)) { + if (emsdevice->generate_values(json, DeviceValueTAG::TAG_DEVICE_DATA_WW, false, EMSdevice::OUTPUT_TARGET::MQTT)) { Mqtt::publish(Mqtt::tag_to_topic(device_type, DeviceValueTAG::TAG_DEVICE_DATA_WW), json); } need_publish = false; @@ -485,15 +579,14 @@ void EMSESP::publish_device_values(uint8_t device_type) { // only publish the single master thermostat if (emsdevice->device_id() == EMSESP::actual_master_thermostat()) { if (nested) { - need_publish |= emsdevice->generate_values_json(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested + need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } else { - if (emsdevice->generate_values_json(json, DeviceValueTAG::TAG_THERMOSTAT_DATA, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested + if (emsdevice->generate_values(json, DeviceValueTAG::TAG_THERMOSTAT_DATA, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested Mqtt::publish(Mqtt::tag_to_topic(device_type, DeviceValueTAG::TAG_NONE), json); } doc.clear(); - - for (uint8_t hc_tag = TAG_HC1; hc_tag <= DeviceValueTAG::TAG_HC4; hc_tag++) { - if (emsdevice->generate_values_json(json, hc_tag, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested + for (uint8_t hc_tag = DeviceValueTAG::TAG_HC1; hc_tag <= DeviceValueTAG::TAG_HC8; hc_tag++) { + if (emsdevice->generate_values(json, hc_tag, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested Mqtt::publish(Mqtt::tag_to_topic(device_type, hc_tag), json); } doc.clear(); @@ -506,10 +599,10 @@ void EMSESP::publish_device_values(uint8_t device_type) { // Mixer else if (device_type == DeviceType::MIXER) { if (nested) { - need_publish |= emsdevice->generate_values_json(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested + need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } else { - for (uint8_t hc_tag = TAG_HC1; hc_tag <= DeviceValueTAG::TAG_WWC4; hc_tag++) { - if (emsdevice->generate_values_json(json, hc_tag, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested + for (uint8_t hc_tag = DeviceValueTAG::TAG_HC1; hc_tag <= DeviceValueTAG::TAG_WWC4; hc_tag++) { + if (emsdevice->generate_values(json, hc_tag, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested Mqtt::publish(Mqtt::tag_to_topic(device_type, hc_tag), json); } doc.clear(); @@ -519,18 +612,21 @@ void EMSESP::publish_device_values(uint8_t device_type) { } else { // for all other devices add the values to the json - need_publish |= emsdevice->generate_values_json(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested + need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } } - // if we're using HA, done is checked for each sensor in devices + // we want to create the /config topic after the data payload to prevent HA from throwing up a warning if (Mqtt::ha_enabled()) { - emsdevice->publish_mqtt_ha_entity_config(); // create the configs for each value as a sensor + emsdevice->publish_mqtt_ha_entity_config(); } } // publish it under a single topic, only if we have data to publish if (need_publish) { + if (doc.overflowed()) { + LOG_WARNING(F("MQTT buffer overflow, please use individual topics")); + } char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; snprintf(topic, sizeof(topic), "%s_data", EMSdevice::device_type_2_device_name(device_type).c_str()); Mqtt::publish(topic, json); @@ -543,13 +639,18 @@ void EMSESP::publish_other_values() { publish_device_values(EMSdevice::DeviceType::HEATPUMP); } +// publish both the dallas and analog sensor values void EMSESP::publish_sensor_values(const bool time, const bool force) { - if (!dallas_enabled()) { - return; + if (dallas_enabled()) { + if (dallassensor_.updated_values() || time || force) { + dallassensor_.publish_values(force); + } } - if (dallassensor_.updated_values() || time || force) { - dallassensor_.publish_values(force); + if (analog_enabled()) { + if (analogsensor_.updated_values() || time || force) { + analogsensor_.publish_values(force); + } } } @@ -586,23 +687,14 @@ bool EMSESP::get_device_value_info(JsonObject & root, const char * cmd, const in // specific for the dallassensor if (devicetype == DeviceType::DALLASSENSOR) { - uint8_t i = 1; - for (const auto & sensor : EMSESP::sensor_devices()) { - char sensorID[10]; - snprintf(sensorID, 10, "sensor%d", i++); - if ((strcmp(cmd, sensorID) == 0) || (strcmp(cmd, Helpers::toLower(sensor.to_string()).c_str()) == 0)) { - root["name"] = sensor.to_string(); - if (Helpers::hasValue(sensor.temperature_c)) { - root["value"] = (float)(sensor.temperature_c) / 10; - } - root["type"] = F_(number); - root["min"] = -55; - root["max"] = 125; - root["unit"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); - root["writeable"] = false; - return true; - } - } + EMSESP::dallassensor_.get_value_info(root, cmd, id); + return true; + } + + // analog sensor + if (devicetype == DeviceType::ANALOGSENSOR) { + EMSESP::analogsensor_.get_value_info(root, cmd, id); + return true; } return false; @@ -628,6 +720,7 @@ std::string EMSESP::pretty_telegram(std::shared_ptr telegram) { uint8_t offset = telegram->offset; // find name for src and dest by looking up known devices + std::string src_name(""); std::string dest_name(""); std::string type_name(""); @@ -674,32 +767,13 @@ std::string EMSESP::pretty_telegram(std::shared_ptr telegram) { direction = read_flash_string(F("->")); } - std::string str(200, '\0'); + std::string str; + str.reserve(200); + str = src_name + "(" + Helpers::hextoa(src) + ") " + direction + " " + dest_name + "(" + Helpers::hextoa(dest) + "), " + type_name + "(" + + Helpers::hextoa(telegram->type_id) + "), data: " + telegram->to_string_message(); + if (offset) { - snprintf(&str[0], - str.capacity() + 1, - "%s(0x%02X) %s %s(0x%02X), %s(0x%02X), data: %s (offset %d)", - src_name.c_str(), - src, - direction.c_str(), - dest_name.c_str(), - dest, - type_name.c_str(), - telegram->type_id, - telegram->to_string_message().c_str(), - offset); - } else { - snprintf(&str[0], - str.capacity() + 1, - "%s(0x%02X) %s %s(0x%02X), %s(0x%02X), data: %s", - src_name.c_str(), - src, - direction.c_str(), - dest_name.c_str(), - dest, - type_name.c_str(), - telegram->type_id, - telegram->to_string_message().c_str()); + str += " (offset " + Helpers::itoa(offset) + ")"; } return str; @@ -711,8 +785,8 @@ std::string EMSESP::pretty_telegram(std::shared_ptr telegram) { * Junkers has 15 bytes of data * each byte is a bitmask for which devices are active * byte 1 = 0x08 - 0x0F, byte 2 = 0x10 - 0x17, etc... - * e.g. in example above 1st byte = x0B = b1011 so we have device ids 0x08, 0x09, 0x011 - * and 2nd byte = x80 = b1000 b0000 = device id 0x17 + * e.g. in example above 1st byte = x0B = b1011 so we have deviceIDs 0x08, 0x09, 0x011 + * and 2nd byte = x80 = b1000 b0000 = deviceID 0x17 */ void EMSESP::process_UBADevices(std::shared_ptr telegram) { // exit it length is incorrect (must be 13 or 15 bytes long) @@ -748,8 +822,7 @@ void EMSESP::process_version(std::shared_ptr telegram) { if (telegram->message_length < 3) { // for empty telegram add device with empty product, version and brand if (!telegram->message_length) { - std::string version = "00.00"; - (void)add_device(telegram->src, 0, version, 0); + (void)add_device(telegram->src, 0, "00.00", 0); } return; } @@ -766,12 +839,12 @@ void EMSESP::process_version(std::shared_ptr telegram) { } // extra details from the telegram - uint8_t device_id = telegram->src; // device ID - uint8_t product_id = telegram->message_data[offset]; // product ID + uint8_t device_id = telegram->src; // deviceID + uint8_t product_id = telegram->message_data[offset]; // productID // get version as XX.XX - std::string version(6, '\0'); - snprintf(&version[0], version.capacity() + 1, "%02d.%02d", telegram->message_data[offset + 1], telegram->message_data[offset + 2]); + char version[8]; + snprintf(version, sizeof(version), "%02d.%02d", telegram->message_data[offset + 1], telegram->message_data[offset + 2]); // some devices store the protocol type (HT3, Buderus) in the last byte uint8_t brand; @@ -785,14 +858,14 @@ void EMSESP::process_version(std::shared_ptr telegram) { (void)add_device(device_id, product_id, version, brand); } -// find the device object that matches the device ID and see if it has a matching telegram type handler +// find the device object that matches the deviceID and see if it has a matching telegram type handler // but only process if the telegram is sent to us or it's a broadcast (dest=0x00=all) // We also check for common telgram types, like the Version(0x02) // returns false if there are none found bool EMSESP::process_telegram(std::shared_ptr telegram) { // if watching or reading... if ((telegram->type_id == read_id_) && (telegram->dest == txservice_.ems_bus_id())) { - LOG_NOTICE(F("%s"), pretty_telegram(telegram).c_str()); + LOG_INFO(F("%s"), pretty_telegram(telegram).c_str()); if (Mqtt::send_response()) { publish_response(telegram); } @@ -813,7 +886,9 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { } // only process broadcast telegrams or ones sent to us on request - if ((telegram->dest != 0x00) && (telegram->dest != rxservice_.ems_bus_id())) { + // if ((telegram->dest != 0x00) && (telegram->dest != rxservice_.ems_bus_id())) { + if (telegram->operation == Telegram::Operation::RX_READ) { + // LOG_DEBUG(F("read telegram received, not processing")); return false; } @@ -837,18 +912,23 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { bool knowndevice = false; for (const auto & emsdevice : emsdevices) { if (emsdevice) { - if (emsdevice->is_device_id(telegram->src)) { + if (emsdevice->is_device_id(telegram->src) || emsdevice->is_device_id(telegram->dest)) { knowndevice = true; found = emsdevice->handle_telegram(telegram); - // if we correctly processes the telegram follow up with sending it via MQTT if needed + if (found && emsdevice->is_device_id(telegram->dest)) { + LOG_DEBUG(F("Process setting 0x%02X for device 0x%02X"), telegram->type_id, telegram->dest); + } + // if we correctly processed the telegram then follow up with sending it via MQTT (if enabled) if (found && Mqtt::connected()) { if ((mqtt_.get_publish_onchange(emsdevice->device_type()) && emsdevice->has_update()) || (telegram->type_id == publish_id_ && telegram->dest == txservice_.ems_bus_id())) { if (telegram->type_id == publish_id_) { publish_id_ = 0; } - emsdevice->has_update(false); // reset flag - publish_device_values(emsdevice->device_type()); // publish to MQTT if we explicitly have too + emsdevice->has_update(false); // reset flag + if (!Mqtt::publish_single()) { + publish_device_values(emsdevice->device_type()); // publish to MQTT if we explicitly have too + } } } if (wait_validate_ == telegram->type_id) { @@ -909,7 +989,7 @@ void EMSESP::show_devices(uuid::console::Shell & shell) { for (const auto & device_class : EMSFactory::device_handlers()) { for (const auto & emsdevice : emsdevices) { if ((emsdevice) && (emsdevice->device_type() == device_class.first)) { - shell.printf(F("(%d) %s: %s"), emsdevice->unique_id(), emsdevice->device_type_name().c_str(), emsdevice->to_string().c_str()); + shell.printf(F("%s: %s"), emsdevice->device_type_name().c_str(), emsdevice->to_string().c_str()); if ((num_thermostats > 1) && (emsdevice->device_type() == EMSdevice::DeviceType::THERMOSTAT) && (emsdevice->device_id() == actual_master_thermostat())) { shell.printf(F(" **master device**")); @@ -928,7 +1008,7 @@ void EMSESP::show_devices(uuid::console::Shell & shell) { // add a new or update existing EMS device to our list of active EMS devices // if its not in our database, we don't add it -bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, std::string & version, const uint8_t brand) { +bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const char * version, const uint8_t brand) { // don't add ourselves! if (device_id == rxservice_.ems_bus_id()) { return false; @@ -938,7 +1018,7 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, std:: for (const auto & emsdevice : emsdevices) { if (emsdevice) { if (emsdevice->is_device_id(device_id)) { - LOG_DEBUG(F("Updating details for already active device ID 0x%02X"), device_id); + LOG_DEBUG(F("Updating details for already active deviceID 0x%02X"), device_id); emsdevice->product_id(product_id); emsdevice->version(version); // only set brand if it doesn't already exist @@ -962,7 +1042,7 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, std:: Device_record * device_p = nullptr; for (auto & device : device_library_) { if (device.product_id == product_id) { - // sometimes boilers share the same product id as controllers + // sometimes boilers share the same productID as controllers // so only add boilers if the device_id is 0x08, which is fixed for EMS if (device.device_type == DeviceType::BOILER) { if (device_id == EMSdevice::EMS_DEVICE_ID_BOILER @@ -978,9 +1058,9 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, std:: } } - // if we don't recognize the product ID report it and add as a generic device + // if we don't recognize the productID report it and add as a generic device if (device_p == nullptr) { - LOG_NOTICE(F("Unrecognized EMS device (device ID 0x%02X, product ID %d). Please report on GitHub."), device_id, product_id); + LOG_NOTICE(F("Unrecognized EMS device (deviceID 0x%02X, productID %d). Please report on GitHub."), device_id, product_id); std::string name("unknown"); emsdevices.push_back( EMSFactory::add(DeviceType::GENERIC, device_id, product_id, version, name, DeviceFlags::EMS_DEVICE_FLAG_NONE, EMSdevice::Brand::NO_BRAND)); @@ -1019,16 +1099,30 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, std:: device_type = DeviceType::CONNECT; } else if (device_id == 0x0E) { name = "converter"; // generic + } else if (device_id == 0x0F) { + name = "clock"; // generic + } else if (device_id == 0x08) { + name = "generic boiler"; + device_type = DeviceType::BOILER; + flags = DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP; + LOG_WARNING(F("Unknown EMS boiler. Using generic profile. Please report on GitHub.")); } else { LOG_WARNING(F("Unrecognized EMS device (device ID 0x%02X, no product ID). Please report on GitHub."), device_id); return false; } } - LOG_DEBUG(F("Adding new device %s (device ID 0x%02X, product ID %d, version %s)"), name.c_str(), device_id, product_id, version.c_str()); + LOG_DEBUG(F("Adding new device %s (deviceID 0x%02X, productID %d, version %s)"), name.c_str(), device_id, product_id, version); emsdevices.push_back(EMSFactory::add(device_type, device_id, product_id, version, name, flags, brand)); + + // assign a unique ID. Note that this is not actual unique after a restart as it's dependent on the order that devices are found emsdevices.back()->unique_id(++unique_id_count_); + // sort devices based on type + std::sort(emsdevices.begin(), emsdevices.end(), [](const std::unique_ptr & a, const std::unique_ptr & b) { + return a->device_type() < b->device_type(); + }); + fetch_device_values(device_id); // go and fetch its data // add command commands for all devices, except for connect, controller and gateway @@ -1066,7 +1160,7 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, std:: Mqtt::subscribe(device_type, EMSdevice::device_type_2_device_name(device_type) + "/#", nullptr); // Print to LOG showing we've added a new device - LOG_INFO(F("Recognized new %s with device ID 0x%02X"), EMSdevice::device_type_2_device_name(device_type).c_str(), device_id); + LOG_INFO(F("Recognized new %s with deviceID 0x%02X"), EMSdevice::device_type_2_device_name(device_type).c_str(), device_id); return true; } @@ -1094,9 +1188,9 @@ bool EMSESP::command_commands(uint8_t device_type, JsonObject & output, const in bool EMSESP::command_info(uint8_t device_type, JsonObject & output, const int8_t id, const uint8_t output_target) { bool has_value = false; uint8_t tag; - if (id >= 1 && id <= 4) { + if (id >= 1 && id <= 8) { tag = DeviceValueTAG::TAG_HC1 + id - 1; - } else if (id >= 9 && id <= 10) { + } else if (id >= 9 && id <= 12) { tag = DeviceValueTAG::TAG_WWC1 + id - 9; } else if (id == -1 || id == 0) { tag = DeviceValueTAG::TAG_NONE; @@ -1107,7 +1201,7 @@ bool EMSESP::command_info(uint8_t device_type, JsonObject & output, const int8_t for (const auto & emsdevice : emsdevices) { if (emsdevice && (emsdevice->device_type() == device_type) && ((device_type != DeviceType::THERMOSTAT) || (emsdevice->device_id() == EMSESP::actual_master_thermostat()))) { - has_value |= emsdevice->generate_values_json(output, tag, (id < 1), output_target); // use nested for id -1 and 0 + has_value |= emsdevice->generate_values(output, tag, (id < 1), output_target); // use nested for id -1 and 0 } } @@ -1262,7 +1356,6 @@ void EMSESP::send_raw_telegram(const char * data) { // the services must be loaded in the correct order void EMSESP::start() { Serial.begin(115200); - Serial.println(); // start the file system #ifndef EMSESP_STANDALONE @@ -1272,29 +1365,34 @@ void EMSESP::start() { } #endif - esp8266React.begin(); // loads system settings (network, mqtt, etc) + esp8266React.begin(); // loads core system services settings (network, mqtt, ap, ntp etc) + system_.check_upgrade(); // do any system upgrades + webSettingsService.begin(); // load EMS-ESP Application settings... + system_.get_settings(); // ...and store some of the settings locally for future reference + console_.start(system_.telnet_enabled()); // telnet and serial console, from here we can start logging events + webLogService.start(); // start web log service + webCustomizationService.begin(); // load the customizations - system_.check_upgrade(); // do any system upgrades + // welcome message + LOG_INFO(F("Starting EMS-ESP version %s (hostname: %s)"), EMSESP_APP_VERSION, system_.hostname().c_str()); + LOG_INFO(F("Configuring for interface board profile %s"), system_.board_profile().c_str()); + + // start all the EMS-ESP services + mqtt_.start(); // mqtt init + system_.start(heap_start); // starts commands, led, adc, button, network, syslog & uart + shower_.start(); // initialize shower timer and shower alert + dallassensor_.start(); // Dallas external sensors + analogsensor_.start(); // Analog external sensors + webServer.begin(); // start the web server + // emsdevices.reserve(5); // reserve space for initially 5 devices to avoid mem frag issues + + LOG_INFO(F("Last system reset reason Core0: %s, Core1: %s"), system_.reset_reason(0).c_str(), system_.reset_reason(1).c_str()); // Load our library of known devices into stack mem. Names are stored in Flash memory (takes up about 1kb) device_library_ = { #include "device_library.h" }; - - console_.start(); // telnet and serial console - - webSettingsService.begin(); // load EMS-ESP specific settings, like GPIO configurations - mqtt_.start(); // mqtt init - system_.start(heap_start); // starts commands, led, adc, button, network, syslog & uart - shower_.start(); // initialize shower timer and shower alert - dallassensor_.start(); // dallas external sensors - webServer.begin(); // start web server - webLogService.start(); // start web log service - - emsdevices.reserve(5); // reserve space for initially 5 devices to avoid mem frag issues - - LOG_INFO(F("Last system reset reason Core0: %s, Core1: %s"), system_.reset_reason(0).c_str(), system_.reset_reason(1).c_str()); - LOG_INFO(F("EMS Device library loaded with %d records"), device_library_.size()); + LOG_INFO(F("EMS device library loaded with %d records"), device_library_.size()); #if defined(EMSESP_STANDALONE) Mqtt::on_connect(); // simulate an MQTT connection @@ -1312,6 +1410,7 @@ void EMSESP::loop() { rxservice_.loop(); // process any incoming Rx telegrams shower_.loop(); // check for shower on/off dallassensor_.loop(); // read dallas sensor temperatures + analogsensor_.loop(); // read analog sensor values publish_all_loop(); // with HA messages in parts to avoid flooding the mqtt queue mqtt_.loop(); // sends out anything in the MQTT queue diff --git a/src/emsesp.h b/src/emsesp.h index 9dcf3cf06..31ec98965 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -22,6 +22,10 @@ #include #include +#include +#include +#include +#include #include @@ -38,15 +42,18 @@ #include "web/WebStatusService.h" #include "web/WebDataService.h" #include "web/WebSettingsService.h" +#include "web/WebCustomizationService.h" #include "web/WebAPIService.h" #include "web/WebLogService.h" +#include "emsdevicevalue.h" #include "emsdevice.h" #include "emsfactory.h" #include "telegram.h" #include "mqtt.h" #include "system.h" #include "dallassensor.h" +#include "analogsensor.h" #include "console.h" #include "shower.h" #include "roomcontrol.h" @@ -55,7 +62,11 @@ #define WATCH_ID_NONE 0 // no watch id set -#define EMSESP_JSON_SIZE_HA_CONFIG 768 // for HA config payloads, using StaticJsonDocument +#ifndef EMSESP_STANDALONE +#define EMSESP_JSON_SIZE_HA_CONFIG 1024 // for HA config payloads, using StaticJsonDocument +#else +#define EMSESP_JSON_SIZE_HA_CONFIG 2024 // for HA config payloads, using StaticJsonDocument +#endif #define EMSESP_JSON_SIZE_SMALL 256 // for smaller json docs, using StaticJsonDocument #define EMSESP_JSON_SIZE_MEDIUM 768 // for medium json docs from ems devices, using StaticJsonDocument #define EMSESP_JSON_SIZE_LARGE 1024 // for large json docs from ems devices, like boiler or thermostat data, using StaticJsonDocument @@ -68,7 +79,8 @@ #define EMSESP_JSON_SIZE_XLARGE_DYN 16384 // for very very large json docs, using DynamicJsonDocument #endif -#define EMSESP_JSON_SIZE_XXLARGE_DYN 16384 // for extra very very large json docs, using DynamicJsonDocument +#define EMSESP_JSON_SIZE_XXLARGE_DYN 16384 // for extra very very large json docs, using DynamicJsonDocument +#define EMSESP_JSON_SIZE_XXXLARGE_DYN 20480 // web output (maybe for 4 hc) // helpers for callback functions #define MAKE_PF_CB(__f) [&](std::shared_ptr t) { __f(t); } // for Process Function callbacks to EMSDevice::process_function_p @@ -76,6 +88,11 @@ namespace emsesp { +using DeviceValueUOM = emsesp::DeviceValue::DeviceValueUOM; +using DeviceValueType = emsesp::DeviceValue::DeviceValueType; +using DeviceValueState = emsesp::DeviceValue::DeviceValueState; +using DeviceValueTAG = emsesp::DeviceValue::DeviceValueTAG; + class Shower; // forward declaration for compiler class EMSESP { @@ -113,6 +130,8 @@ class EMSESP { static bool device_exists(const uint8_t device_id); static uint8_t count_devices(const uint8_t device_type); + static uint8_t count_devices(); + static uint8_t device_index(const uint8_t device_type, const uint8_t unique_id); static uint8_t actual_master_thermostat(); static void actual_master_thermostat(const uint8_t device_id); @@ -130,40 +149,12 @@ class EMSESP { static void incoming_telegram(uint8_t * data, const uint8_t length); - static const std::vector sensor_devices() { - return dallassensor_.sensors(); - } - - static bool have_sensors() { - return (!(dallassensor_.sensors().empty())); - } - - static uint32_t sensor_reads() { - return dallassensor_.reads(); - } - - static uint32_t sensor_fails() { - return dallassensor_.fails(); - } - static bool dallas_enabled() { return (dallassensor_.dallas_enabled()); } - static uint8_t bool_format() { - return bool_format_; - } - - static void bool_format(uint8_t format) { - bool_format_ = format; - } - - static uint8_t enum_format() { - return enum_format_; - } - - static void enum_format(uint8_t format) { - enum_format_ = format; + static bool analog_enabled() { + return (analogsensor_.analog_enabled()); } enum Watch : uint8_t { WATCH_OFF, WATCH_ON, WATCH_RAW, WATCH_UNKNOWN }; @@ -178,12 +169,14 @@ class EMSESP { watch_id_ = 0; // reset watch id if watch is disabled } } + static uint8_t watch() { return watch_; } static void set_read_id(uint16_t id) { read_id_ = id; } + static bool wait_validate() { return (wait_validate_ != 0); } @@ -214,7 +207,7 @@ class EMSESP { static void fetch_device_values_type(const uint8_t device_type); static bool valid_device(const uint8_t device_id); - static bool add_device(const uint8_t device_id, const uint8_t product_id, std::string & version, const uint8_t brand); + static bool add_device(const uint8_t device_id, const uint8_t product_id, const char * version, const uint8_t brand); static void scan_devices(); static void clear_all_devices(); @@ -224,18 +217,20 @@ class EMSESP { static Mqtt mqtt_; static System system_; static DallasSensor dallassensor_; + static AnalogSensor analogsensor_; static Console console_; static Shower shower_; static RxService rxservice_; static TxService txservice_; // web controllers - static ESP8266React esp8266React; - static WebSettingsService webSettingsService; - static WebStatusService webStatusService; - static WebDataService webDataService; - static WebAPIService webAPIService; - static WebLogService webLogService; + static ESP8266React esp8266React; + static WebSettingsService webSettingsService; + static WebStatusService webStatusService; + static WebDataService webDataService; + static WebAPIService webAPIService; + static WebLogService webLogService; + static WebCustomizationService webCustomizationService; static uuid::log::Logger logger(); @@ -245,17 +240,16 @@ class EMSESP { static uuid::log::Logger logger_; static std::string device_tostring(const uint8_t device_id); - - static void process_UBADevices(std::shared_ptr telegram); - static void process_version(std::shared_ptr telegram); - static void publish_response(std::shared_ptr telegram); - static void publish_all_loop(); - static bool command_info(uint8_t device_type, JsonObject & output, const int8_t id, const uint8_t output_target); - static bool command_commands(uint8_t device_type, JsonObject & output, const int8_t id); - static bool command_entities(uint8_t device_type, JsonObject & output, const int8_t id); + static void process_UBADevices(std::shared_ptr telegram); + static void process_version(std::shared_ptr telegram); + static void publish_response(std::shared_ptr telegram); + static void publish_all_loop(); + static bool command_info(uint8_t device_type, JsonObject & output, const int8_t id, const uint8_t output_target); + static bool command_commands(uint8_t device_type, JsonObject & output, const int8_t id); + static bool command_entities(uint8_t device_type, JsonObject & output, const int8_t id); static constexpr uint32_t EMS_FETCH_FREQUENCY = 60000; // check every minute - static uint32_t last_fetch_; + static constexpr uint8_t EMS_WAIT_KM_TIMEOUT = 60; // wait one minute struct Device_record { uint8_t product_id; @@ -275,12 +269,9 @@ class EMSESP { static uint8_t publish_all_idx_; static uint8_t unique_id_count_; static bool trace_raw_; - static uint8_t bool_format_; - static uint8_t enum_format_; static uint16_t wait_validate_; static bool wait_km_; - - static constexpr uint8_t EMS_WAIT_KM_TIMEOUT = 60; // wait one minute + static uint32_t last_fetch_; }; } // namespace emsesp diff --git a/src/emsesp_stub.hpp b/src/emsesp_stub.hpp index 9f8aa5ca8..c58ff276a 100644 --- a/src/emsesp_stub.hpp +++ b/src/emsesp_stub.hpp @@ -23,6 +23,7 @@ #include "dallassensor.h" #include "version.h" #include "default_settings.h" + #include #include diff --git a/src/emsfactory.h b/src/emsfactory.h index f6f5383cf..a7542cce0 100644 --- a/src/emsfactory.h +++ b/src/emsfactory.h @@ -55,12 +55,12 @@ class EMSFactory { } // Construct derived class returning an unique ptr - static auto add(const uint8_t device_type, uint8_t device_id, uint8_t product_id, std::string & version, std::string & name, uint8_t flags, uint8_t brand) + static auto add(const uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, std::string & name, uint8_t flags, uint8_t brand) -> std::unique_ptr { return std::unique_ptr(EMSFactory::makeRaw(device_type, device_id, product_id, version, name, flags, brand)); } - virtual auto construct(uint8_t device_type, uint8_t device_id, uint8_t product_id, std::string & version, std::string & name, uint8_t flags, uint8_t brand) const + virtual auto construct(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, std::string & name, uint8_t flags, uint8_t brand) const -> EMSdevice * = 0; private: @@ -72,7 +72,7 @@ class EMSFactory { // Construct derived class returning a raw pointer // find which EMS device it is and use that class - static auto makeRaw(const uint8_t device_type, uint8_t device_id, uint8_t product_id, std::string & version, std::string & name, uint8_t flags, uint8_t brand) + static auto makeRaw(const uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, std::string & name, uint8_t flags, uint8_t brand) -> EMSdevice * { auto it = EMSFactory::getRegister().find(device_type); if (it != EMSFactory::getRegister().end()) { @@ -90,7 +90,7 @@ class ConcreteEMSFactory : EMSFactory { EMSFactory::registerFactory(device_type, this); } - auto construct(uint8_t device_type, uint8_t device_id, uint8_t product_id, std::string & version, std::string & name, uint8_t flags, uint8_t brand) const + auto construct(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, std::string & name, uint8_t flags, uint8_t brand) const -> EMSdevice * { return new DerivedClass(device_type, device_id, product_id, version, name, flags, brand); } diff --git a/src/helpers.cpp b/src/helpers.cpp index d1edb9303..343b5a01a 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -33,6 +33,35 @@ char * Helpers::hextoa(char * result, const uint8_t value) { return result; } +// same as above but to a hex string +std::string Helpers::hextoa(const uint8_t value, bool prefix) { + char buf[3]; + if (prefix) { + return std::string("0x") + hextoa(buf, value); + } + return std::string(hextoa(buf, value)); +} + +// same for 16 bit values +char * Helpers::hextoa(char * result, const uint16_t value) { + if (value <= 0xFF) { + return hextoa(result, (uint8_t)value); + } + hextoa(result, (uint8_t)(value >> 8)); + hextoa(&result[2], (uint8_t)(value & 0xFF)); + return result; +} + + +// same as above but to a hex string +std::string Helpers::hextoa(const uint16_t value, bool prefix) { + char buf[5]; + if (prefix) { + return std::string("0x") + hextoa(buf, value); + } + return std::string(hextoa(buf, value)); +} + #ifdef EMSESP_STANDALONE // special function to work outside of ESP's libraries char * Helpers::ultostr(char * ptr, uint32_t value, const uint8_t base) { @@ -70,11 +99,34 @@ char * Helpers::ultostr(char * ptr, uint32_t value, const uint8_t base) { } #endif +/** + * fast atoi returning a std::string + * http://www.strudel.org.uk/itoa/ + * + */ +std::string Helpers::itoa(int16_t value) { + std::string buf; + buf.reserve(25); // Pre-allocate enough space. + int quotient = value; + + do { + buf += "0123456789abcdef"[std::abs(quotient % 10)]; + quotient /= 10; + } while (quotient); + + // Append the negative sign + if (value < 0) + buf += '-'; + + std::reverse(buf.begin(), buf.end()); + return buf; +} + /* - * itoa for 2 byte signed (short) integers + * fast itoa and optimized for ESP32 * written by Lukás Chmela, Released under GPLv3. http://www.strudel.org.uk/itoa/ version 0.4 */ -char * Helpers::itoa(char * result, int32_t value, const uint8_t base) { +char * Helpers::itoa(int32_t value, char * result, const uint8_t base) { // check that the base if valid if (base < 2 || base > 36) { *result = '\0'; @@ -82,7 +134,7 @@ char * Helpers::itoa(char * result, int32_t value, const uint8_t base) { } char * ptr = result, *ptr1 = result; - int16_t tmp_value; + int32_t tmp_value; do { tmp_value = value; @@ -123,31 +175,30 @@ char * Helpers::smallitoa(char * result, const uint16_t value) { } // work out how to display booleans +// for strings only char * Helpers::render_boolean(char * result, bool value) { - uint8_t bool_format_ = EMSESP::bool_format(); - if (bool_format_ == BOOL_FORMAT_ONOFF) { + uint8_t bool_format_ = EMSESP::system_.bool_format(); + if (bool_format_ == BOOL_FORMAT_ONOFF_STR) { strlcpy(result, value ? read_flash_string(F_(on)).c_str() : read_flash_string(F_(off)).c_str(), 5); - } else if (bool_format_ == BOOL_FORMAT_ONOFF_CAP) { + } else if (bool_format_ == BOOL_FORMAT_ONOFF_STR_CAP) { strlcpy(result, value ? read_flash_string(F_(ON)).c_str() : read_flash_string(F_(OFF)).c_str(), 5); - } else if (bool_format_ == BOOL_FORMAT_TRUEFALSE) { - strlcpy(result, value ? "true" : "false", 7); - } else { + } else if ((bool_format_ == BOOL_FORMAT_10) || (bool_format_ == BOOL_FORMAT_10_STR)) { strlcpy(result, value ? "1" : "0", 2); + } else { + strlcpy(result, value ? "true" : "false", 7); // default } - return result; } // render for native char strings -// format is not used -char * Helpers::render_value(char * result, const char * value, uint8_t format __attribute__((unused))) { +char * Helpers::render_value(char * result, const char * value, const int8_t format __attribute__((unused))) { strcpy(result, value); return result; } // convert unsigned int (single byte) to text value and returns it // format: 255(0xFF)=boolean, 0=no formatting, otherwise divide by format -char * Helpers::render_value(char * result, uint8_t value, uint8_t format) { +char * Helpers::render_value(char * result, uint8_t value, int8_t format, const uint8_t fahrenheit) { // special check if its a boolean if (format == EMS_VALUE_BOOL) { if (value == EMS_VALUE_BOOL_OFF) { @@ -164,8 +215,10 @@ char * Helpers::render_value(char * result, uint8_t value, uint8_t format) { return nullptr; } + int16_t new_value = fahrenheit ? format ? value * 1.8 + 32 * format * (fahrenheit - 1) : value * 1.8 + 32 * (fahrenheit - 1) : value; + if (!format) { - itoa(result, value, 10); // format = 0 + itoa(new_value, result, 10); // format = 0 return result; } @@ -173,22 +226,31 @@ char * Helpers::render_value(char * result, uint8_t value, uint8_t format) { // special case for / 2 if (format == 2) { - strlcpy(result, itoa(s2, value >> 1, 10), 5); + strlcpy(result, itoa(new_value >> 1, s2, 10), 5); strlcat(result, ".", 5); - strlcat(result, ((value & 0x01) ? "5" : "0"), 5); + strlcat(result, ((new_value & 0x01) ? "5" : "0"), 7); + return result; + } else if (format == 4) { + strlcpy(result, itoa(new_value >> 2, s2, 10), 5); + strlcat(result, ".", 5); + new_value = (new_value & 0x03) * 25; + strlcat(result, itoa(new_value, s2, 10), 7); return result; - } - strlcpy(result, itoa(s2, value / format, 10), 5); - strlcat(result, ".", 5); - strlcat(result, itoa(s2, value % format, 10), 5); + } else if (format > 0) { + strlcpy(result, itoa(new_value / format, s2, 10), 5); + strlcat(result, ".", 5); + strlcat(result, itoa(new_value % format, s2, 10), 7); + } else { + strlcpy(result, itoa(new_value * format * -1, s2, 10), 5); + } return result; } // float: convert float to char // format is the precision, 0 to 8 -char * Helpers::render_value(char * result, const float value, const uint8_t format) { +char * Helpers::render_value(char * result, const float value, const int8_t format) { if (format > 8) { return nullptr; } @@ -198,7 +260,7 @@ char * Helpers::render_value(char * result, const float value, const uint8_t for char * ret = result; int32_t whole = (int32_t)value; - itoa(result, whole, 10); + itoa(whole, result, 10); while (*result != '\0') { result++; @@ -206,97 +268,103 @@ char * Helpers::render_value(char * result, const float value, const uint8_t for *result++ = '.'; int32_t decimal = abs((int32_t)((value - whole) * p[format])); - itoa(result, decimal, 10); + itoa(decimal, result, 10); return ret; } -// int16: convert short (two bytes) to text string and returns string +// int32: convert signed 32bit to text string and returns string // format: 0=no division, other divide by the value given and render with a decimal point -char * Helpers::render_value(char * result, const int16_t value, const uint8_t format) { - if (!hasValue(value)) { - return nullptr; - } - +char * Helpers::render_value(char * result, const int32_t value, const int8_t format, const uint8_t fahrenheit) { + int32_t new_value = fahrenheit ? format ? value * 1.8 + 32 * format * (fahrenheit - 1) : value * 1.8 + 32 * (fahrenheit - 1) : value; + char s[10] = {0}; // just print it if no conversion required (format = 0) if (!format) { - itoa(result, value, 10); + strlcpy(result, itoa(new_value, s, 10), sizeof(s)); // format is 0 return result; } - int16_t new_value = value; - result[0] = '\0'; + result[0] = '\0'; // check for negative values if (new_value < 0) { - strlcpy(result, "-", 10); + strlcpy(result, "-", sizeof(s)); new_value *= -1; // convert to positive } else { - strlcpy(result, "", 10); + strlcpy(result, "", sizeof(s)); } // do floating point - char s2[10] = {0}; if (format == 2) { // divide by 2 - strlcat(result, itoa(s2, new_value / 2, 10), 10); - strlcat(result, ".", 10); - strlcat(result, ((new_value & 0x01) ? "5" : "0"), 10); + strlcat(result, itoa(new_value / 2, s, 10), sizeof(s)); + strlcat(result, ".", sizeof(s)); + strlcat(result, ((new_value & 0x01) ? "5" : "0"), sizeof(s)); + } else if (format > 0) { + strlcat(result, itoa(new_value / format, s, 10), sizeof(s)); + strlcat(result, ".", sizeof(s)); + strlcat(result, itoa(new_value % format, s, 10), sizeof(s)); } else { - strlcat(result, itoa(s2, new_value / format, 10), 10); - strlcat(result, ".", 10); - strlcat(result, itoa(s2, new_value % format, 10), 10); + strlcat(result, itoa(new_value * format * -1, s, 10), sizeof(s)); } return result; } -// uint16: convert unsigned short (two bytes) to text string and prints it -// format: 0=no division, other divide by the value given and render with a decimal point -char * Helpers::render_value(char * result, const uint16_t value, const uint8_t format) { +// int16: convert short (two bytes) to text string and prints it +char * Helpers::render_value(char * result, const int16_t value, const int8_t format, const uint8_t fahrenheit) { if (!hasValue(value)) { return nullptr; } - return (render_value(result, (int16_t)value, format)); // use same code, force it to a signed int + return (render_value(result, (int32_t)value, format, fahrenheit)); // use same code, force it to a signed int +} + +// uint16: convert unsigned short (two bytes) to text string and prints it +char * Helpers::render_value(char * result, const uint16_t value, const int8_t format, const uint8_t fahrenheit) { + if (!hasValue(value)) { + return nullptr; + } + + return (render_value(result, (int32_t)value, format, fahrenheit)); // use same code, force it to a signed int } // int8: convert signed byte to text string and prints it -// format: 0=no division, other divide by the value given and render with a decimal point -char * Helpers::render_value(char * result, const int8_t value, const uint8_t format) { +char * Helpers::render_value(char * result, const int8_t value, const int8_t format, const uint8_t fahrenheit) { if (!hasValue(value)) { return nullptr; } - return (render_value(result, (int16_t)value, format)); // use same code, force it to a signed int + return (render_value(result, (int32_t)value, format, fahrenheit)); // use same code, force it to a signed int } // uint32: render long (4 byte) unsigned values -// format: 0=no division, other divide by the value given and render with a decimal point -char * Helpers::render_value(char * result, const uint32_t value, const uint8_t format) { +char * Helpers::render_value(char * result, const uint32_t value, const int8_t format, const uint8_t fahrenheit) { if (!hasValue(value)) { return nullptr; } - - result[0] = '\0'; - char s[20]; + result[0] = '\0'; + int32_t new_value = fahrenheit ? format ? value * 1.8 + 32 * format * (fahrenheit - 1) : value * 1.8 + 32 * (fahrenheit - 1) : value; + char s[10] = {0}; #ifndef EMSESP_STANDALONE if (!format) { - strlcpy(result, ltoa(value, s, 10), 20); // format is 0 + strlcpy(result, ltoa(new_value, s, 10), sizeof(s)); // format is 0 + } else if (format > 0) { + strlcpy(result, ltoa(new_value / format, s, 10), sizeof(s)); + strlcat(result, ".", sizeof(s)); + strlcat(result, ltoa(new_value % format, s, 10), sizeof(s)); } else { - strlcpy(result, ltoa(value / format, s, 10), 20); - strlcat(result, ".", 20); - strlcat(result, ltoa(value % format, s, 10), 20); + strlcpy(result, ltoa(new_value * format * -1, s, 10), sizeof(s)); } #else if (!format) { - strlcpy(result, ultostr(s, value, 10), 20); // format is 0 + strlcpy(result, ultostr(s, new_value, 10), sizeof(s)); // format is 0 } else { - strncpy(result, ultostr(s, value / format, 10), 20); - strlcat(result, ".", 20); - strncat(result, ultostr(s, value % format, 10), 20); + strncpy(result, ultostr(s, new_value / format, 10), sizeof(s)); + strlcat(result, ".", sizeof(s)); + strncat(result, ultostr(s, new_value % format, 10), sizeof(s)); } #endif @@ -306,12 +374,12 @@ char * Helpers::render_value(char * result, const uint32_t value, const uint8_t // creates string of hex values from an arrray of bytes std::string Helpers::data_to_hex(const uint8_t * data, const uint8_t length) { if (length == 0) { - return read_flash_string(F("")); + return ""; } - std::string str(160, '\0'); - char buffer[4]; - char * p = &str[0]; + char str[160] = {0}; + char buffer[4]; + char * p = &str[0]; for (uint8_t i = 0; i < length; i++) { Helpers::hextoa(buffer, data[i]); *p++ = buffer[0]; @@ -320,17 +388,23 @@ std::string Helpers::data_to_hex(const uint8_t * data, const uint8_t length) { } *--p = '\0'; // null terminate just in case, loosing the trailing space - return str; + return std::string(str); } // takes a hex string and convert it to an unsigned 32bit number (max 8 hex digits) // works with only positive numbers uint32_t Helpers::hextoint(const char * hex) { + if (hex == nullptr) { + return 0; + } + uint32_t val = 0; + // skip leading '0x' if (hex[0] == '0' && hex[1] == 'x') { hex += 2; } + while (*hex) { // get current character then increment char byte = *hex++; @@ -346,29 +420,49 @@ uint32_t Helpers::hextoint(const char * hex) { // shift 4 to make space for new digit, and add the 4 bits of the new digit val = (val << 4) | (byte & 0xF); } + return val; } // quick char to long -uint16_t Helpers::atoint(const char * value) { - unsigned int x = 0; +int Helpers::atoint(const char * value) { + int x = 0; + char s = value[0]; + if (s == '-') { + ++value; + } while (*value >= '0' && *value <= '9') { x = (x * 10) + (*value - '0'); ++value; } + if (s == '-') { + return (-x); + } return x; } // rounds a number to 2 decimal places // example: round2(3.14159) -> 3.14 -float Helpers::round2(float value, const uint8_t divider) { - uint8_t div = (divider ? divider : 1); // prevent div-by-zero - - if (value >= 0) { - return (int)((value / div) * 100 + 0.5) / 100.0; +// From mvdp: +// The conversion to Fahrenheit is different for absolute temperatures and relative temperatures like hysteresis. +// fahrenheit=0 - off, no conversion +// fahrenheit=1 - relative, 1.8t +// fahrenheit=2 - absolute, 1.8t + 32(fahrenheit-1). +float Helpers::round2(float value, const int8_t divider, const uint8_t fahrenheit) { + float val = (value * 100 + 0.5); + if (divider > 0) { + val = ((value / divider) * 100 + 0.5); + } else if (divider < 0) { + val = value * -100 * divider; + } + if (value < 0) { // negative rounding + val = val - 1; + } + if (fahrenheit) { + val = val * 1.8 + 3200 * (fahrenheit - 1); } - return (int)((value / div) * 100 - 0.5) / 100.0; // negative values + return ((int32_t)val) / 100.0; } // abs of a signed 32-bit integer @@ -410,13 +504,16 @@ bool Helpers::hasValue(const uint32_t & v) { } // checks if we can convert a char string to an int value -bool Helpers::value2number(const char * v, int & value) { +bool Helpers::value2number(const char * v, int & value, const int min, const int max) { if ((v == nullptr) || (strlen(v) == 0)) { value = 0; return false; } value = atoi((char *)v); - return true; + if (value >= min && value <= max) { + return true; + } + return false; } // checks if we can convert a char string to a float value @@ -432,6 +529,26 @@ bool Helpers::value2float(const char * v, float & value) { return false; } +bool Helpers::value2temperature(const char * v, float & value, bool relative) { + if (value2float(v, value)) { + if (EMSESP::system_.fahrenheit()) { + value = relative ? (value / 1.8) : (value - 32) / 1.8; + } + return true; + } + return false; +} + +bool Helpers::value2temperature(const char * v, int & value, const bool relative, const int min, const int max) { + if (value2number(v, value, min, max)) { + if (EMSESP::system_.fahrenheit()) { + value = relative ? (value / 1.8) : (value - 32) / 1.8; + } + return true; + } + return false; +} + // https://stackoverflow.com/questions/313970/how-to-convert-stdstring-to-lower-case std::string Helpers::toLower(std::string const & s) { std::string lc = s; @@ -485,13 +602,26 @@ bool Helpers::value2enum(const char * v, uint8_t & value, const __FlashStringHel std::string str = toLower(v); for (value = 0; strs[value]; value++) { std::string str1 = toLower(read_flash_string(strs[value])); - if ((str1 == read_flash_string(F_(off)) && str == "false") || (str1 == read_flash_string(F_(on)) && str == "true") || (str == str1) - || (v[0] == ('0' + value) && v[1] == '\0')) { + if ((str1 != "") + && ((str1 == read_flash_string(F_(off)) && str == "false") || (str1 == read_flash_string(F_(on)) && str == "true") || (str == str1) + || (v[0] == ('0' + value) && v[1] == '\0'))) { return true; } } return false; } +// replace char in char string +void Helpers::replace_char(char * str, char find, char replace) { + int i = 0; + + while (str[i] != '\0') { + /*Replace the matched character...*/ + if (str[i] == find) + str[i] = replace; + + i++; + } +} } // namespace emsesp diff --git a/src/helpers.h b/src/helpers.h index 9a3518622..f7ab36ada 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -19,8 +19,6 @@ #ifndef EMSESP_HELPERS_H #define EMSESP_HELPERS_H -#include - #include "telegram.h" // for EMS_VALUE_* settings #define FJSON(x) x @@ -32,27 +30,33 @@ using flash_string_vector = std::vector; class Helpers { public: - static char * render_value(char * result, const float value, const uint8_t format); // format is the precision - static char * render_value(char * result, const uint8_t value, const uint8_t format); - static char * render_value(char * result, const int8_t value, const uint8_t format); - static char * render_value(char * result, const uint16_t value, const uint8_t format); - static char * render_value(char * result, const uint32_t value, const uint8_t format); - static char * render_value(char * result, const int16_t value, const uint8_t format); - static char * render_value(char * result, const char * value, uint8_t format); + static char * render_value(char * result, const float value, const int8_t format); // format is the precision + static char * render_value(char * result, const uint8_t value, const int8_t format, const uint8_t fahrenheit = 0); + static char * render_value(char * result, const int8_t value, const int8_t format, const uint8_t fahrenheit = 0); + static char * render_value(char * result, const uint16_t value, const int8_t format, const uint8_t fahrenheit = 0); + static char * render_value(char * result, const uint32_t value, const int8_t format, const uint8_t fahrenheit = 0); + static char * render_value(char * result, const int16_t value, const int8_t format, const uint8_t fahrenheit = 0); + static char * render_value(char * result, const int32_t value, const int8_t format, const uint8_t fahrenheit = 0); + static char * render_value(char * result, const char * value, const int8_t format); static char * render_boolean(char * result, bool value); static char * hextoa(char * result, const uint8_t value); + static char * hextoa(char * result, const uint16_t value); + static std::string hextoa(const uint8_t value, bool prefix = true); // default prefix with 0x + static std::string hextoa(const uint16_t value, bool prefix = true); // default prefix with 0x static std::string data_to_hex(const uint8_t * data, const uint8_t length); static char * smallitoa(char * result, const uint8_t value); static char * smallitoa(char * result, const uint16_t value); - static char * itoa(char * result, int32_t value, const uint8_t base = 10); + static char * itoa(int32_t value, char * result, const uint8_t base = 10); + static std::string itoa(int16_t value); static uint32_t hextoint(const char * hex); - static uint16_t atoint(const char * value); + static int atoint(const char * value); static bool check_abs(const int32_t i); static uint32_t abs(const int32_t i); - static float round2(float value, const uint8_t divider); + static float round2(float value, const int8_t divider, const uint8_t fahrenheit = 0); static std::string toLower(std::string const & s); static std::string toUpper(std::string const & s); + static void replace_char(char * str, char find, char replace); static bool hasValue(const uint8_t & v, const uint8_t isBool = 0); static bool hasValue(const int8_t & v); @@ -61,11 +65,13 @@ class Helpers { static bool hasValue(const uint32_t & v); static bool hasValue(char * v); - static bool value2number(const char * v, int & value); + static bool value2number(const char * v, int & value, const int min = -2147483648, const int max = 2147483647); static bool value2float(const char * v, float & value); static bool value2bool(const char * v, bool & value); static bool value2string(const char * v, std::string & value); static bool value2enum(const char * v, uint8_t & value, const __FlashStringHelper * const * strs); + static bool value2temperature(const char * v, float & value, bool relative = false); + static bool value2temperature(const char * v, int & value, const bool relative = false, const int min = -2147483648, const int max = 2147483647); #ifdef EMSESP_STANDALONE static char * ultostr(char * ptr, uint32_t value, const uint8_t base); diff --git a/src/locale_DE.h b/src/locale_DE.h new file mode 100644 index 000000000..caadceafb --- /dev/null +++ b/src/locale_DE.h @@ -0,0 +1,639 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +// common words +MAKE_PSTR_WORD(debug) +MAKE_PSTR_WORD(exit) +MAKE_PSTR_WORD(help) +MAKE_PSTR_WORD(log) +MAKE_PSTR_WORD(logout) +MAKE_PSTR_WORD(enabled) +MAKE_PSTR_WORD(disabled) +MAKE_PSTR_WORD(set) +MAKE_PSTR_WORD(show) +MAKE_PSTR_WORD(on) +MAKE_PSTR_WORD(off) +MAKE_PSTR_WORD(ON) +MAKE_PSTR_WORD(OFF) +MAKE_PSTR_WORD(su) +MAKE_PSTR_WORD(name) +MAKE_PSTR_WORD(auto) +MAKE_PSTR_WORD(scan) +MAKE_PSTR_WORD(password) +MAKE_PSTR_WORD(read) +MAKE_PSTR_WORD(version) +MAKE_PSTR_WORD(values) +MAKE_PSTR_WORD(system) +MAKE_PSTR_WORD(fetch) +MAKE_PSTR_WORD(restart) +MAKE_PSTR_WORD(format) +MAKE_PSTR_WORD(raw) +MAKE_PSTR_WORD(watch) +MAKE_PSTR_WORD(syslog) +MAKE_PSTR_WORD(send) +MAKE_PSTR_WORD(telegram) +MAKE_PSTR_WORD(bus_id) +MAKE_PSTR_WORD(tx_mode) +MAKE_PSTR_WORD(ems) +MAKE_PSTR_WORD(devices) +MAKE_PSTR_WORD(shower) +MAKE_PSTR_WORD(mqtt) +MAKE_PSTR_WORD(emsesp) +MAKE_PSTR_WORD(connected) +MAKE_PSTR_WORD(disconnected) +MAKE_PSTR_WORD(passwd) +MAKE_PSTR_WORD(hostname) +MAKE_PSTR_WORD(wifi) +MAKE_PSTR_WORD(reconnect) +MAKE_PSTR_WORD(ssid) +MAKE_PSTR_WORD(heartbeat) +MAKE_PSTR_WORD(users) +MAKE_PSTR_WORD(master) +MAKE_PSTR_WORD(pin) +MAKE_PSTR_WORD(publish) +MAKE_PSTR_WORD(timeout) +MAKE_PSTR_WORD(board_profile) +MAKE_PSTR_WORD(counter) +MAKE_PSTR_WORD(sensorname) + +// for commands +MAKE_PSTR_WORD(call) +MAKE_PSTR_WORD(cmd) +MAKE_PSTR_WORD(id) +MAKE_PSTR_WORD(device) +MAKE_PSTR_WORD(data) +MAKE_PSTR_WORD(command) +MAKE_PSTR_WORD(commands) +MAKE_PSTR_WORD(info) +// MAKE_PSTR_WORD(info_short) +MAKE_PSTR_WORD(settings) +MAKE_PSTR_WORD(value) +MAKE_PSTR_WORD(error) + +// devices +MAKE_PSTR_WORD(boiler) +MAKE_PSTR_WORD(thermostat) +MAKE_PSTR_WORD(switch) +MAKE_PSTR_WORD(solar) +MAKE_PSTR_WORD(mixer) +MAKE_PSTR_WORD(gateway) +MAKE_PSTR_WORD(controller) +MAKE_PSTR_WORD(connect) +MAKE_PSTR_WORD(heatpump) +MAKE_PSTR_WORD(generic) +MAKE_PSTR_WORD(sensor) +MAKE_PSTR_WORD(unknown) +MAKE_PSTR_WORD(Sensor) +MAKE_PSTR_WORD(other) + +// format strings +MAKE_PSTR(master_thermostat_fmt, "Master Thermostat Device ID: %s") +MAKE_PSTR(host_fmt, "Host: %s") +MAKE_PSTR(port_fmt, "Port: %d") +MAKE_PSTR(hostname_fmt, "Hostname: %s") +MAKE_PSTR(board_profile_fmt, "Board Profile: %s") +MAKE_PSTR(mark_interval_fmt, "Mark interval: %lus") +MAKE_PSTR(wifi_ssid_fmt, "WiFi SSID: %s") +MAKE_PSTR(wifi_password_fmt, "WiFi Password: %S") +MAKE_PSTR(ethernet_option_fmt, "Ethernet option: %d") +MAKE_PSTR(tx_mode_fmt, "Tx mode: %d") +MAKE_PSTR(bus_id_fmt, "Bus ID: %02X") +MAKE_PSTR(log_level_fmt, "Log level: %s") + +MAKE_STR(productid_fmt, "%s EMS Product ID") + +MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F_(error), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all")) +MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) + +// strings +MAKE_PSTR(show_optional, "[devices | users | ems | mqtt | system | commands]") +MAKE_PSTR(EMSESP, "EMS-ESP") +MAKE_PSTR(cmd_optional, "[cmd]") +MAKE_PSTR(ha_optional, "[ha]") +MAKE_PSTR(deep_optional, "[deep]") +MAKE_PSTR(watchid_optional, "[ID]") +MAKE_PSTR(watch_format_optional, "[off | on | raw | unknown]") +MAKE_PSTR(invalid_watch, "Invalid watch type") +MAKE_PSTR(data_mandatory, "\"XX XX ...\"") +MAKE_PSTR(asterisks, "********") +MAKE_PSTR(n_mandatory, "") +MAKE_PSTR(sensorid_optional, "[sensor ID]") +MAKE_PSTR(id_optional, "[id|hc]") +MAKE_PSTR(data_optional, "[data]") +MAKE_PSTR(offset_optional, "[offset]") +MAKE_PSTR(typeid_mandatory, "") +MAKE_PSTR(deviceid_mandatory, "") +MAKE_PSTR(device_type_optional, "[device]") +MAKE_PSTR(invalid_log_level, "Invalid log level") +MAKE_PSTR(log_level_optional, "[level]") +MAKE_PSTR(name_mandatory, "") +MAKE_PSTR(name_optional, "[name]") +MAKE_PSTR(new_password_prompt1, "Enter new password: ") +MAKE_PSTR(new_password_prompt2, "Retype new password: ") +MAKE_PSTR(password_prompt, "Password: ") +MAKE_PSTR(unset, "") + +// command descriptions +MAKE_PSTR(info_cmd, "list all values") +MAKE_PSTR(commands_cmd, "list all commands") + +MAKE_PSTR_WORD(number) +MAKE_PSTR_WORD(enum) +MAKE_PSTR_WORD(text) + +MAKE_PSTR_WORD(2) +MAKE_PSTR_WORD(4) +MAKE_PSTR_WORD(10) +MAKE_PSTR_WORD(100) +MAKE_PSTR_WORD(60) + +MAKE_PSTR_LIST(div2, F_(2)) +MAKE_PSTR_LIST(div4, F_(4)) +MAKE_PSTR_LIST(div10, F_(10)) +MAKE_PSTR_LIST(div100, F_(100)) +MAKE_PSTR_LIST(div60, F_(60)) +MAKE_PSTR_LIST(mul15, F("-15")) + +// Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp +// uom - also used with HA see https://github.com/home-assistant/core/blob/d7ac4bd65379e11461c7ce0893d3533d8d8b8cbf/homeassistant/const.py#L384 +MAKE_PSTR(blank, " ") +MAKE_PSTR(percent, "%") +MAKE_PSTR(degrees, "°C") +MAKE_PSTR(kwh, "kWh") +MAKE_PSTR(wh, "Wh") +MAKE_PSTR(bar, "bar") +MAKE_PSTR(minutes, "Minuten") +MAKE_PSTR(hours, "Stunden") +MAKE_PSTR(ua, "uA") +MAKE_PSTR(lmin, "l/min") +MAKE_PSTR(kw, "kW") +MAKE_PSTR(w, "W") +MAKE_PSTR(kb, "KB") +MAKE_PSTR(seconds, "seconds") +MAKE_PSTR(dbm, "dBm") +MAKE_PSTR(fahrenheit, "°F") +MAKE_PSTR(mv, "mV") +MAKE_PSTR(sqm, "sqm") + +// TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp +// use empty string if want to suppress showing tags +// mqtt tags must not have spaces +MAKE_PSTR(tag_none, "") +MAKE_PSTR(tag_heartbeat, "") +MAKE_PSTR(tag_boiler_data, "") +MAKE_PSTR(tag_device_data_ww, "Warmwasser") +MAKE_PSTR(tag_thermostat_data, "") +MAKE_PSTR(tag_hc1, "hc1") +MAKE_PSTR(tag_hc2, "hc2") +MAKE_PSTR(tag_hc3, "hc3") +MAKE_PSTR(tag_hc4, "hc4") +MAKE_PSTR(tag_wwc1, "wwc1") +MAKE_PSTR(tag_wwc2, "wwc2") +MAKE_PSTR(tag_wwc3, "wwc3") +MAKE_PSTR(tag_wwc4, "wwc4") +MAKE_PSTR(tag_hs1, "hs1") +MAKE_PSTR(tag_hs2, "hs2") +MAKE_PSTR(tag_hs3, "hs3") +MAKE_PSTR(tag_hs4, "hs4") +MAKE_PSTR(tag_hs5, "hs5") +MAKE_PSTR(tag_hs6, "hs6") +MAKE_PSTR(tag_hs7, "hs7") +MAKE_PSTR(tag_hs8, "hs8") +MAKE_PSTR(tag_hs9, "hs9") +MAKE_PSTR(tag_hs10, "hs10") +MAKE_PSTR(tag_hs11, "hs11") +MAKE_PSTR(tag_hs12, "hs12") +MAKE_PSTR(tag_hs13, "hs13") +MAKE_PSTR(tag_hs14, "hs14") +MAKE_PSTR(tag_hs15, "hs15") +MAKE_PSTR(tag_hs16, "hs16") + +// MQTT topic names +// MAKE_PSTR(tag_heartbeat_mqtt, "heartbeat") +MAKE_PSTR(tag_boiler_data_mqtt, "") +MAKE_PSTR(tag_device_data_ww_mqtt, "ww") + +// boiler +MAKE_PSTR(time, "Zeit") +MAKE_PSTR(date, "Datum") +MAKE_PSTR_WORD(1x3min) +MAKE_PSTR_WORD(2x3min) +MAKE_PSTR_WORD(3x3min) +MAKE_PSTR_WORD(4x3min) +MAKE_PSTR_WORD(5x3min) +MAKE_PSTR_WORD(6x3min) +MAKE_PSTR_(continuos, "kontinuierlich") +MAKE_PSTR(3wayvalve, "3-wege Ventil") +MAKE_PSTR(chargepump, "Ladepumpe") +MAKE_PSTR(hot, "Heiss") +MAKE_PSTR_WORD(eco) +MAKE_PSTR_WORD(intelligent) +MAKE_PSTR(manual, "Manuell") +MAKE_PSTR_(flow, "Fluss") +MAKE_PSTR_(buffer, "Speicher") +MAKE_PSTR(bufferedflow, "Durchlaufspeicher") +MAKE_PSTR(layeredbuffer, "Schichtspeicher") +MAKE_PSTR_WORD(maintenance) + +// boiler lists +MAKE_PSTR_LIST(tpl_date, F("Format: < dd.mm.yyyy >")) // template for text input +MAKE_PSTR_LIST(enum_off_time_date_manual, F_(off), F_(time), F_(date), F_(manual)) +MAKE_PSTR_LIST(enum_freq, F_(off), F_(1x3min), F_(2x3min), F_(3x3min), F_(4x3min), F_(5x3min), F_(6x3min), F_(continuos)) +MAKE_PSTR_LIST(enum_charge, F_(chargepump), F_(3wayvalve)) +MAKE_PSTR_LIST(enum_comfort, F_(hot), F_(eco), F_(intelligent)) +MAKE_PSTR_LIST(enum_flow, F_(off), F_(flow), F_(bufferedflow), F_(buffer), F_(layeredbuffer)) +MAKE_PSTR_LIST(enum_reset, F_(maintenance), F_(error)) +// MAKE_PSTR_LIST(enum_bool, F_(Aus), F_(Ein)) + +// thermostat +MAKE_PSTR(light, "Leicht") +MAKE_PSTR(medium, "Mittel") +MAKE_PSTR(heavy, "Schwer") +MAKE_PSTR(own_prog, "Eigenprog") +MAKE_PSTR_WORD(start) +MAKE_PSTR(heat, "Heizen") +MAKE_PSTR(hold, "Halten") +MAKE_PSTR(cool, "Kühl") +MAKE_PSTR(end, "Ende") +MAKE_PSTR(german, "Deutsch") +MAKE_PSTR(dutch, "Niederländisch") +MAKE_PSTR(french, "Französisch") +MAKE_PSTR(italian, "Italienisch") +MAKE_PSTR(high, "hoch") +MAKE_PSTR(low, "niedrig") +MAKE_PSTR(radiator, "Heizkörper") +MAKE_PSTR(convector, "Konvektor") +MAKE_PSTR(floor, "Fussboden") +MAKE_PSTR(summer, "Sommer") +MAKE_PSTR_WORD(winter) +MAKE_PSTR(outdoor, "Aussentemperatur") +MAKE_PSTR_WORD(mpc) +MAKE_PSTR(room, "Raum") +MAKE_PSTR(power, "Leistung") +MAKE_PSTR(constant, "konstant") +MAKE_PSTR(simple, "einfach") +MAKE_PSTR(optimized, "optimiert") +MAKE_PSTR(nofrost, "Frostschutz") +MAKE_PSTR(comfort, "Komfort") +MAKE_PSTR(night, "Nacht") +MAKE_PSTR(day, "Tag") +MAKE_PSTR(holiday, "Urlaub") +MAKE_PSTR(reduce, "reduziert") +MAKE_PSTR(noreduce, "unreduziert") +MAKE_PSTR(offset, "Anhebung") +MAKE_PSTR(design, "Auslegung") +MAKE_PSTR_WORD(tempauto) +MAKE_PSTR(minflow, "minfluss") +MAKE_PSTR(maxflow, "maxfluss") + +MAKE_PSTR_WORD(rc3x) +MAKE_PSTR_WORD(rc20) +MAKE_PSTR(internal_temperature, "interne Temperatur") +MAKE_PSTR(internal_setpoint, "interner Sollwert") +MAKE_PSTR(external_temperature, "externe Temperatur") +MAKE_PSTR(burner_temperature, "Kesseltemperatur") +MAKE_PSTR(ww_temperature, "Wassertemperatur") +MAKE_PSTR(functioning_mode, "functioning mode") +MAKE_PSTR(smoke_temperature, "Abgastemperatur") + +// thermostat lists +MAKE_PSTR_LIST(tpl_datetime, F("Format: < hh:mm:ss dd/mm/yyyy-dw-dst | NTP >")) +MAKE_PSTR_LIST(tpl_switchtime, F("Format: < nn.d.o.hh:mm >")) +MAKE_PSTR_LIST(enum_ibaMainDisplay, + F_(internal_temperature), + F_(internal_setpoint), + F_(external_temperature), + F_(burner_temperature), + F_(ww_temperature), + F_(functioning_mode), + F_(time), + F_(date), + F_(smoke_temperature)) +MAKE_PSTR_LIST(enum_ibaLanguage, F_(german), F_(dutch), F_(french), F_(italian)) +MAKE_PSTR_LIST(enum_floordrystatus, F_(off), F_(start), F_(heat), F_(hold), F_(cool), F_(end)) +MAKE_PSTR_LIST(enum_ibaBuildingType, F_(light), F_(medium), F_(heavy)) // RC300 +MAKE_PSTR_LIST(enum_wwMode, F_(off), F_(low), F_(high), F_(auto), F_(own_prog)) +MAKE_PSTR_LIST(enum_wwCircMode, F_(off), F_(on), F_(auto), F_(own_prog)) +MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) +MAKE_PSTR_LIST(enum_wwCircMode2, F_(off), F_(on), F_(auto)) +MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) +MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) + +MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) +MAKE_PSTR_LIST(enum_mode2, F_(off), F_(manual), F_(auto)) +MAKE_PSTR_LIST(enum_mode3, F_(night), F_(day), F_(auto)) +MAKE_PSTR_LIST(enum_mode4, F_(nofrost), F_(eco), F_(heat), F_(auto)) // JUNKERS +MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) + +MAKE_PSTR_LIST(enum_modetype, F_(eco), F_(comfort)) +MAKE_PSTR_LIST(enum_modetype2, F_(day)) +MAKE_PSTR_LIST(enum_modetype3, F_(night), F_(day)) +MAKE_PSTR_LIST(enum_modetype4, F_(nofrost), F_(eco), F_(heat)) +MAKE_PSTR_LIST(enum_modetype5, F_(off), F_(on)) + +MAKE_PSTR_LIST(enum_reducemode, F_(nofrost), F_(reduce), F_(room), F_(outdoor)) + +MAKE_PSTR_LIST(enum_controlmode, F_(off), F_(optimized), F_(simple), F_(mpc), F_(room), F_(power), F_(constant)) +MAKE_PSTR_LIST(enum_controlmode2, F_(outdoor), F_(room)) +MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor")) +MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x)) + +MAKE_PSTR_LIST(enum_wwProgMode, F("std prog"), F_(own_prog)) +MAKE_PSTR_LIST(enum_wwDisinfectDay, F("Mo"), F("Di"), F("Mi"), F("Do"), F("Fr"), F("Sa"), F("So"), F("t�glich")) +MAKE_PSTR_LIST(enum_wwChargeDuration, F_(off), F("15min"), F("30min"), F("45min"), F("60min"), F("75min"), F("90min"), F("105min"), F("120min")) + +// solar list +MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog")) +MAKE_PSTR_LIST(enum_collectortype, F("flat"), F("vacuum")) + +// id used to store the device ID, goes into MQTT payload +// empty full name to prevent being shown in web or console +MAKE_PSTR_LIST(ID, F_(id)) + +// Boiler +// extra commands +MAKE_PSTR_LIST(wwtapactivated, F("wwtapactivated"), F("Aktiviere Warmwasser im Wartungsmodus")) +MAKE_PSTR_LIST(reset, F("reset"), F("Sende 'RESET'")) + +// single mqtt topics +MAKE_PSTR_WORD(heating_active) +MAKE_PSTR_WORD(tapwater_active) +MAKE_PSTR_WORD(response) + +// mqtt, commands and text +MAKE_PSTR_LIST(heatingActive, F("heatingactive"), F("Heizung aktiv")) +MAKE_PSTR_LIST(tapwaterActive, F("tapwateractive"), F("Warmwasser aktiv")) +MAKE_PSTR_LIST(selFlowTemp, F("selflowtemp"), F("Sollwert Flusstemperatur")) +MAKE_PSTR_LIST(selBurnPow, F("selburnpow"), F("Sollwert Brennerleistung")) +MAKE_PSTR_LIST(heatingPumpMod, F("heatingpumpmod"), F("Heizungspumpe 1 Modulation")) +MAKE_PSTR_LIST(heatingPump2Mod, F("heatingpump2mod"), F("Heizungspumpe 2 Modulation")) +MAKE_PSTR_LIST(outdoorTemp, F("outdoortemp"), F("Aussentemperatur")) +MAKE_PSTR_LIST(curFlowTemp, F("curflowtemp"), F("aktuelle Flusstemperatur")) +MAKE_PSTR_LIST(retTemp, F("rettemp"), F("Rücklauftemperatur")) +MAKE_PSTR_LIST(switchTemp, F("switchtemp"), F("Mischer Schalttemperatur")) +MAKE_PSTR_LIST(sysPress, F("syspress"), F("Systemdruck")) +MAKE_PSTR_LIST(boilTemp, F("boiltemp"), F("Kesseltemperatur")) +MAKE_PSTR_LIST(exhaustTemp, F("exhausttemp"), F("Auslasstemperatur")) +MAKE_PSTR_LIST(burnGas, F("burngas"), F("Gas")) +MAKE_PSTR_LIST(flameCurr, F("flamecurr"), F("Flammstrom")) +MAKE_PSTR_LIST(heatingPump, F("heatingpump"), F("Heizungspumpe")) +MAKE_PSTR_LIST(fanWork, F("fanwork"), F("Gebläse")) +MAKE_PSTR_LIST(ignWork, F("ignwork"), F("Zündung")) +MAKE_PSTR_LIST(heatingActivated, F("heatingactivated"), F("Heizen aktiviert")) +MAKE_PSTR_LIST(heatingTemp, F("heatingtemp"), F("Kesseltemperatur")) +MAKE_PSTR_LIST(pumpModMax, F("pumpmodmax"), F("Kesselpumpen Maximalleistung")) +MAKE_PSTR_LIST(pumpModMin, F("pumpmodmin"), F("Kesselpumpen Minmalleistung")) +MAKE_PSTR_LIST(pumpDelay, F("pumpdelay"), F("Pumpennachlauf")) +MAKE_PSTR_LIST(burnMinPeriod, F("burnminperiod"), F("Antipendelzeit")) +MAKE_PSTR_LIST(burnMinPower, F("burnminpower"), F("minimale Brennerleistung")) +MAKE_PSTR_LIST(burnMaxPower, F("burnmaxpower"), F("maximale Brennerleistung")) +MAKE_PSTR_LIST(boilHystOn, F("boilhyston"), F("Hysterese ein temperatur")) +MAKE_PSTR_LIST(boilHystOff, F("boilhystoff"), F("Hysterese aus temperatur")) +MAKE_PSTR_LIST(setFlowTemp, F("setflowtemp"), F("Sollwert Flusstemperatur")) +MAKE_PSTR_LIST(setBurnPow, F("setburnpow"), F("Sollwert Brennerleistung")) +MAKE_PSTR_LIST(curBurnPow, F("curburnpow"), F("Brennerleistung")) +MAKE_PSTR_LIST(burnStarts, F("burnstarts"), F("Brenner # starts")) +MAKE_PSTR_LIST(burnWorkMin, F("burnworkmin"), F("Brenner Laufzeit")) +MAKE_PSTR_LIST(heatWorkMin, F("heatworkmin"), F("Heizung Laufzeit")) +MAKE_PSTR_LIST(UBAuptime, F("ubauptime"), F("gesamte Laufzeit")) +MAKE_PSTR_LIST(lastCode, F("lastcode"), F("Fehlerspeicher")) +MAKE_PSTR_LIST(serviceCode, F("servicecode"), F("Statusmeldung")) +MAKE_PSTR_LIST(serviceCodeNumber, F("servicecodenumber"), F("Statusmeldungsnummer")) +MAKE_PSTR_LIST(maintenanceMessage, F("maintenancemessage"), F("Wartungsmeldung")) +MAKE_PSTR_LIST(maintenanceDate, F("maintenancedate"), F("Wartungsdatum")) +MAKE_PSTR_LIST(maintenanceType, F_(maintenance), F("Wartungsplan")) +MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("Wartung in")) + +MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("Betriebszeit total heizen")) +MAKE_PSTR_LIST(upTimeCompHeating, F("uptimecompheating"), F("Betriebszeit Kompressor heizen")) +MAKE_PSTR_LIST(upTimeCompCooling, F("uptimecompcooling"), F("Betriebszeit Kompressor kühlen")) +MAKE_PSTR_LIST(upTimeCompWw, F("uptimecompww"), F("Betriebszeit Kompressor")) +MAKE_PSTR_LIST(heatingStarts, F("heatingstarts"), F("Heizen Starts")) +MAKE_PSTR_LIST(coolingStarts, F("coolingstarts"), F("Kühlen Starts")) +MAKE_PSTR_LIST(nrgConsTotal, F("nrgconstotal"), F("totaler Energieverbrauch")) +MAKE_PSTR_LIST(nrgConsCompTotal, F("nrgconscomptotal"), F("Energieverbrauch Kompressor total")) +MAKE_PSTR_LIST(nrgConsCompHeating, F("nrgconscompheating"), F("Energieverbrauch Kompressor heizen")) +MAKE_PSTR_LIST(nrgConsCompWw, F("nrgconscompww"), F("Energieverbrauch Kompressor")) +MAKE_PSTR_LIST(nrgConsCompCooling, F("nrgconscompcooling"), F("Energieverbrauch Kompressor kühlen")) +MAKE_PSTR_LIST(nrgSuppTotal, F("nrgsupptotal"), F("gesamte Energieabgabe")) +MAKE_PSTR_LIST(nrgSuppHeating, F("nrgsuppheating"), F("gesamte Energieabgabe heizen")) +MAKE_PSTR_LIST(nrgSuppWw, F("nrgsuppww"), F("gesamte Energieabgabe")) +MAKE_PSTR_LIST(nrgSuppCooling, F("nrgsuppcooling"), F("gesamte Energieabgabe kühlen")) +MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, F("auxelecheatnrgconstotal"), F("Energieverbrauch el. Zusatzheizung")) +MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, F("auxelecheatnrgconsheating"), F("Energieverbrauch el. Zusatzheizung heizen")) +MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("Energieverbrauch el. Zusatzheizung")) + +MAKE_PSTR_LIST(hpPower, F("hppower"), F("Leistung Wärmepumpe")) +MAKE_PSTR_LIST(hpTc0, F("hptc0"), F("Wärmeträgerflüssigkeit Eingang (TC0)")) +MAKE_PSTR_LIST(hpTc1, F("hptc1"), F("Wärmeträgerflüssigkeit Ausgang (TC1)")) +MAKE_PSTR_LIST(hpTc3, F("hptc3"), F("Verflüssigertemperatur (TC3)")) +MAKE_PSTR_LIST(hpTr3, F("hptr3"), F(" Temperaturfühler Kältemittel (Flüssigkeit) (TR3)")) +MAKE_PSTR_LIST(hpTr4, F("hptr4"), F("Verdampfer Eintritt (TR4)")) +MAKE_PSTR_LIST(hpTr5, F("hptr5"), F("Temperaturfühler Kompessoransaugleitung (TR5)")) +MAKE_PSTR_LIST(hpTr6, F("hptr6"), F("Temperaturfühler Kompressorausgangsleitung (TR6)")) +MAKE_PSTR_LIST(hpTr7, F("hptr7"), F("Temperaturfühler Kältemittel (Gas) (TR7)")) +MAKE_PSTR_LIST(hpTl2, F("hptl2"), F("Außenlufttemperaturfühler (TL2)")) +MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("Niedrigdruckfühler (PL1)")) +MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("Hochdruckfühler (PH1)")) + +MAKE_PSTR_LIST(wWSelTemp, F("wwseltemp"), F("gewählte Temperatur")) +MAKE_PSTR_LIST(wWSetTemp, F("wwsettemp"), F("Solltemperatur")) +MAKE_PSTR_LIST(wWType, F("wwtype"), F("Typ")) +MAKE_PSTR_LIST(wWComfort, F("wwcomfort"), F("Komfort")) +MAKE_PSTR_LIST(wWFlowTempOffset, F("wwflowtempoffset"), F("Flusstemperaturanhebung")) +MAKE_PSTR_LIST(wWMaxPower, F("wwmaxpower"), F("max Leistung")) +MAKE_PSTR_LIST(wWCircPump, F("wwcircpump"), F("Zirkulationspumpe vorhanden")) +MAKE_PSTR_LIST(wWChargeType, F("wwchargetype"), F("Ladungstyp")) +MAKE_PSTR_LIST(wWDisinfectionTemp, F("wwdisinfectiontemp"), F("Desinfectionstemperatur")) +MAKE_PSTR_LIST(wWCircMode, F("wwcircmode"), F("Zirkulationspumpenfrequenz")) +MAKE_PSTR_LIST(wWCirc, F("wwcirc"), F("Zirkulation aktiv")) +MAKE_PSTR_LIST(wWCurTemp, F("wwcurtemp"), F("aktuelle Warmwasser Temperatur intern")) +MAKE_PSTR_LIST(wWCurTemp2, F("wwcurtemp2"), F("aktuelle Warmwaser Temperatur extern")) +MAKE_PSTR_LIST(wWCurFlow, F("wwcurflow"), F("aktueller Durchfluss")) +MAKE_PSTR_LIST(wWStorageTemp1, F("wwstoragetemp1"), F("interne Speichertemperature")) +MAKE_PSTR_LIST(wWStorageTemp2, F("wwstoragetemp2"), F("externer Speichertemperatur")) +MAKE_PSTR_LIST(wWActivated, F("wwactivated"), F("aktiviert")) +MAKE_PSTR_LIST(wWOneTime, F("wwonetime"), F("Einmalladung")) +MAKE_PSTR_LIST(wWDisinfect, F("wwdisinfect"), F("Desinfizieren")) +MAKE_PSTR_LIST(wWCharging, F("wwcharging"), F("Laden")) +MAKE_PSTR_LIST(wWRecharging, F("wwrecharging"), F("Nachladen")) +MAKE_PSTR_LIST(wWTempOK, F("wwtempok"), F("Temperatur ok")) +MAKE_PSTR_LIST(wWActive, F("wwactive"), F("aktiv")) +MAKE_PSTR_LIST(wWHeat, F("wwheat"), F("heizen")) +MAKE_PSTR_LIST(wWSetPumpPower, F("wwsetpumppower"), F("Soll Pumpenleistung")) +MAKE_PSTR_LIST(mixerTemp, F("mixertemp"), F("Mischertemperatur")) +MAKE_PSTR_LIST(tankMiddleTemp, F("tankmiddletemp"), F("Speicher mittel temperatur (TS3)")) +MAKE_PSTR_LIST(wWStarts, F("wwstarts"), F("Anzahl starts")) +MAKE_PSTR_LIST(wWStarts2, F("wwstarts2"), F("Kreis 2 Anzahl Starts")) +MAKE_PSTR_LIST(wWWorkM, F("wwworkm"), F("aktive Zeit")) +MAKE_PSTR_LIST(wWHystOn, F("wwhyston"), F("Hysterese Einschalttemperatur")) +MAKE_PSTR_LIST(wWHystOff, F("wwhystoff"), F("Hysterese Ausschalttemperatur")) +MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("Starts")) +MAKE_PSTR_LIST(wwWorkM, F("wwworkm"), F("aktive Zeit")) +MAKE_PSTR_LIST(wwHystOn, F("wwhyston"), F("Hysterese an")) +MAKE_PSTR_LIST(wwHystOff, F("wwhystoff"), F("Hysterese aus")) +MAKE_PSTR_LIST(wwProgMode, F("wwprogmode"), F("Programmmodus")) +MAKE_PSTR_LIST(wwCircProg, F("wwcircprog"), F("Zirkulationsprogramm")) +// MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("Desinfizieren")) // same as in boiler +MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("Desinfizierung Tag")) +MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("Desinfizierung Stunde")) +MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("Maximale Temperatur")) +MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("Einmalladungstaste")) +MAKE_PSTR_LIST(switchtime, F("switchtime"), F("einzelne Programmschaltzeit")) + +// mqtt values / commands +MAKE_PSTR_LIST(dateTime, F("datetime"), F("Datum/Zeit")) +MAKE_PSTR_LIST(errorCode, F("errorcode"), F("Fehlermeldung")) + +MAKE_PSTR_LIST(ibaMainDisplay, F("display"), F("Anzeige")) +MAKE_PSTR_LIST(ibaLanguage, F("language"), F("Sprache")) +MAKE_PSTR_LIST(ibaClockOffset, F("clockoffset"), F("Uhrkorrektur")) +MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("Gebäude")) +MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("Korrektur interner Temperatur")) +MAKE_PSTR_LIST(ibaMinExtTemperature, F("minexttemp"), F("min Aussentemperatur")) +MAKE_PSTR_LIST(damping, F("damping"), F("Dämpfung der Außentemperatur")) + +MAKE_PSTR_LIST(tempsensor1, F("inttemp1"), F("Temperatursensor 1")) +MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("Temperatursensor 2")) +MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("gedämpfte Aussentemperatur")) +MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("Estrichtrocknung")) +MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("Estrichtrocknungs Temperatur")) +MAKE_PSTR_LIST(wwMode, F("wwmode"), F("modus")) +MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("untere Solltemperatur")) +MAKE_PSTR_LIST(wwChargeDuration, F("wwchargeduration"), F("charge duration")) +MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("Kreis 1 Extra")) +MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("Kreis 2 Extra")) +MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("Sollwert Raumtemperatur")) +MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("aktuelle Raumtemperatur")) +MAKE_PSTR_LIST(mode, F("mode"), F("modus")) +MAKE_PSTR_LIST(modetype, F("modetype"), F("modus Typ")) + +MAKE_PSTR_LIST(daytemp, F("daytemp"), F("Tagestemperatur")) +MAKE_PSTR_LIST(heattemp, F("heattemp"), F("Heizen Temperatur")) +MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("Nachttemperatur")) +MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco Temperatur")) +MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manuelle Temperatur")) +MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("zwischenzeitliche Solltemperatur")) +MAKE_PSTR_LIST(comforttemp, F("comforttemp"), F("Komforttemperatur")) +MAKE_PSTR_LIST(summertemp, F("summertemp"), F("Sommertemperatur")) +MAKE_PSTR_LIST(designtemp, F("designtemp"), F("design-Temperatur")) +MAKE_PSTR_LIST(offsettemp, F("offsettemp"), F("Temperaturanhebung")) +MAKE_PSTR_LIST(minflowtemp, F("minflowtemp"), F("min Flusstemperatur")) +MAKE_PSTR_LIST(maxflowtemp, F("maxflowtemp"), F("max Flusstemperatur")) +MAKE_PSTR_LIST(roominfluence, F("roominfluence"), F("Raumeinfluss")) +MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("Frostschutztemperatur")) +MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("berechnete Flusstemperatur")) +MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("Heizungstyp")) +MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("Einstellung Sommerbetrieb")) +MAKE_PSTR_LIST(controlmode, F("controlmode"), F("Kontrollmodus")) +MAKE_PSTR_LIST(control, F("control"), F("Fernsteuerung")) +MAKE_PSTR_LIST(program, F("program"), F("Programm")) +MAKE_PSTR_LIST(pause, F("pause"), F("Pausenzeit")) +MAKE_PSTR_LIST(party, F("party"), F("Partyzeit")) +MAKE_PSTR_LIST(wwprio, F("wwprio"), F("dhw priority")) + +MAKE_PSTR_LIST(holidaytemp, F("holidaytemp"), F("Urlaubstemperatur")) +MAKE_PSTR_LIST(summermode, F("summermode"), F("Sommerbetrieb")) +MAKE_PSTR_LIST(holidaymode, F("holidaymode"), F("Urlaubsbetrieb")) +MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("Flusstemperaturanhebung")) +MAKE_PSTR_LIST(reducemode, F("reducemode"), F("Absenkmodus")) +MAKE_PSTR_LIST(noreducetemp, F("noreducetemp"), F("Absenkung unterbrechen unter Temperatur")) +MAKE_PSTR_LIST(remotetemp, F("remotetemp"), F("Raumtemperatur der Fernsteuerung")) + +// heatpump +MAKE_PSTR_LIST(airHumidity, F("airhumidity"), F("relative Luftfeuchte")) +MAKE_PSTR_LIST(dewTemperature, F("dewtemperature"), F("Taupunkttemperatur")) + +// mixer +MAKE_PSTR_LIST(flowSetTemp, F("flowsettemp"), F("Sollwert Flusstemperatur")) +MAKE_PSTR_LIST(flowTempHc, F("flowtemphc"), F("Flusstemperatur des hk (TC1)")) +MAKE_PSTR_LIST(pumpStatus, F("pumpstatus"), F("Pumpenstatus des hk (PC1)")) +MAKE_PSTR_LIST(mixerStatus, F("valvestatus"), F("Mischerventil Position (VC1)")) +MAKE_PSTR_LIST(flowTempVf, F("flowtempvf"), F("Flusstemperatur am Kessel (T0/Vf)")) + +MAKE_PSTR_LIST(wwPumpStatus, F("pumpstatus"), F("Pumpenstatus des wwk (PC1)")) +MAKE_PSTR_LIST(wwTempStatus, F("tempstatus"), F("Temperaturschalter des wwk (MC1)")) +MAKE_PSTR_LIST(wwTemp, F("wwtemp"), F("aktuelle Temperatur")) + +// solar +MAKE_PSTR_LIST(type, F("type"), F("type")) +MAKE_PSTR_LIST(collectorTemp, F("collectortemp"), F("Kollektortemperatur (TS1)")) +MAKE_PSTR_LIST(tankBottomTemp, F("tankbottomtemp"), F("Speicher Bodentemperatur (TS2)")) +MAKE_PSTR_LIST(tank2BottomTemp, F("tank2bottomtemp"), F("2. Speicher Bodentemperatur (TS5)")) +MAKE_PSTR_LIST(heatExchangerTemp, F("heatexchangertemp"), F("wärmetauscher Temperatur (TS6)")) + +MAKE_PSTR_LIST(collectorMaxTemp, F("collectormaxtemp"), F("maximale Kollektortemperatur")) +MAKE_PSTR_LIST(collectorMinTemp, F("collectormintemp"), F("minimale Kollektortemperatur")) +MAKE_PSTR_LIST(tankMaxTemp, F("tankmaxtemp"), F("maximale Speichertemperatur")) +MAKE_PSTR_LIST(solarPumpModulation, F("solarpumpmodulation"), F("Pumpenmodulation (PS1)")) +MAKE_PSTR_LIST(cylinderPumpModulation, F("cylinderpumpmodulation"), F("Speicherpumpenmodulation (PS5)")) + +MAKE_PSTR_LIST(solarPump, F("solarpump"), F("Pumpe (PS1)")) +MAKE_PSTR_LIST(valveStatus, F("valvestatus"), F("ventilstatus")) +MAKE_PSTR_LIST(tankHeated, F("tankheated"), F("Speichertemperatur erreicht")) +MAKE_PSTR_LIST(collectorShutdown, F("collectorshutdown"), F("Kollektorabschaltung")) + +MAKE_PSTR_LIST(pumpWorkTime, F("pumpworktime"), F("Pumpenlaufzeit")) + +MAKE_PSTR_LIST(energyLastHour, F("energylasthour"), F("Energie letzte Std")) +MAKE_PSTR_LIST(energyTotal, F("energytotal"), F("Gesamtenergie")) +MAKE_PSTR_LIST(energyToday, F("energytoday"), F("Energie heute")) +MAKE_PSTR_LIST(wwTemp1, F("wwtemp1"), F("Temperatur 1")) +MAKE_PSTR_LIST(wwTemp3, F("wwtemp3"), F("Temperatur 3")) +MAKE_PSTR_LIST(wwTemp4, F("wwtemp4"), F("Temperatur 4")) +MAKE_PSTR_LIST(wwTemp5, F("wwtemp5"), F("Temperatur 5")) +MAKE_PSTR_LIST(wwTemp7, F("wwtemp7"), F("Temperatur 7")) +MAKE_PSTR_LIST(wwPump, F("wwpump"), F("Pumpe")) +MAKE_PSTR_LIST(wwMinTemp, F("wwmintemp"), F("minimale Temperatur")) +MAKE_PSTR_LIST(pumpMinMod, F("minpumpmod"), F("minimale Pumpenmodulation")) +MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximaler Durchfluss")) +MAKE_PSTR_LIST(solarPower, F("solarpower"), F("aktuelle Leistung")) +MAKE_PSTR_LIST(solarPumpTurnonDiff, F("turnondiff"), F("Einschaltdifferenz")) +MAKE_PSTR_LIST(solarPumpTurnoffDiff, F("turnoffdiff"), F("Ausschaltdifferenz")) + +//SM100 +MAKE_PSTR_LIST(heatTransferSystem, F("heattransfersystem"), F("heattransfer system")) +MAKE_PSTR_LIST(externalTank, F("externaltank"), F("external tank")) +MAKE_PSTR_LIST(thermalDisinfect, F("thermaldisinfect"), F("thermal disinfection")) +MAKE_PSTR_LIST(heatMetering, F("heatmetering"), F("heatmetering")) +MAKE_PSTR_LIST(solarIsEnabled, F("solarenabled"), F("Solarmodul aktiviert")) + +// telegram 0x035A +MAKE_PSTR_LIST(solarPumpMode, F("solarpumpmode"), F("solar pump mode")) +MAKE_PSTR_LIST(solarPumpKick, F("pumpkick"), F("pumpkick")) +MAKE_PSTR_LIST(plainWaterMode, F("plainwatermode"), F("plain water mode")) +MAKE_PSTR_LIST(doubleMatchFlow, F("doublematchflow"), F("doublematchflow")) + +// telegram 0x380 +MAKE_PSTR_LIST(climateZone, F("climatezone"), F("climate zone")) +MAKE_PSTR_LIST(collector1Area, F("collector1area"), F("collector 1 area")) +MAKE_PSTR_LIST(collector1Type, F("collector1type"), F("collector 1 type")) + +// switch +MAKE_PSTR_LIST(activated, F("activated"), F("aktiviert")) +MAKE_PSTR_LIST(status, F("status"), F("Status")) + +MAKE_PSTR_LIST(data11, F("data11"), F("unknown datafield 11")) +MAKE_PSTR_LIST(data12, F("data12"), F("unknown datafield 12")) +MAKE_PSTR_LIST(data8, F("data8"), F("unknown datafield 8")) +MAKE_PSTR_LIST(data0, F("data0"), F("unknown datafield 0")) +MAKE_PSTR_LIST(data1, F("data1"), F("unknown datafield 1")) +MAKE_PSTR_LIST(setting3, F("setting3"), F("unknown setting 3")) +MAKE_PSTR_LIST(setting4, F("setting4"), F("unknown setting 4")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 30def5beb..a5e1a1125 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -46,7 +46,7 @@ MAKE_PSTR_WORD(restart) MAKE_PSTR_WORD(format) MAKE_PSTR_WORD(raw) MAKE_PSTR_WORD(watch) -MAKE_PSTR_WORD(syslog_level) +MAKE_PSTR_WORD(syslog) MAKE_PSTR_WORD(send) MAKE_PSTR_WORD(telegram) MAKE_PSTR_WORD(bus_id) @@ -70,18 +70,22 @@ MAKE_PSTR_WORD(pin) MAKE_PSTR_WORD(publish) MAKE_PSTR_WORD(timeout) MAKE_PSTR_WORD(board_profile) +MAKE_PSTR_WORD(counter) MAKE_PSTR_WORD(sensorname) // for commands MAKE_PSTR_WORD(call) MAKE_PSTR_WORD(cmd) MAKE_PSTR_WORD(id) +MAKE_PSTR_WORD(hc) +MAKE_PSTR_WORD(wwc) MAKE_PSTR_WORD(device) MAKE_PSTR_WORD(data) MAKE_PSTR_WORD(command) MAKE_PSTR_WORD(commands) MAKE_PSTR_WORD(info) MAKE_PSTR_WORD(settings) +MAKE_PSTR_WORD(customizations) MAKE_PSTR_WORD(value) MAKE_PSTR_WORD(error) MAKE_PSTR_WORD(entities) @@ -97,9 +101,9 @@ MAKE_PSTR_WORD(controller) MAKE_PSTR_WORD(connect) MAKE_PSTR_WORD(heatpump) MAKE_PSTR_WORD(generic) -MAKE_PSTR_WORD(dallassensor) +MAKE_PSTR_WORD(analogsensor) MAKE_PSTR_WORD(unknown) -MAKE_PSTR_WORD(Dallassensor) +MAKE_PSTR_WORD(dallassensor) // format strings MAKE_PSTR(master_thermostat_fmt, "Master Thermostat device ID: %s") @@ -110,16 +114,18 @@ MAKE_PSTR(board_profile_fmt, "Board Profile: %s") MAKE_PSTR(mark_interval_fmt, "Mark interval: %lus") MAKE_PSTR(wifi_ssid_fmt, "WiFi SSID: %s") MAKE_PSTR(wifi_password_fmt, "WiFi Password: %S") -MAKE_PSTR(ethernet_option_fmt, "Ethernet option: %d") MAKE_PSTR(tx_mode_fmt, "Tx mode: %d") MAKE_PSTR(bus_id_fmt, "Bus ID: %02X") MAKE_PSTR(log_level_fmt, "Log level: %s") -MAKE_STR(productid_fmt, "%s EMS Product ID") +MAKE_STR(productid_fmt, "%s EMS ProductID") MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F_(error), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all")) MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) +MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc")) + // strings +MAKE_PSTR(show_optional, "[devices | users | ems | mqtt | system | commands]") MAKE_PSTR(EMSESP, "EMS-ESP") MAKE_PSTR(cmd_optional, "[cmd]") MAKE_PSTR(ha_optional, "[ha]") @@ -134,6 +140,7 @@ MAKE_PSTR(sensorid_optional, "[sensor ID]") MAKE_PSTR(id_optional, "[id|hc]") MAKE_PSTR(data_optional, "[data]") MAKE_PSTR(offset_optional, "[offset]") +MAKE_PSTR(length_optional, "[length]") MAKE_PSTR(typeid_mandatory, "") MAKE_PSTR(deviceid_mandatory, "") MAKE_PSTR(device_type_optional, "[device]") @@ -156,19 +163,23 @@ MAKE_PSTR_WORD(enum) MAKE_PSTR_WORD(text) MAKE_PSTR_WORD(2) +MAKE_PSTR_WORD(4) MAKE_PSTR_WORD(10) MAKE_PSTR_WORD(100) MAKE_PSTR_WORD(60) MAKE_PSTR_LIST(div2, F_(2)) +MAKE_PSTR_LIST(div4, F_(4)) MAKE_PSTR_LIST(div10, F_(10)) -MAKE_PSTR_LIST(div100, F_(100)) MAKE_PSTR_LIST(div60, F_(60)) -MAKE_PSTR_LIST(mul10, F("*10")) -MAKE_PSTR_LIST(mul15, F("*15")) +MAKE_PSTR_LIST(div100, F_(100)) +MAKE_PSTR_LIST(mul5, F("-5")) +MAKE_PSTR_LIST(mul10, F("-10")) +MAKE_PSTR_LIST(mul15, F("-15")) // Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp // uom - also used with HA see https://github.com/home-assistant/core/blob/d7ac4bd65379e11461c7ce0893d3533d8d8b8cbf/homeassistant/const.py#L384 +MAKE_PSTR(blank, " ") MAKE_PSTR(percent, "%") MAKE_PSTR(degrees, "°C") MAKE_PSTR(kwh, "kWh") @@ -176,6 +187,7 @@ MAKE_PSTR(wh, "Wh") MAKE_PSTR(bar, "bar") MAKE_PSTR(minutes, "minutes") MAKE_PSTR(hours, "hours") +MAKE_PSTR(days, "days") MAKE_PSTR(ua, "uA") MAKE_PSTR(lmin, "l/min") MAKE_PSTR(kw, "kW") @@ -183,24 +195,28 @@ MAKE_PSTR(w, "W") MAKE_PSTR(kb, "KB") MAKE_PSTR(seconds, "seconds") MAKE_PSTR(dbm, "dBm") +MAKE_PSTR(fahrenheit, "°F") MAKE_PSTR(mv, "mV") +MAKE_PSTR(sqm, "sqm") MAKE_PSTR(times, "times") MAKE_PSTR(oclock, "o'clock") -MAKE_PSTR(days, "days") - // TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp // use empty string if want to suppress showing tags -// tags must not have spaces +// mqtt tags must not have spaces MAKE_PSTR(tag_none, "") MAKE_PSTR(tag_heartbeat, "") MAKE_PSTR(tag_boiler_data, "") -MAKE_PSTR(tag_device_data_ww, "ww") +MAKE_PSTR(tag_device_data_ww, "dhw") MAKE_PSTR(tag_thermostat_data, "") MAKE_PSTR(tag_hc1, "hc1") MAKE_PSTR(tag_hc2, "hc2") MAKE_PSTR(tag_hc3, "hc3") MAKE_PSTR(tag_hc4, "hc4") +MAKE_PSTR(tag_hc5, "hc5") +MAKE_PSTR(tag_hc6, "hc6") +MAKE_PSTR(tag_hc7, "hc7") +MAKE_PSTR(tag_hc8, "hc8") MAKE_PSTR(tag_wwc1, "wwc1") MAKE_PSTR(tag_wwc2, "wwc2") MAKE_PSTR(tag_wwc3, "wwc3") @@ -223,6 +239,7 @@ MAKE_PSTR(tag_hs15, "hs15") MAKE_PSTR(tag_hs16, "hs16") // MQTT topic names +// MAKE_PSTR(tag_heartbeat_mqtt, "heartbeat") MAKE_PSTR(tag_boiler_data_mqtt, "") MAKE_PSTR(tag_device_data_ww_mqtt, "ww") @@ -242,22 +259,24 @@ MAKE_PSTR_WORD(hot) MAKE_PSTR_WORD(eco) MAKE_PSTR_WORD(intelligent) MAKE_PSTR_WORD(flow) +MAKE_PSTR_WORD(manual) MAKE_PSTR_WORD(buffer) MAKE_PSTR(bufferedflow, "buffered flow") MAKE_PSTR(layeredbuffer, "layered buffer") MAKE_PSTR_WORD(maintenance) // boiler lists -MAKE_PSTR_LIST(enum_off_time_date, F_(off), F_(time), F_(date)) +MAKE_PSTR_LIST(tpl_date, F("Format: < dd.mm.yyyy >")) // template for text input +MAKE_PSTR_LIST(enum_off_time_date_manual, F_(off), F_(time), F_(date), F_(manual)) MAKE_PSTR_LIST(enum_freq, F_(off), F_(1x3min), F_(2x3min), F_(3x3min), F_(4x3min), F_(5x3min), F_(6x3min), F_(continuous)) MAKE_PSTR_LIST(enum_charge, F_(chargepump), F_(3wayvalve)) MAKE_PSTR_LIST(enum_comfort, F_(hot), F_(eco), F_(intelligent)) MAKE_PSTR_LIST(enum_flow, F_(off), F_(flow), F_(bufferedflow), F_(buffer), F_(layeredbuffer)) -MAKE_PSTR_LIST(enum_reset, F_(maintenance), F_(error)) -MAKE_PSTR_LIST(enum_bool, F_(off), F_(on)) +MAKE_PSTR_LIST(enum_reset, F("-"), F_(maintenance), F_(error)) +// MAKE_PSTR_LIST(enum_bool, F_(off), F_(on)) //heatpump -MAKE_PSTR_LIST(enum_hpactivity, F("none"), F("heating"), F("cooling"), F("warm water"), F("pool")) +MAKE_PSTR_LIST(enum_hpactivity, F("none"), F("heating"), F("cooling"), F("hot water"), F("pool")) // mixer MAKE_PSTR_LIST(enum_shunt, F("stopped"), F("opening"), F("closing"), F("open"), F("close")) @@ -292,7 +311,6 @@ MAKE_PSTR_WORD(simple) MAKE_PSTR_WORD(optimized) MAKE_PSTR_WORD(nofrost) MAKE_PSTR_WORD(comfort) -MAKE_PSTR_WORD(manual) MAKE_PSTR_WORD(night) MAKE_PSTR_WORD(day) MAKE_PSTR_WORD(holiday) @@ -315,6 +333,10 @@ MAKE_PSTR(functioning_mode, "functioning mode") MAKE_PSTR(smoke_temperature, "smoke temperature") // thermostat lists +MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | hh:mm:ss dd.mm.yyyy-dw-dst >")) +// MAKE_PSTR_LIST(tpl_switchtime, F("Format: < p:nn.d.o.hh:mm > prog, no, day, on, time")) +MAKE_PSTR_LIST(tpl_switchtime, F("Format: [ not_set | day hh:mm on|off ]")) +MAKE_PSTR_LIST(tpl_holidays, F("format: < dd.mm.yyyy-dd.mm.yyyy >")) MAKE_PSTR_LIST(enum_ibaMainDisplay, F_(internal_temperature), F_(internal_setpoint), @@ -335,15 +357,14 @@ MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto)) MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) +MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer)) MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310 MAKE_PSTR_LIST(enum_mode2, F_(off), F_(manual), F_(auto)) // RC20 -MAKE_PSTR_LIST(enum_mode3, F_(night), F_(day), F_(auto)) // RC35, RC30 +MAKE_PSTR_LIST(enum_mode3, F_(night), F_(day), F_(auto)) // RC35, RC30, RC25 MAKE_PSTR_LIST(enum_mode4, F_(nofrost), F_(eco), F_(heat), F_(auto)) // JUNKERS MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) // CRF -MAKE_PSTR_LIST(enum_mode6, F_(off), F_(night), F_(day)) // RC10 - -MAKE_PSTR_LIST(enum_hamode, F_(off), F_(heat), F_(auto), F_(heat), F_(off), F_(heat), F_(auto), F_(auto), F_(auto), F_(auto)) +MAKE_PSTR_LIST(enum_mode6, F_(nofrost), F_(night), F_(day)) // RC10 MAKE_PSTR_LIST(enum_modetype, F_(eco), F_(comfort)) MAKE_PSTR_LIST(enum_modetype2, F_(day)) @@ -366,20 +387,20 @@ MAKE_PSTR_LIST(enum_progMode2, F("own_1"), F("family"), F("morning"), F("evening MAKE_PSTR_LIST(enum_progMode3, F("family"), F("morning"), F("evening"), F("am"), F("pm"), F("midday"), F("singles"), F("seniors")) MAKE_PSTR_LIST(enum_progMode4, F("prog_a"), F("prog_b"), F("prog_c"), F("prog_d"), F("prog_e"), F("prog_f")) +MAKE_PSTR_LIST(enum_switchmode, F_(off), F_(eco), F_(comfort), F_(heat)) + // solar list MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog")) MAKE_PSTR_LIST(enum_collectortype, F("flat"), F("vacuum")) - -// MQTT topic for homeassistant. Must include / -MAKE_PSTR(homeassistant, "homeassistant/") +MAKE_PSTR_LIST(enum_cylprio, F("cyl_1"), F("cyl_2")) // id used to store the device ID. empty full name so only gets displayed in the MQTT payload MAKE_PSTR_LIST(ID, F_(id)) // Boiler // extra commands, with no json output -MAKE_PSTR_LIST(wwtapactivated, F("wwtapactivated"), F("turn on/off DHW by going into maintenance mode")) -MAKE_PSTR_LIST(reset, F("reset"), F("reset messages")) +MAKE_PSTR_LIST(wwtapactivated, F("wwtapactivated"), F("turn on/off")) +MAKE_PSTR_LIST(reset, F("reset"), F("reset")) // single mqtt topics MAKE_PSTR_WORD(heating_active) @@ -388,7 +409,7 @@ MAKE_PSTR_WORD(response) // mqtt, commands and text MAKE_PSTR_LIST(heatingActive, F("heatingactive"), F("heating active")) -MAKE_PSTR_LIST(tapwaterActive, F("tapwateractive"), F("warm water active")) +MAKE_PSTR_LIST(tapwaterActive, F("tapwateractive"), F("tapwater active")) MAKE_PSTR_LIST(selFlowTemp, F("selflowtemp"), F("selected flow temperature")) MAKE_PSTR_LIST(selBurnPow, F("selburnpow"), F("burner selected max power")) MAKE_PSTR_LIST(heatingPumpMod, F("heatingpumpmod"), F("heating pump modulation")) @@ -401,10 +422,12 @@ MAKE_PSTR_LIST(sysPress, F("syspress"), F("system pressure")) MAKE_PSTR_LIST(boilTemp, F("boiltemp"), F("actual boiler temperature")) MAKE_PSTR_LIST(exhaustTemp, F("exhausttemp"), F("exhaust temperature")) MAKE_PSTR_LIST(burnGas, F("burngas"), F("gas")) +MAKE_PSTR_LIST(burnGas2, F("burngas2"), F("gas stage 2")) MAKE_PSTR_LIST(flameCurr, F("flamecurr"), F("flame current")) MAKE_PSTR_LIST(heatingPump, F("heatingpump"), F("heating pump")) MAKE_PSTR_LIST(fanWork, F("fanwork"), F("fan")) MAKE_PSTR_LIST(ignWork, F("ignwork"), F("ignition")) +MAKE_PSTR_LIST(oilPreHeat, F("oilpreheat"), F("oil preheating")) MAKE_PSTR_LIST(heatingActivated, F("heatingactivated"), F("heating activated")) MAKE_PSTR_LIST(heatingTemp, F("heatingtemp"), F("heating temperature")) MAKE_PSTR_LIST(pumpModMax, F("pumpmodmax"), F("burner pump max power")) @@ -426,40 +449,41 @@ MAKE_PSTR_LIST(lastCode, F("lastcode"), F("last error code")) MAKE_PSTR_LIST(serviceCode, F("servicecode"), F("service code")) MAKE_PSTR_LIST(serviceCodeNumber, F("servicecodenumber"), F("service code number")) MAKE_PSTR_LIST(maintenanceMessage, F("maintenancemessage"), F("maintenance message")) -MAKE_PSTR_LIST(maintenanceDate, F("maintenancedate"), F("maintenance set date")) +MAKE_PSTR_LIST(maintenanceDate, F("maintenancedate"), F("next maintenance date")) MAKE_PSTR_LIST(maintenanceType, F_(maintenance), F("maintenance scheduled")) -MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("maintenance set time")) +MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("time to next maintenance")) + +// heatpump/compress specific MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("operating time total heat")) MAKE_PSTR_LIST(upTimeCompHeating, F("uptimecompheating"), F("operating time compressor heating")) MAKE_PSTR_LIST(upTimeCompCooling, F("uptimecompcooling"), F("operating time compressor cooling")) -MAKE_PSTR_LIST(upTimeCompWw, F("uptimecompww"), F("operating time compressor warm water")) +MAKE_PSTR_LIST(upTimeCompWw, F("uptimecompww"), F("operating time compressor dhw")) MAKE_PSTR_LIST(upTimeCompPool, F("uptimecomppool"), F("operating time compressor pool")) -MAKE_PSTR_LIST(totalcompStarts, F("totalcompstarts"), F("total compressor control starts")) +MAKE_PSTR_LIST(totalCompStarts, F("totalcompstarts"), F("total compressor control starts")) MAKE_PSTR_LIST(heatingStarts, F("heatingstarts"), F("heating control starts")) MAKE_PSTR_LIST(coolingStarts, F("coolingstarts"), F("cooling control starts")) -MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("warm water control starts")) MAKE_PSTR_LIST(poolStarts, F("poolstarts"), F("pool control starts")) MAKE_PSTR_LIST(nrgConsTotal, F("nrgconstotal"), F("total energy consumption")) MAKE_PSTR_LIST(nrgConsCompTotal, F("nrgconscomptotal"), F("energy consumption compressor total")) MAKE_PSTR_LIST(nrgConsCompHeating, F("nrgconscompheating"), F("energy consumption compressor heating")) -MAKE_PSTR_LIST(nrgConsCompWw, F("nrgconscompww"), F("energy consumption compressor warm water")) +MAKE_PSTR_LIST(nrgConsCompWw, F("nrgconscompww"), F("energy consumption compressor dhw")) MAKE_PSTR_LIST(nrgConsCompCooling, F("nrgconscompcooling"), F("energy consumption compressor cooling")) MAKE_PSTR_LIST(nrgConsCompPool, F("nrgconscomppool"), F("energy consumption compressor pool")) MAKE_PSTR_LIST(nrgSuppTotal, F("nrgsupptotal"), F("total energy supplied")) MAKE_PSTR_LIST(nrgSuppHeating, F("nrgsuppheating"), F("total energy supplied heating")) -MAKE_PSTR_LIST(nrgSuppWw, F("nrgsuppww"), F("total energy warm supplied warm water")) +MAKE_PSTR_LIST(nrgSuppWw, F("nrgsuppww"), F("total energy warm supplied dhw")) MAKE_PSTR_LIST(nrgSuppCooling, F("nrgsuppcooling"), F("total energy supplied cooling")) MAKE_PSTR_LIST(nrgSuppPool, F("nrgsupppool"), F("total energy supplied pool")) MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, F("auxelecheatnrgconstotal"), F("auxiliary electrical heater energy consumption total")) MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, F("auxelecheatnrgconsheating"), F("auxiliary electrical heater energy consumption heating")) -MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("auxiliary electrical heater energy consumption warm water")) +MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("auxiliary electrical heater energy consumption dhw")) MAKE_PSTR_LIST(auxElecHeatNrgConsPool, F("auxelecheatnrgconspool"), F("auxiliary electrical heater energy consumption pool")) MAKE_PSTR_LIST(hpPower, F("hppower"), F("Compressor power output")) MAKE_PSTR_LIST(hpCompOn, F("hpcompon"), F("HP Compressor")) MAKE_PSTR_LIST(hpHeatingOn, F("hpheatingon"), F("HP Heating")) MAKE_PSTR_LIST(hpCoolingOn, F("hpcoolingon"), F("HP Cooling")) -MAKE_PSTR_LIST(hpWwOn, F("hpwwon"), F("HP Warm water")) +MAKE_PSTR_LIST(hpWwOn, F("hpwwon"), F("HP dhw")) MAKE_PSTR_LIST(hpPoolOn, F("hppoolon"), F("HP Pool")) MAKE_PSTR_LIST(hpBrinePumpSpd, F("hpbrinepumpspd"), F("Brine Pump Speed")) MAKE_PSTR_LIST(hpCompSpd, F("hpcompspd"), F("Compressor Speed")) @@ -481,12 +505,8 @@ MAKE_PSTR_LIST(hpTr7, F("hptr7"), F("refrigerant temperature gas side (condenser MAKE_PSTR_LIST(hpTl2, F("hptl2"), F("air inlet temperature (TL2)")) MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("low pressure side temperature (PL1)")) MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("high pressure side temperature (PH1)")) -MAKE_PSTR_LIST(poolSetTemp, F("poolsettemp"), F("pool set temperature")) -MAKE_PSTR_LIST(poolTemp, F("pooltemp"), F("pool temperature")) -MAKE_PSTR_LIST(poolShuntStatus, F("poolshuntstatus"), F("pool shunt status opening/closing")) -MAKE_PSTR_LIST(poolShunt, F("poolshunt"), F("pool shunt open/close (0% = pool / 100% = heat)")) -// the following are warm water for the boiler and automatically tagged with 'ww' +// the following are dhw for the boiler and automatically tagged with 'ww' MAKE_PSTR_LIST(wwSelTemp, F("wwseltemp"), F("selected temperature")) MAKE_PSTR_LIST(wwSelTempLow, F("wwseltemplow"), F("selected lower temperature")) MAKE_PSTR_LIST(wwSelTempOff, F("wwseltempoff"), F("selected temperature for off")) @@ -499,7 +519,7 @@ MAKE_PSTR_LIST(wwMaxPower, F("wwmaxpower"), F("max power")) MAKE_PSTR_LIST(wwCircPump, F("wwcircpump"), F("circulation pump available")) MAKE_PSTR_LIST(wwChargeType, F("wwchargetype"), F("charging type")) MAKE_PSTR_LIST(wwDisinfectionTemp, F("wwdisinfectiontemp"), F("disinfection temperature")) -MAKE_PSTR_LIST(wwCircMode, F("wwcircmode"), F("circulation pump frequency")) +MAKE_PSTR_LIST(wwCircMode, F("wwcircmode"), F("circulation pump mode")) // also used in thermostat MAKE_PSTR_LIST(wwCirc, F("wwcirc"), F("circulation active")) MAKE_PSTR_LIST(wwCurTemp, F("wwcurtemp"), F("current intern temperature")) MAKE_PSTR_LIST(wwCurTemp2, F("wwcurtemp2"), F("current extern temperature")) @@ -508,61 +528,62 @@ MAKE_PSTR_LIST(wwStorageTemp1, F("wwstoragetemp1"), F("storage intern temperatur MAKE_PSTR_LIST(wwStorageTemp2, F("wwstoragetemp2"), F("storage extern temperature")) MAKE_PSTR_LIST(wwActivated, F("wwactivated"), F("activated")) MAKE_PSTR_LIST(wwOneTime, F("wwonetime"), F("one time charging")) -MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("disinfection")) +MAKE_PSTR_LIST(wwDisinfecting, F("wwdisinfecting"), F("disinfecting")) MAKE_PSTR_LIST(wwCharging, F("wwcharging"), F("charging")) MAKE_PSTR_LIST(wwRecharging, F("wwrecharging"), F("recharging")) MAKE_PSTR_LIST(wwTempOK, F("wwtempok"), F("temperature ok")) MAKE_PSTR_LIST(wwActive, F("wwactive"), F("active")) -MAKE_PSTR_LIST(wwHeat, F("wwheat"), F("heating")) +MAKE_PSTR_LIST(ww3wayValve, F("ww3wayvalve"), F("3way valve active")) MAKE_PSTR_LIST(wwSetPumpPower, F("wwsetpumppower"), F("set pump power")) MAKE_PSTR_LIST(wwMixerTemp, F("wwmixertemp"), F("mixer temperature")) -MAKE_PSTR_LIST(wwTankMiddleTemp, F("wwtankmiddletemp"), F("tank middle temperature (TS3)")) +MAKE_PSTR_LIST(wwCylMiddleTemp, F("wwcylmiddletemp"), F("cylinder middle temperature (TS3)")) MAKE_PSTR_LIST(wwStarts, F("wwstarts"), F("starts")) +MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("control starts")) MAKE_PSTR_LIST(wwWorkM, F("wwworkm"), F("active time")) MAKE_PSTR_LIST(wwHystOn, F("wwhyston"), F("hysteresis on temperature")) MAKE_PSTR_LIST(wwHystOff, F("wwhystoff"), F("hysteresis off temperature")) -MAKE_PSTR_LIST(wwProgMode, F("wwprogmode"), F("program mode")) -MAKE_PSTR_LIST(wwCircProg, F("wwcircprog"), F("circulation program mode")) -// MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("disinfection")) // same as in boiler -MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("disinfection day")) -MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("disinfection hour")) -MAKE_PSTR_LIST(wwDisinfectTime, F("wwdisinfecttime"), F("disinfection time")) +MAKE_PSTR_LIST(wwProgMode, F("wwprogmode"), F("program")) +MAKE_PSTR_LIST(wwCircProg, F("wwcircprog"), F("circulation program")) MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("maximum temperature")) MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("one time key function")) -// thermostat -// commands, with no long name so they only appear in the MQTT payloads -MAKE_PSTR_LIST(temp, F("temp")) -MAKE_PSTR_LIST(hatemp, F("hatemp")) -MAKE_PSTR_LIST(hamode, F("hamode")) - // mqtt values / commands -MAKE_PSTR_LIST(switchtime, F("switchtime"), F("single program switchtime")) +MAKE_PSTR_LIST(switchtime1, F("switchtime1"), F("own1 program switchtime")) +MAKE_PSTR_LIST(switchtime2, F("switchtime2"), F("own2 program switchtime")) +MAKE_PSTR_LIST(wwswitchtime, F("wwswitchtime"), F("program switchtime")) +MAKE_PSTR_LIST(wwcircswitchtime, F("wwcircswitchtime"), F("circulation program switchtime")) MAKE_PSTR_LIST(dateTime, F("datetime"), F("date/time")) MAKE_PSTR_LIST(errorCode, F("errorcode"), F("error code")) MAKE_PSTR_LIST(ibaMainDisplay, F("display"), F("display")) MAKE_PSTR_LIST(ibaLanguage, F("language"), F("language")) MAKE_PSTR_LIST(ibaClockOffset, F("clockoffset"), F("clock offset")) -MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("building")) +MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("building type")) MAKE_PSTR_LIST(heatingPID, F("heatingpid"), F("heating PID")) -MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("offset internal temperature")) +MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("internal temperature offset")) MAKE_PSTR_LIST(ibaMinExtTemperature, F("minexttemp"), F("minimal external temperature")) MAKE_PSTR_LIST(backlight, F("backlight"), F("key backlight")) MAKE_PSTR_LIST(damping, F("damping"), F("damping outdoor temperature")) - MAKE_PSTR_LIST(tempsensor1, F("inttemp1"), F("temperature sensor 1")) MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("temperature sensor 2")) MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("damped outdoor temperature")) MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("floor drying")) MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("floor drying temperature")) +// thermostat ww MAKE_PSTR_LIST(wwMode, F("wwmode"), F("mode")) MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("set low temperature")) MAKE_PSTR_LIST(wwCharge, F("wwcharge"), F("charge")) MAKE_PSTR_LIST(wwChargeDuration, F("wwchargeduration"), F("charge duration")) +MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("disinfection")) +MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("disinfection day")) +MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("disinfection hour")) +MAKE_PSTR_LIST(wwDisinfectTime, F("wwdisinfecttime"), F("disinfection time")) MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("circuit 1 extra")) MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra")) -MAKE_PSTR_LIST(setpoint_roomTemp, F("seltemp"), F("selected room temperature")) -MAKE_PSTR_LIST(curr_roomTemp, F("currtemp"), F("current room temperature")) +MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) +MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) +// thermostat hc +MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("selected room temperature")) +MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("current room temperature")) MAKE_PSTR_LIST(mode, F("mode"), F("mode")) MAKE_PSTR_LIST(modetype, F("modetype"), F("mode type")) MAKE_PSTR_LIST(fastheatup, F("fastheatup"), F("fast heatup")) @@ -571,7 +592,7 @@ MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco temperature")) MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manual temperature")) -MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("temporary room temperature automode")) +MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("temporary set temperature automode")) MAKE_PSTR_LIST(comforttemp, F("comforttemp"), F("comfort temperature")) MAKE_PSTR_LIST(summertemp, F("summertemp"), F("summer temperature")) MAKE_PSTR_LIST(designtemp, F("designtemp"), F("design temperature")) @@ -591,12 +612,11 @@ MAKE_PSTR_LIST(vacations, F("vacations"), F("vacation dates")) MAKE_PSTR_LIST(program, F("program"), F("program")) MAKE_PSTR_LIST(pause, F("pause"), F("pause time")) MAKE_PSTR_LIST(party, F("party"), F("party time")) -MAKE_PSTR_LIST(wwprio, F("wwprio"), F("warm water priority")) - +MAKE_PSTR_LIST(wwprio, F("wwprio"), F("dhw priority")) MAKE_PSTR_LIST(holidaytemp, F("holidaytemp"), F("holiday temperature")) MAKE_PSTR_LIST(summermode, F("summermode"), F("summer mode")) MAKE_PSTR_LIST(holidaymode, F("holidaymode"), F("holiday mode")) -MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("flow temperature offset")) +MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("flow temperature offset for mixer")) MAKE_PSTR_LIST(reducemode, F("reducemode"), F("reduce mode")) MAKE_PSTR_LIST(noreducetemp, F("noreducetemp"), F("no reduce below temperature")) MAKE_PSTR_LIST(remotetemp, F("remotetemp"), F("room temperature from remote")) @@ -609,67 +629,123 @@ MAKE_PSTR_LIST(dewTemperature, F("dewtemperature"), F("dew point temperature")) // mixer MAKE_PSTR_LIST(flowSetTemp, F("flowsettemp"), F("setpoint flow temperature")) -MAKE_PSTR_LIST(flowTempHc, F("flowtemphc"), F("flow temperature in assigned hc (TC1)")) -MAKE_PSTR_LIST(pumpStatus, F("pumpstatus"), F("pump status in assigned hc (PC1)")) -MAKE_PSTR_LIST(mixerStatus, F("valvestatus"), F("mixing valve actuator in assigned hc (VC1)")) +MAKE_PSTR_LIST(flowTempHc, F("flowtemphc"), F("flow temperature (TC1)")) +MAKE_PSTR_LIST(pumpStatus, F("pumpstatus"), F("pump status (PC1)")) +MAKE_PSTR_LIST(mixerStatus, F("valvestatus"), F("mixing valve actuator (VC1)")) MAKE_PSTR_LIST(flowTempVf, F("flowtempvf"), F("flow temperature in header (T0/Vf)")) MAKE_PSTR_LIST(mixerSetTime, F("valvesettime"), F("time to set valve")) +// mixer prefixed with wwc MAKE_PSTR_LIST(wwPumpStatus, F("pumpstatus"), F("pump status in assigned wwc (PC1)")) MAKE_PSTR_LIST(wwTempStatus, F("wwtempstatus"), F("temperature switch in assigned wwc (MC1)")) MAKE_PSTR_LIST(wwTemp, F("wwtemp"), F("current temperature")) +// mixer pool +MAKE_PSTR_LIST(poolSetTemp, F("poolsettemp"), F("pool set temperature")) +MAKE_PSTR_LIST(poolTemp, F("pooltemp"), F("pool temperature")) +MAKE_PSTR_LIST(poolShuntStatus, F("poolshuntstatus"), F("pool shunt status opening/closing")) +MAKE_PSTR_LIST(poolShunt, F("poolshunt"), F("pool shunt open/close (0% = pool / 100% = heat)")) // solar -MAKE_PSTR_LIST(type, F("type"), F("type")) MAKE_PSTR_LIST(collectorTemp, F("collectortemp"), F("collector temperature (TS1)")) -MAKE_PSTR_LIST(tankBottomTemp, F("tankbottomtemp"), F("tank bottom temperature (TS2)")) -MAKE_PSTR_LIST(tank2BottomTemp, F("tank2bottomtemp"), F("second tank bottom temperature (TS5)")) +MAKE_PSTR_LIST(collector2Temp, F("collector2temp"), F("collector 2 temperature (TS7)")) +MAKE_PSTR_LIST(cylBottomTemp, F("cylbottomtemp"), F("cylinder bottom temperature (TS2)")) +MAKE_PSTR_LIST(cyl2BottomTemp, F("cyl2bottomtemp"), F("second cylinder bottom temperature (TS5)")) MAKE_PSTR_LIST(heatExchangerTemp, F("heatexchangertemp"), F("heat exchanger temperature (TS6)")) +MAKE_PSTR_LIST(cylMiddleTemp, F("cylmiddletemp"), F("cylinder middle temperature (TS3)")) +MAKE_PSTR_LIST(retHeatAssist, F("retheatassist"), F("return temperature heat assistance (TS4)")) +// correct name for M1? value not found, try this: +MAKE_PSTR_LIST(m1Valve, F("heatassistvalve"), F("heat assistance valve (M1)")) +MAKE_PSTR_LIST(m1Power, F("heatassistpower"), F("heat assistance valve power (M1)")) MAKE_PSTR_LIST(collectorMaxTemp, F("collectormaxtemp"), F("maximum collector temperature")) MAKE_PSTR_LIST(collectorMinTemp, F("collectormintemp"), F("minimum collector temperature")) -MAKE_PSTR_LIST(tankMaxTemp, F("tankmaxtemp"), F("maximum tank temperature")) -MAKE_PSTR_LIST(solarPumpModulation, F("solarpumpmodulation"), F("pump modulation (PS1)")) -MAKE_PSTR_LIST(cylinderPumpModulation, F("cylinderpumpmodulation"), F("cylinder pump modulation (PS5)")) +MAKE_PSTR_LIST(cylMaxTemp, F("cylmaxtemp"), F("maximum cylinder temperature")) +// MAKE_PSTR_LIST(cyl2MaxTemp, F("cyl2maxtemp"), F("maximum cylinder 2 temperature")) +MAKE_PSTR_LIST(solarPumpMod, F("solarpumpmod"), F("pump modulation (PS1)")) +MAKE_PSTR_LIST(cylPumpMod, F("cylpumpmod"), F("cylinder pump modulation (PS5)")) MAKE_PSTR_LIST(solarPump, F("solarpump"), F("pump (PS1)")) +MAKE_PSTR_LIST(solarPump2, F("solarpump2"), F("pump 2 (PS4)")) +MAKE_PSTR_LIST(solarPump2Mod, F("solarpump2mod"), F("pump 2 modulation (PS4)")) MAKE_PSTR_LIST(valveStatus, F("valvestatus"), F("valve status")) -MAKE_PSTR_LIST(tankHeated, F("tankheated"), F("tank heated")) +MAKE_PSTR_LIST(cylHeated, F("cylheated"), F("cyl heated")) MAKE_PSTR_LIST(collectorShutdown, F("collectorshutdown"), F("collector shutdown")) MAKE_PSTR_LIST(pumpWorkTime, F("pumpworktime"), F("pump working time")) +MAKE_PSTR_LIST(pump2WorkTime, F("pump2worktime"), F("pump 2 working time")) +MAKE_PSTR_LIST(m1WorkTime, F("m1worktime"), F("differential control working time")) MAKE_PSTR_LIST(energyLastHour, F("energylasthour"), F("energy last hour")) MAKE_PSTR_LIST(energyTotal, F("energytotal"), F("energy total")) MAKE_PSTR_LIST(energyToday, F("energytoday"), F("energy today")) +MAKE_PSTR_LIST(pumpMinMod, F("pumpminmod"), F("minimum pump modulation")) +MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximum solar flow")) +MAKE_PSTR_LIST(solarPower, F("solarpower"), F("actual solar power")) +MAKE_PSTR_LIST(solarPumpTurnonDiff, F("turnondiff"), F("pump turn on difference")) +MAKE_PSTR_LIST(solarPumpTurnoffDiff, F("turnoffdiff"), F("pump turn off difference")) +MAKE_PSTR_LIST(pump2MinMod, F("pump2minmod"), F("minimum pump 2 modulation")) +MAKE_PSTR_LIST(solarPump2TurnonDiff, F("turnondiff2"), F("pump 2 turn on difference")) +MAKE_PSTR_LIST(solarPump2TurnoffDiff, F("turnoffdiff2"), F("pump 2 turn off difference")) + +// solar ww MAKE_PSTR_LIST(wwTemp1, F("wwtemp1"), F("temperature 1")) MAKE_PSTR_LIST(wwTemp3, F("wwtemp3"), F("temperature 3")) MAKE_PSTR_LIST(wwTemp4, F("wwtemp4"), F("temperature 4")) MAKE_PSTR_LIST(wwTemp5, F("wwtemp5"), F("temperature 5")) MAKE_PSTR_LIST(wwTemp7, F("wwtemp7"), F("temperature 7")) MAKE_PSTR_LIST(wwPump, F("wwpump"), F("pump")) +// solar ww and mixer wwc MAKE_PSTR_LIST(wwMinTemp, F("wwmintemp"), F("minimum temperature")) -MAKE_PSTR_LIST(pumpMinMod, F("pumpminmod"), F("minimum pump modulation")) -MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximum solar flow")) -MAKE_PSTR_LIST(solarPower, F("solarpower"), F("actual solar power")) -MAKE_PSTR_LIST(solarPumpTurnonDiff, F("turnondiff"), F("pump turn on difference")) -MAKE_PSTR_LIST(solarPumpTurnoffDiff, F("turnoffdiff"), F("pump turn off difference")) +MAKE_PSTR_LIST(wwRedTemp, F("wwredtemp"), F("reduced temperature")) +MAKE_PSTR_LIST(wwDailyTemp, F("wwdailytemp"), F("daily temperature")) +MAKE_PSTR_LIST(wwKeepWarm, F("wwkeepwarm"), F("keep warm")) +MAKE_PSTR_LIST(wwStatus2, F("wwstatus2"), F("status 2")) +MAKE_PSTR_LIST(enum_wwStatus2, F(""), F(""), F(""), F("no_heat"), F(""), F(""), F("heatrequest"), F(""), F("disinfecting"), F("hold")) +MAKE_PSTR_LIST(wwPumpMod, F("wwpumpmod"), F("pump modulation")) +MAKE_PSTR_LIST(wwFlow, F("wwflow"), F("flow rate")) +// extra mixer ww +MAKE_PSTR_LIST(wwRequiredTemp, F("wwrequiredtemp"), F("required temperature")) +MAKE_PSTR_LIST(wwDiffTemp, F("wwdifftemp"), F("start differential temperature")) -// Solar SM100 +//SM100 MAKE_PSTR_LIST(heatTransferSystem, F("heattransfersystem"), F("heattransfer system")) -MAKE_PSTR_LIST(externalTank, F("externaltank"), F("external tank")) +MAKE_PSTR_LIST(externalCyl, F("externalcyl"), F("external cylinder")) MAKE_PSTR_LIST(thermalDisinfect, F("thermaldisinfect"), F("thermal disinfection")) MAKE_PSTR_LIST(heatMetering, F("heatmetering"), F("heatmetering")) +MAKE_PSTR_LIST(solarIsEnabled, F("solarenabled"), F("solarmodule enabled")) // telegram 0x035A -MAKE_PSTR_LIST(solarPumpMode, F("solarpumpmode"), F("solar pump mode")) +MAKE_PSTR_LIST(solarPumpMode, F("solarpumpmode"), F("pump mode")) MAKE_PSTR_LIST(solarPumpKick, F("pumpkick"), F("pumpkick")) MAKE_PSTR_LIST(plainWaterMode, F("plainwatermode"), F("plain water mode")) MAKE_PSTR_LIST(doubleMatchFlow, F("doublematchflow"), F("doublematchflow")) +MAKE_PSTR_LIST(solarPump2Mode, F("pump2mode"), F("pump 2 mode")) +MAKE_PSTR_LIST(solarPump2Kick, F("pump2kick"), F("pumpkick 2")) + +// telegram 0x035F +MAKE_PSTR_LIST(cylPriority, F("cylpriority"), F("cylinder priority")) // telegram 0x380 MAKE_PSTR_LIST(climateZone, F("climatezone"), F("climate zone")) MAKE_PSTR_LIST(collector1Area, F("collector1area"), F("collector 1 area")) MAKE_PSTR_LIST(collector1Type, F("collector1type"), F("collector 1 type")) +MAKE_PSTR_LIST(collector2Area, F("collector2area"), F("collector 2 area")) +MAKE_PSTR_LIST(collector2Type, F("collector2type"), F("collector 2 type")) + +// telegram 0x0363 heatCounter +MAKE_PSTR_LIST(heatCntFlowTemp, F("heatcntflowtemp"), F("heat counter flow temperature")) +MAKE_PSTR_LIST(heatCntRetTemp, F("heatcntrettemp"), F("heat counter return temperature")) +MAKE_PSTR_LIST(heatCnt, F("heatcnt"), F("heat counter impulses")) +MAKE_PSTR_LIST(swapFlowTemp, F("swapflowtemp"), F("swap flow temperature (TS14)")) +MAKE_PSTR_LIST(swapRetTemp, F("swaprettemp"), F("swap return temperature (TS15)")) // switch MAKE_PSTR_LIST(activated, F("activated"), F("activated")) MAKE_PSTR_LIST(status, F("status"), F("status")) +// unknown fields to track (SM10) +MAKE_PSTR_LIST(data11, F("data11"), F("unknown datafield 11")) +MAKE_PSTR_LIST(data12, F("data12"), F("unknown datafield 12")) +MAKE_PSTR_LIST(data8, F("data8"), F("unknown datafield 8")) +MAKE_PSTR_LIST(data0, F("data0"), F("unknown datafield 0")) +MAKE_PSTR_LIST(data1, F("data1"), F("unknown datafield 1")) +MAKE_PSTR_LIST(setting3, F("setting3"), F("unknown setting 3")) +MAKE_PSTR_LIST(setting4, F("setting4"), F("unknown setting 4")) + // RF sensor, id 0x40, telegram 0x435 MAKE_PSTR_LIST(RFTemp, F("rftemp"), F("RF room temperature sensor")); diff --git a/src/mqtt.cpp b/src/mqtt.cpp index c39b7279c..5158a3643 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -19,6 +19,7 @@ #include "mqtt.h" #include "emsesp.h" #include "version.h" +#include "emsdevice.h" namespace emsesp { @@ -35,21 +36,39 @@ uint32_t Mqtt::publish_time_mixer_; uint32_t Mqtt::publish_time_sensor_; uint32_t Mqtt::publish_time_other_; bool Mqtt::mqtt_enabled_; -uint8_t Mqtt::ha_climate_format_; bool Mqtt::ha_enabled_; uint8_t Mqtt::nested_format_; +std::string Mqtt::discovery_prefix_; bool Mqtt::send_response_; +bool Mqtt::publish_single_; std::deque Mqtt::mqtt_messages_; std::vector Mqtt::mqtt_subfunctions_; -uint16_t Mqtt::mqtt_publish_fails_ = 0; +uint32_t Mqtt::mqtt_publish_fails_ = 0; bool Mqtt::connecting_ = false; bool Mqtt::initialized_ = false; uint8_t Mqtt::connectcount_ = 0; -uint16_t Mqtt::mqtt_message_id_ = 0; +uint32_t Mqtt::mqtt_message_id_ = 0; char will_topic_[Mqtt::MQTT_TOPIC_MAX_SIZE]; // because MQTT library keeps only char pointer +// Home Assistant specific +// icons from https://materialdesignicons.com used with the UOMs (unit of measurements) +MAKE_PSTR_WORD(measurement) +MAKE_PSTR_WORD(total_increasing) +MAKE_PSTR(icondegrees, "mdi:coolant-temperature") // DeviceValueUOM::DEGREES +MAKE_PSTR(iconpercent, "mdi:percent-outline") // DeviceValueUOM::PERCENT +MAKE_PSTR(icontime, "mdi:clock-outline") // DeviceValueUOM::SECONDS MINUTES & HOURS +MAKE_PSTR(iconkb, "mdi:memory") // DeviceValueUOM::KB +MAKE_PSTR(iconlmin, "mdi:water-boiler") // DeviceValueUOM::LMIN +MAKE_PSTR(iconkwh, "mdi:transmission-tower") // DeviceValueUOM::KWH & WH +MAKE_PSTR(iconua, "mdi:lightning-bolt-circle") // DeviceValueUOM::UA +MAKE_PSTR(iconbar, "mdi:gauge") // DeviceValueUOM::BAR +MAKE_PSTR(iconkw, "mdi:omega") // DeviceValueUOM::KW & W +MAKE_PSTR(icondbm, "mdi:wifi-strength-2") // DeviceValueUOM::DBM +MAKE_PSTR(iconnum, "mdi:counter") // DeviceValueUOM::NONE +MAKE_PSTR(icondevice, "mdi:home-automation") // for devices in HA + uuid::log::Logger Mqtt::logger_{F_(mqtt), uuid::log::Facility::DAEMON}; // subscribe to an MQTT topic, and store the associated callback function @@ -81,6 +100,12 @@ void Mqtt::subscribe(const uint8_t device_type, const std::string & topic, mqtt_ queue_subscribe_message(topic); } +// subscribe without storing to subfunctions +void Mqtt::subscribe(const std::string & topic) { + // add to MQTT queue as a subscribe operation + queue_subscribe_message(topic); +} + // resubscribe to all MQTT topics // if it's already in the queue, ignore it void Mqtt::resubscribe() { @@ -147,7 +172,7 @@ void Mqtt::loop() { if (publish_time_other_ && (currentMillis - last_publish_other_ > publish_time_other_)) { last_publish_other_ = (currentMillis / publish_time_other_) * publish_time_other_; - EMSESP::publish_other_values(); + EMSESP::publish_other_values(); // switch and heatpump } else if (publish_time_sensor_ && (currentMillis - last_publish_sensor_ > publish_time_sensor_)) { @@ -182,7 +207,9 @@ void Mqtt::show_mqtt(uuid::console::Shell & shell) { for (const auto & message : mqtt_messages_) { auto content = message.content_; char topic[MQTT_TOPIC_MAX_SIZE]; - if ((strncmp(content->topic.c_str(), "homeassistant/", 13) != 0)) { + + // prefix base, only if it's not a discovery topic + if (content->topic.compare(0, discovery_prefix().size(), discovery_prefix()) == 0) { snprintf(topic, sizeof(topic), "%s/%s", Mqtt::base().c_str(), content->topic.c_str()); } else { snprintf(topic, sizeof(topic), "%s", content->topic.c_str()); @@ -303,12 +330,12 @@ void Mqtt::show_topic_handlers(uuid::console::Shell & shell, const uint8_t devic return; } - shell.print(F(" Subscribed MQTT topics: ")); - for (const auto & mqtt_subfunction : mqtt_subfunctions_) { - if (mqtt_subfunction.device_type_ == device_type) { - shell.printf(F("%s "), mqtt_subfunction.topic_.c_str()); - } - } + // shell.print(F(" Subscribed MQTT topics: ")); + // for (const auto & mqtt_subfunction : mqtt_subfunctions_) { + // if (mqtt_subfunction.device_type_ == device_type) { + // shell.printf(F("%s "), mqtt_subfunction.topic_.c_str()); + // } + // } shell.println(); } @@ -360,14 +387,15 @@ void Mqtt::reset_mqtt() { void Mqtt::load_settings() { EMSESP::esp8266React.getMqttSettingsService()->read([&](MqttSettings & mqttSettings) { - mqtt_base_ = mqttSettings.base.c_str(); // Convert String to std::string - mqtt_qos_ = mqttSettings.mqtt_qos; - mqtt_retain_ = mqttSettings.mqtt_retain; - mqtt_enabled_ = mqttSettings.enabled; - ha_enabled_ = mqttSettings.ha_enabled; - ha_climate_format_ = mqttSettings.ha_climate_format; - nested_format_ = mqttSettings.nested_format; - send_response_ = mqttSettings.send_response; + mqtt_base_ = mqttSettings.base.c_str(); // Convert String to std::string + mqtt_qos_ = mqttSettings.mqtt_qos; + mqtt_retain_ = mqttSettings.mqtt_retain; + mqtt_enabled_ = mqttSettings.enabled; + ha_enabled_ = mqttSettings.ha_enabled; + nested_format_ = mqttSettings.nested_format; + publish_single_ = mqttSettings.publish_single; + send_response_ = mqttSettings.send_response; + discovery_prefix_ = mqttSettings.discovery_prefix.c_str(); // convert to milliseconds publish_time_boiler_ = mqttSettings.publish_time_boiler * 1000; @@ -465,6 +493,9 @@ void Mqtt::set_publish_time_sensor(uint16_t publish_time) { } bool Mqtt::get_publish_onchange(uint8_t device_type) { + if (publish_single_ && !ha_enabled_) { + return false; + } if (device_type == EMSdevice::DeviceType::BOILER) { if (!publish_time_boiler_) { return true; @@ -584,7 +615,7 @@ void Mqtt::ha_status() { JsonObject dev = doc.createNestedObject("dev"); dev["name"] = F_(EMSESP); // "EMS-ESP" - dev["sw"] = EMSESP_APP_VERSION; + dev["sw"] = "v" + std::string(EMSESP_APP_VERSION); dev["mf"] = FJSON("proddy"); dev["mdl"] = F_(EMSESP); // "EMS-ESP" JsonArray ids = dev.createNestedArray("ids"); @@ -596,39 +627,18 @@ void Mqtt::ha_status() { // create the sensors - must match the MQTT payload keys if (!EMSESP::system_.ethernet_connected()) { - publish_ha_sensor_config(DeviceValueType::INT, DeviceValueTAG::TAG_HEARTBEAT, F("WiFi RSSI"), EMSdevice::DeviceType::SYSTEM, F("rssi"), DeviceValueUOM::DBM); - publish_ha_sensor_config(DeviceValueType::INT, - DeviceValueTAG::TAG_HEARTBEAT, - F("WiFi strength"), - EMSdevice::DeviceType::SYSTEM, - F("wifistrength"), - DeviceValueUOM::PERCENT); + publish_system_ha_sensor_config(DeviceValueType::INT, F("WiFi RSSI"), F("rssi"), DeviceValueUOM::DBM); + publish_system_ha_sensor_config(DeviceValueType::INT, F("WiFi strength"), F("wifistrength"), DeviceValueUOM::PERCENT); } - - publish_ha_sensor_config(DeviceValueType::INT, DeviceValueTAG::TAG_HEARTBEAT, F("Uptime"), EMSdevice::DeviceType::SYSTEM, F("uptime"), DeviceValueUOM::NONE); - publish_ha_sensor_config(DeviceValueType::INT, - DeviceValueTAG::TAG_HEARTBEAT, - F("Uptime (sec)"), - EMSdevice::DeviceType::SYSTEM, - F("uptime_sec"), - DeviceValueUOM::SECONDS); - publish_ha_sensor_config(DeviceValueType::INT, DeviceValueTAG::TAG_HEARTBEAT, F("Free memory"), EMSdevice::DeviceType::SYSTEM, F("freemem"), DeviceValueUOM::KB); - publish_ha_sensor_config(DeviceValueType::INT, - DeviceValueTAG::TAG_HEARTBEAT, - F("MQTT fails"), - EMSdevice::DeviceType::SYSTEM, - F("mqttfails"), - DeviceValueUOM::TIMES); - publish_ha_sensor_config(DeviceValueType::INT, - DeviceValueTAG::TAG_HEARTBEAT, - F("Rx received"), - EMSdevice::DeviceType::SYSTEM, - F("rxreceived"), - DeviceValueUOM::TIMES); - publish_ha_sensor_config(DeviceValueType::INT, DeviceValueTAG::TAG_HEARTBEAT, F("Rx fails"), EMSdevice::DeviceType::SYSTEM, F("rxfails"), DeviceValueUOM::TIMES); - publish_ha_sensor_config(DeviceValueType::INT, DeviceValueTAG::TAG_HEARTBEAT, F("Tx reads"), EMSdevice::DeviceType::SYSTEM, F("txreads"), DeviceValueUOM::TIMES); - publish_ha_sensor_config(DeviceValueType::INT, DeviceValueTAG::TAG_HEARTBEAT, F("Tx writes"), EMSdevice::DeviceType::SYSTEM, F("txwrites"), DeviceValueUOM::TIMES); - publish_ha_sensor_config(DeviceValueType::INT, DeviceValueTAG::TAG_HEARTBEAT, F("Tx fails"), EMSdevice::DeviceType::SYSTEM, F("txfails"), DeviceValueUOM::TIMES); + publish_system_ha_sensor_config(DeviceValueType::INT, F("Uptime"), F("uptime"), DeviceValueUOM::NONE); + publish_system_ha_sensor_config(DeviceValueType::INT, F("Uptime (sec)"), F("uptime_sec"), DeviceValueUOM::SECONDS); + publish_system_ha_sensor_config(DeviceValueType::INT, F("Free memory"), F("freemem"), DeviceValueUOM::KB); + publish_system_ha_sensor_config(DeviceValueType::INT, F("MQTT fails"), F("mqttfails"), DeviceValueUOM::NONE); + publish_system_ha_sensor_config(DeviceValueType::INT, F("Rx received"), F("rxreceived"), DeviceValueUOM::NONE); + publish_system_ha_sensor_config(DeviceValueType::INT, F("Rx fails"), F("rxfails"), DeviceValueUOM::NONE); + publish_system_ha_sensor_config(DeviceValueType::INT, F("Tx reads"), F("txreads"), DeviceValueUOM::NONE); + publish_system_ha_sensor_config(DeviceValueType::INT, F("Tx writes"), F("txwrites"), DeviceValueUOM::NONE); + publish_system_ha_sensor_config(DeviceValueType::INT, F("Tx fails"), F("txfails"), DeviceValueUOM::NONE); } // add sub or pub task to the queue. @@ -639,16 +649,6 @@ std::shared_ptr Mqtt::queue_message(const uint8_t operation, return nullptr; } - // if it's a publish and the payload is empty, stop - /* - if ((operation == Operation::PUBLISH) && (payload.empty())) { -#ifdef EMSESP_DEBUG - LOG_WARNING("[DEBUG] Publish empty payload - quitting"); -#endif - return nullptr; - } - */ - // take the topic and prefix the base, unless its for HA std::shared_ptr message; message = std::make_shared(operation, topic, payload, retain); @@ -668,6 +668,7 @@ std::shared_ptr Mqtt::queue_message(const uint8_t operation, // if the queue is full, make room but removing the last one if (mqtt_messages_.size() >= MAX_MQTT_MESSAGES) { mqtt_messages_.pop_front(); + LOG_WARNING(F("Queue overflow, removing one message")); } mqtt_messages_.emplace_back(mqtt_message_id_++, std::move(message)); @@ -744,12 +745,12 @@ void Mqtt::publish_ha(const std::string & topic) { return; } - std::string fulltopic = read_flash_string(F_(homeassistant)) + topic; + std::string fulltopic = Mqtt::discovery_prefix() + topic; #if defined(EMSESP_DEBUG) LOG_DEBUG(F("[DEBUG] Publishing empty HA topic=%s"), fulltopic.c_str()); #endif - publish(fulltopic); // call it immediately, don't queue it + publish(fulltopic); } // publish a Home Assistant config topic and payload, with retain flag off. @@ -762,7 +763,7 @@ void Mqtt::publish_ha(const std::string & topic, const JsonObject & payload) { payload_text.reserve(measureJson(payload) + 1); serializeJson(payload, payload_text); // convert json to string - std::string fulltopic = read_flash_string(F_(homeassistant)) + topic; + std::string fulltopic = Mqtt::discovery_prefix() + topic; #if defined(EMSESP_STANDALONE) LOG_DEBUG(F("Publishing HA topic=%s, payload=%s"), fulltopic.c_str(), payload_text.c_str()); #elif defined(EMSESP_DEBUG) @@ -785,7 +786,7 @@ void Mqtt::process_queue() { auto message = mqtt_message.content_; char topic[MQTT_TOPIC_MAX_SIZE]; - if (message->topic.find(read_flash_string(F_(homeassistant))) == 0) { + if (message->topic.find(discovery_prefix_) == 0) { strcpy(topic, message->topic.c_str()); // leave topic as it is } else { snprintf(topic, MQTT_TOPIC_MAX_SIZE, "%s/%s", mqtt_base_.c_str(), message->topic.c_str()); @@ -851,27 +852,74 @@ void Mqtt::process_queue() { mqtt_messages_.pop_front(); // remove the message from the queue } -void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType - uint8_t tag, // EMSdevice::DeviceValueTAG - const __FlashStringHelper * name, - const uint8_t device_type, // EMSdevice::DeviceType - const __FlashStringHelper * entity, - const uint8_t uom) { // EMSdevice::DeviceValueUOM (0=NONE) - publish_ha_sensor_config(type, tag, name, device_type, entity, uom, false, false); +// publish HA sensor for System using the heartbeat tag +void Mqtt::publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom) { + StaticJsonDocument doc; + JsonObject dev_json = doc.createNestedObject("dev"); + + JsonArray ids = dev_json.createNestedArray("ids"); + ids.add("ems-esp"); + + publish_ha_sensor_config(type, DeviceValueTAG::TAG_HEARTBEAT, name, EMSdevice::DeviceType::SYSTEM, entity, uom, false, false, false, nullptr, 0, 0, 0, dev_json); } +// create's a ha sensor config topic from a device value object +// and also takes a flag to see whether it will also create the main HA device config +void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, const std::string & brand, const bool remove, const bool create_device_config) { + StaticJsonDocument dev_json; -// HA config for a sensor and binary_sensor entity + // always create the ids + JsonArray ids = dev_json.createNestedArray("ids"); + char ha_device[40]; + std::string device_type_name = EMSdevice::device_type_2_device_name(dv.device_type); + snprintf(ha_device, sizeof(ha_device), "ems-esp-%s", device_type_name.c_str()); + ids.add(ha_device); + + if (create_device_config) { + device_type_name[0] = toupper(device_type_name[0]); // capitalize + dev_json["name"] = "EMS-ESP " + device_type_name; + dev_json["mf"] = brand; + dev_json["mdl"] = model; + dev_json["via_device"] = "ems-esp"; + } + + // calculate the min and max + int16_t dv_set_min, dv_set_max; + (void)dv.get_min_max(dv_set_min, dv_set_max); + + publish_ha_sensor_config(dv.type, + dv.tag, + dv.full_name, + dv.device_type, + dv.short_name, + dv.uom, + remove, + create_device_config, + dv.has_cmd, + dv.options, + dv.options_size, + dv_set_min, + dv_set_max, + dev_json.as()); +} + +// MQTT discovery configs // entity must match the key/value pair in the *_data topic -// note: some string copying here into chars, it looks messy but does help with heap fragmentation issues -void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType - uint8_t tag, // EMSdevice::DeviceValueTAG - const __FlashStringHelper * name, - const uint8_t device_type, // EMSdevice::DeviceType - const __FlashStringHelper * entity, - const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE) - const bool remove, // true if we want to remove this topic - const bool has_cmd) { +// note: some extra string copying done here, it looks messy but does help with heap fragmentation issues +void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType + uint8_t tag, // EMSdevice::DeviceValueTAG + const __FlashStringHelper * name, // fullname + const uint8_t device_type, // EMSdevice::DeviceType + const __FlashStringHelper * entity, // shortname + const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE) + const bool remove, // true if we want to remove this topic + const bool create_device_config, // true if need to create main device config + const bool has_cmd, + const __FlashStringHelper * const * options, + uint8_t options_size, + const int16_t dv_set_min, + const int16_t dv_set_max, + const JsonObject & dev_json) { // ignore if name (fullname) is empty if (name == nullptr) { return; @@ -890,35 +938,119 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevi } // build unique identifier which will be used in the topic, replacing all . with _ as not to break HA - std::string uniq(50, '\0'); - snprintf(&uniq[0], uniq.capacity() + 1, "%s_%s", device_name, new_entity); - std::replace(uniq.begin(), uniq.end(), '.', '_'); + char uniq[101]; + snprintf(uniq, sizeof(uniq), "%s_%s", device_name, new_entity); + Helpers::replace_char(uniq, '.', '_'); - // create the topic + // use_ha_sensor is true if we're using the Sensor Entity https://developers.home-assistant.io/docs/core/entity/sensor + bool use_ha_sensor = false; + + // create the topic, depending on the type and whether the device entity is writable (a command) + // https://developers.home-assistant.io/docs/core/entity char topic[MQTT_TOPIC_MAX_SIZE]; - if (type == DeviceValueType::BOOL) { - snprintf(topic, sizeof(topic), "binary_sensor/%s/%s/config", mqtt_base_.c_str(), uniq.c_str()); // binary sensor + // if it's a command then we can use Number, Switch. Otherwise stick to Sensor + if (has_cmd) { + switch (type) { + case DeviceValueType::INT: + case DeviceValueType::UINT: + case DeviceValueType::SHORT: + case DeviceValueType::USHORT: + case DeviceValueType::ULONG: + // number - https://www.home-assistant.io/integrations/number.mqtt/ + // https://developers.home-assistant.io/docs/core/entity/number + + snprintf(topic, sizeof(topic), "number/%s/%s/config", mqtt_base_.c_str(), uniq); + break; + case DeviceValueType::BOOL: + // switch - https://www.home-assistant.io/integrations/switch.mqtt/ + snprintf(topic, sizeof(topic), "switch/%s/%s/config", mqtt_base_.c_str(), uniq); + break; + case DeviceValueType::ENUM: + // select - https://www.home-assistant.io/integrations/select.mqtt + snprintf(topic, sizeof(topic), "select/%s/%s/config", mqtt_base_.c_str(), uniq); + break; + default: + // plain old sensor + snprintf(topic, sizeof(topic), "sensor/%s/%s/config", mqtt_base_.c_str(), uniq); + break; + } } else { - snprintf(topic, sizeof(topic), "sensor/%s/%s/config", mqtt_base_.c_str(), uniq.c_str()); // normal HA sensor, not a boolean one + // plain old read only device entity + if (type == DeviceValueType::BOOL) { + snprintf(topic, sizeof(topic), "binary_sensor/%s/%s/config", mqtt_base_.c_str(), uniq); // binary sensor + } else { + use_ha_sensor = true; + snprintf(topic, sizeof(topic), "sensor/%s/%s/config", mqtt_base_.c_str(), uniq); // normal HA sensor, not a boolean one + } } - // if we're asking to remove this topic, send an empty payload + // if we're asking to remove this topic, send an empty payload and exit // https://github.com/emsesp/EMS-ESP32/issues/196 if (remove) { - LOG_WARNING(F("Lost device value for %s. Removing HA config"), uniq.c_str()); + LOG_DEBUG(F("Removing HA config for %s"), uniq); publish_ha(topic); return; } - bool have_tag = !EMSdevice::tag_to_string(tag).empty(); - - // nested_format is 1 if nested, otherwise 2 for single topics - bool is_nested = (nested_format_ == 1); + bool have_tag = !EMSdevice::tag_to_string(tag).empty(); + bool is_nested = (nested_format_ == 1); // nested_format is 1 if nested, otherwise 2 for single topics + // build the payload DynamicJsonDocument doc(EMSESP_JSON_SIZE_HA_CONFIG); doc["~"] = mqtt_base_; doc["uniq_id"] = uniq; + const char * ic_ha = "ic"; // icon - only set this if there is no device class + const char * sc_ha = "state_class"; // state class + const char * uom_ha = "unit_of_meas"; // unit of measure + + // handle commands, which are device entities that are writable + // we add the command topic parameter + // note: there is no way to handle strings in HA so datetimes (e.g. set_datetime, set_holiday, set_wwswitchtime etc) are excluded + if (has_cmd) { + // command topic back to EMS-ESP + char command_topic[105]; + snprintf(command_topic, sizeof(command_topic), "~/%s", uniq); + Helpers::replace_char(command_topic, '_', '/'); + doc["command_topic"] = command_topic; + + // for enums, add options + if (type == DeviceValueType::ENUM) { + JsonArray option_list = doc.createNestedArray("options"); + for (uint8_t i = 0; i < options_size; i++) { + option_list.add(options[i]); + } + } else if (type != DeviceValueType::STRING) { + // Must be Numeric.... + // mode can be auto, slider or box. Because its fiddly and error prone, force conversion to box + // but... this is not currently supported in HA MQTT Number yet! + // doc["mode"] = "box"; + } + + // set min and max values, if we have a valid range + if (dv_set_min != 0 || dv_set_max != 0) { + doc["min"] = dv_set_min; + doc["max"] = dv_set_max; + if ((uom == DeviceValueUOM::DEGREES) || (uom == DeviceValueUOM::DEGREES_R)) { + doc["step"] = 0.5; + } + } + + // set icons + // since these don't have a device class we need to add the icon ourselves + switch (uom) { + case DeviceValueUOM::DEGREES: + case DeviceValueUOM::DEGREES_R: + doc[ic_ha] = F_(icondegrees); + break; + case DeviceValueUOM::PERCENT: + doc[ic_ha] = F_(iconpercent); + break; + default: + break; + } + } + // state topic char stat_t[MQTT_TOPIC_MAX_SIZE]; snprintf(stat_t, sizeof(stat_t), "~/%s", tag_to_topic(device_type, tag).c_str()); @@ -936,7 +1068,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevi // value template // if its nested mqtt format then use the appended entity name, otherwise take the original - char val_tpl[50]; + char val_tpl[75]; if (is_nested) { snprintf(val_tpl, sizeof(val_tpl), "{{value_json.%s}}", new_entity); } else { @@ -944,126 +1076,109 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevi } doc["val_tpl"] = val_tpl; - // look at the device value type + // special case to handle booleans + // applies to both Binary Sensor (read only) and a Switch (for a command) + // always render boolean as strings true & false + // and has no unit of measure or icon if (type == DeviceValueType::BOOL) { - // how to render boolean. HA only accepts String values char result[10]; doc[F("payload_on")] = Helpers::render_boolean(result, true); doc[F("payload_off")] = Helpers::render_boolean(result, false); + doc[sc_ha] = F_(measurement); } else { - // set default state and device class for HA - auto set_state_class = State_class::NONE; - auto set_device_class = Device_class::NONE; - - // unit of measure and map the HA icon + // always set the uom if (uom != DeviceValueUOM::NONE) { - doc["unit_of_meas"] = EMSdevice::uom_to_string(uom); + doc[uom_ha] = EMSdevice::uom_to_string(uom); } + } + + // this next section is building using the Sensor Entity + // https://developers.home-assistant.io/docs/core/entity/sensor + // for read only sensors. It uses a device class to determine icon + // and state class + + if (use_ha_sensor) { + const char * dc_ha = "device_class"; // device class switch (uom) { case DeviceValueUOM::DEGREES: - doc["ic"] = F_(icondegrees); - set_device_class = Device_class::TEMPERATURE; + case DeviceValueUOM::DEGREES_R: + doc[sc_ha] = F_(measurement); + doc[dc_ha] = F("temperature"); // no icon needed break; case DeviceValueUOM::PERCENT: - doc["ic"] = F_(iconpercent); - set_device_class = Device_class::POWER_FACTOR; + doc[sc_ha] = F_(measurement); + doc[dc_ha] = F("power_factor"); // no icon needed break; case DeviceValueUOM::SECONDS: case DeviceValueUOM::MINUTES: case DeviceValueUOM::HOURS: - doc["ic"] = F_(icontime); + doc[ic_ha] = F_(icontime); + if (type == DeviceValueType::TIME) { + doc[sc_ha] = F_(total_increasing); + } else { + doc[sc_ha] = F_(measurement); + } break; case DeviceValueUOM::KB: - doc["ic"] = F_(iconkb); + doc[ic_ha] = F_(iconkb); break; case DeviceValueUOM::LMIN: - doc["ic"] = F_(iconlmin); + doc[ic_ha] = F_(iconlmin); + doc[sc_ha] = F_(measurement); break; case DeviceValueUOM::WH: + if (entity == FL_(energyToday)[0]) { + doc[sc_ha] = F_(total_increasing); + } else { + doc[sc_ha] = F_(measurement); + } + doc[dc_ha] = F("energy"); // no icon needed + break; case DeviceValueUOM::KWH: - doc["ic"] = F_(iconkwh); - set_state_class = State_class::TOTAL_INCREASING; - set_device_class = Device_class::ENERGY; + doc[sc_ha] = F_(total_increasing); + doc[dc_ha] = F("energy"); // no icon needed break; case DeviceValueUOM::UA: - doc["ic"] = F_(iconua); + doc[ic_ha] = F_(iconua); + doc[sc_ha] = F_(measurement); break; case DeviceValueUOM::BAR: - doc["ic"] = F_(iconbar); - set_device_class = Device_class::PRESSURE; + doc[sc_ha] = F_(measurement); + doc[dc_ha] = F("pressure"); break; case DeviceValueUOM::W: case DeviceValueUOM::KW: - doc["ic"] = F_(iconkw); - set_state_class = State_class::MEASUREMENT; - set_device_class = Device_class::POWER; + doc[sc_ha] = F_(measurement); + doc[dc_ha] = F("power"); break; case DeviceValueUOM::DBM: - doc["ic"] = F_(icondbm); - set_device_class = Device_class::SIGNAL_STRENGTH; + doc[sc_ha] = F_(measurement); + doc[dc_ha] = F("signal_strength"); break; case DeviceValueUOM::NONE: - if (type == DeviceValueType::INT || type == DeviceValueType::UINT || type == DeviceValueType::SHORT || type == DeviceValueType::USHORT - || type == DeviceValueType::ULONG) { - doc["ic"] = F_(iconnum); + // for device entities which have numerical values, with no UOM + if ((type != DeviceValueType::STRING) + && (type == DeviceValueType::INT || type == DeviceValueType::UINT || type == DeviceValueType::SHORT || type == DeviceValueType::USHORT + || type == DeviceValueType::ULONG)) { + doc[ic_ha] = F_(iconnum); // set icon + // determine if its a measurement or total increasing + // most of the values are measurement. for example Tx Reads will increment but can be reset to 0 after a restart + // all the starts are increasing, and they are ULONGs + if (type == DeviceValueType::ULONG) { + doc[sc_ha] = F_(total_increasing); + } else { + doc[sc_ha] = F_(measurement); // default to measurement + } } break; - case DeviceValueUOM::TIMES: - set_state_class = State_class::TOTAL_INCREASING; - doc["ic"] = F_(iconnum); - break; default: break; } - - // see if we need to set the state_class and device_class - // ignore any commands - if (!has_cmd) { - // state class - if (set_state_class == State_class::MEASUREMENT) { - doc["state_class"] = F("measurement"); - } else if (set_state_class == State_class::TOTAL_INCREASING) { - doc["state_class"] = F("total_increasing"); - } - - // device class - switch (set_device_class) { - case Device_class::ENERGY: - doc["device_class"] = F("energy"); - break; - case Device_class::POWER: - doc["device_class"] = F("power"); - break; - case Device_class::POWER_FACTOR: - doc["device_class"] = F("power_factor"); - break; - case Device_class::PRESSURE: - doc["device_class"] = F("pressure"); - break; - case Device_class::SIGNAL_STRENGTH: - doc["device_class"] = F("signal_strength"); - break; - case Device_class::TEMPERATURE: - doc["device_class"] = F("temperature"); - break; - default: - break; - } - } } - JsonObject dev = doc.createNestedObject("dev"); - JsonArray ids = dev.createNestedArray("ids"); - - // for System commands we'll use the ID EMS-ESP - if (device_type == EMSdevice::DeviceType::SYSTEM) { - ids.add("ems-esp"); - } else { - char ha_device[40]; - snprintf(ha_device, sizeof(ha_device), "ems-esp-%s", device_name); - ids.add(ha_device); - } + // add the dev json object to the end + doc["dev"] = dev_json; publish_ha(topic, doc.as()); } diff --git a/src/mqtt.h b/src/mqtt.h index 0257fabe5..ca180897e 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -19,22 +19,13 @@ #ifndef EMSESP_MQTT_H_ #define EMSESP_MQTT_H_ -#include -#include - -#include -#include -#include -#include - #include #include "helpers.h" #include "system.h" #include "console.h" #include "command.h" - -#include +#include "emsdevicevalue.h" using uuid::console::Shell; @@ -88,15 +79,12 @@ class Mqtt { }; - // for Home Assistant - enum class State_class { NONE, MEASUREMENT, TOTAL_INCREASING }; - enum class Device_class { NONE, TEMPERATURE, POWER_FACTOR, ENERGY, PRESSURE, POWER, SIGNAL_STRENGTH }; - static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = 128; // note this should really match the user setting in mqttSettings.maxTopicLength static void on_connect(); static void subscribe(const uint8_t device_type, const std::string & topic, mqtt_sub_function_p cb); + static void subscribe(const std::string & topic); static void resubscribe(); static void publish(const std::string & topic, const std::string & payload); @@ -112,21 +100,25 @@ class Mqtt { static void publish_ha(const __FlashStringHelper * topic, const JsonObject & payload); static void publish_ha(const std::string & topic); - static void publish_ha_sensor_config(uint8_t type, - uint8_t tag, - const __FlashStringHelper * name, - const uint8_t device_type, - const __FlashStringHelper * entity, - const uint8_t uom, - const bool remove, - const bool has_cmd); + static void + publish_ha_sensor_config(DeviceValue & dv, const std::string & model, const std::string & brand, const bool remove, const bool create_device_config = false); - static void publish_ha_sensor_config(uint8_t type, - uint8_t tag, - const __FlashStringHelper * name, - const uint8_t device_type, - const __FlashStringHelper * entity, - const uint8_t uom); + static void publish_ha_sensor_config(uint8_t type, + uint8_t tag, + const __FlashStringHelper * name, + const uint8_t device_type, + const __FlashStringHelper * entity, + const uint8_t uom, + const bool remove, + const bool create_device_config, + const bool has_cmd, + const __FlashStringHelper * const * options, + uint8_t options_size, + const int16_t dv_set_min, + const int16_t dv_set_max, + const JsonObject & dev_json); + + static void publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom); static void show_topic_handlers(uuid::console::Shell & shell, const uint8_t device_type); static void show_mqtt(uuid::console::Shell & shell); @@ -165,11 +157,19 @@ class Mqtt { return mqtt_base_; } + // returns the discovery MQTT topic prefix and adds a / + static std::string discovery_prefix() { + if (discovery_prefix_.empty()) { + return std::string{}; + } + return discovery_prefix_ + "/"; + } + static void base(const char * base) { mqtt_base_ = base; } - static uint16_t publish_count() { + static uint32_t publish_count() { return mqtt_message_id_; } @@ -179,21 +179,25 @@ class Mqtt { static void reset_mqtt(); - static uint8_t ha_climate_format() { - return ha_climate_format_; - } - // nested_format is 1 if nested, otherwise 2 for single topics static uint8_t nested_format() { return nested_format_; } - static void nested_format(uint8_t nested_format) { - nested_format_ = nested_format; + static bool is_nested() { + return nested_format_ == 1; } - static void ha_climate_format(uint8_t ha_climate_format) { - ha_climate_format_ = ha_climate_format; + static bool publish_single() { + return publish_single_; + } + + static void publish_single(bool publish_single) { + publish_single_ = publish_single; + } + + static void nested_format(uint8_t nested_format) { + nested_format_ = nested_format; } static bool ha_enabled() { @@ -227,7 +231,7 @@ class Mqtt { static const std::string tag_to_topic(uint8_t device_type, uint8_t tag); struct QueuedMqttMessage { - const uint16_t id_; + const uint32_t id_; const std::shared_ptr content_; uint8_t retry_count_; uint16_t packet_id_; @@ -247,7 +251,7 @@ class Mqtt { static uuid::log::Logger logger_; static AsyncMqttClient * mqttClient_; - static uint16_t mqtt_message_id_; + static uint32_t mqtt_message_id_; static constexpr uint32_t MQTT_PUBLISH_WAIT = 100; // delay between sending publishes, to account for large payloads static constexpr uint8_t MQTT_PUBLISH_MAX_RETRY = 3; // max retries for giving up on publishing @@ -285,7 +289,7 @@ class Mqtt { static bool connecting_; static bool initialized_; - static uint16_t mqtt_publish_fails_; + static uint32_t mqtt_publish_fails_; static uint8_t connectcount_; // settings, copied over @@ -300,9 +304,10 @@ class Mqtt { static uint32_t publish_time_other_; static uint32_t publish_time_sensor_; static bool mqtt_enabled_; - static uint8_t ha_climate_format_; static bool ha_enabled_; static uint8_t nested_format_; + static std::string discovery_prefix_; + static bool publish_single_; static bool send_response_; }; diff --git a/src/shower.cpp b/src/shower.cpp index 79d2eb6b0..0d4af6718 100644 --- a/src/shower.cpp +++ b/src/shower.cpp @@ -80,15 +80,6 @@ void Shower::loop() { LOG_DEBUG(F("[Shower] finished with duration %d"), duration_); } } -#if defined(EMSESP_DEBUG) - else { - if (shower_state_) { - Mqtt::publish("message", "shower state is ON"); - } else { - Mqtt::publish("message", "shower state is OFF"); - } - } -#endif // reset everything timer_start_ = 0; @@ -133,9 +124,17 @@ void Shower::shower_alert_start() { void Shower::publish_shower_data() { StaticJsonDocument doc; - char result[10]; - doc["shower_timer"] = Helpers::render_boolean(result, shower_timer_); - doc["shower_alert"] = Helpers::render_boolean(result, shower_alert_); + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { + doc["shower_timer"] = shower_timer_; + doc["shower_alert"] = shower_alert_; + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + doc["shower_timer"] = shower_timer_ ? 1 : 0; + doc["shower_alert"] = shower_alert_ ? 1 : 0; + } else { + char result[10]; + doc["shower_timer"] = Helpers::render_boolean(result, shower_timer_); + doc["shower_alert"] = Helpers::render_boolean(result, shower_alert_); + } // only publish shower duration if there is a value if (duration_ > SHOWER_MIN_DURATION) { @@ -165,6 +164,7 @@ void Shower::set_shower_state(bool state, bool force) { } old_shower_state_ = shower_state_; // copy current state + // always publish as a string char s[7]; Mqtt::publish(F("shower_active"), Helpers::render_boolean(s, shower_state_)); // https://github.com/emsesp/EMS-ESP/issues/369 @@ -175,13 +175,16 @@ void Shower::set_shower_state(bool state, bool force) { StaticJsonDocument doc; doc["name"] = FJSON("Shower Active"); doc["uniq_id"] = FJSON("shower_active"); - doc["~"] = Mqtt::base(); // default ems-esp + doc["~"] = Mqtt::base(); doc["stat_t"] = FJSON("~/shower_active"); + + // always render boolean as strings for HA char result[10]; doc[F("payload_on")] = Helpers::render_boolean(result, true); doc[F("payload_off")] = Helpers::render_boolean(result, false); - JsonObject dev = doc.createNestedObject("dev"); - JsonArray ids = dev.createNestedArray("ids"); + + JsonObject dev = doc.createNestedObject("dev"); + JsonArray ids = dev.createNestedArray("ids"); ids.add("ems-esp"); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; diff --git a/src/system.cpp b/src/system.cpp index 9ce7622c8..9da12917f 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -54,21 +54,40 @@ bool System::restart_requested_ = false; // send on/off to a gpio pin // value: true = HIGH, false = LOW -// e.g. http://ems-esp/api?device=system&cmd=pin&data=1&id=2 bool System::command_pin(const char * value, const int8_t id) { +#ifndef EMSESP_STANDALONE + if (!is_valid_gpio(id)) { - LOG_INFO(F("invalid GPIO number")); + LOG_INFO(F("Invalid GPIO number")); return false; } - bool v = false; - if (Helpers::value2bool(value, v)) { + bool v = false; + std::string v1 = {7, '\0'}; + int v2 = 0; + + if (id == 25 && Helpers::value2number(value, v2)) { + if (v2 >= 0 && v2 <= 255) { + dacWrite(id, v2); + return true; + } + } else if (Helpers::value2bool(value, v)) { pinMode(id, OUTPUT); digitalWrite(id, v); LOG_INFO(F("GPIO %d set to %s"), id, v ? "HIGH" : "LOW"); return true; + } else if (Helpers::value2string(value, v1)) { + if (v1 == "input" || v1 == "in" || v1 == "-1") { + pinMode(id, INPUT); + v = digitalRead(id); + LOG_INFO(F("GPIO %d set input, state %s"), id, v ? "HIGH" : "LOW"); + return true; + } } + LOG_INFO(F("GPIO %d: invalid value"), id); +#endif + return false; } @@ -80,7 +99,7 @@ bool System::command_send(const char * value, const int8_t id) { // fetch device values bool System::command_fetch(const char * value, const int8_t id) { - std::string value_s(14, '\0'); + std::string value_s; if (Helpers::value2string(value, value_s)) { if (value_s == "all") { LOG_INFO(F("Requesting data from EMS devices")); @@ -107,7 +126,7 @@ bool System::command_fetch(const char * value, const int8_t id) { // mqtt publish bool System::command_publish(const char * value, const int8_t id) { - std::string value_s(14, '\0'); + std::string value_s; if (Helpers::value2string(value, value_s)) { if (value_s == "ha") { EMSESP::publish_all(true); // includes HA @@ -126,16 +145,17 @@ bool System::command_publish(const char * value, const int8_t id) { EMSESP::publish_device_values(EMSdevice::DeviceType::MIXER); return true; } else if (value_s == "other") { - EMSESP::publish_other_values(); + EMSESP::publish_other_values(); // switch and heat pump return true; - } else if (value_s == read_flash_string(F_(dallassensor))) { + } else if ((value_s == read_flash_string(F_(dallassensor))) || (value_s == read_flash_string(F_(analogsensor)))) { EMSESP::publish_sensor_values(true); return true; } } - EMSESP::publish_all(); // ignore value and id + EMSESP::publish_all(); LOG_INFO(F("Publishing all data to MQTT")); + return true; } @@ -163,6 +183,9 @@ bool System::command_watch(const char * value, const int8_t id) { EMSESP::watch_id(0); } EMSESP::watch(w); + if (Mqtt::publish_single()) { + Mqtt::publish(F("system/watch"), read_flash_string(FL_(enum_watch)[w]).c_str()); + } return true; } uint16_t i = Helpers::hextoint(value); @@ -171,6 +194,12 @@ bool System::command_watch(const char * value, const int8_t id) { if (EMSESP::watch() == EMSESP::Watch::WATCH_OFF) { EMSESP::watch(EMSESP::Watch::WATCH_ON); } + if (Mqtt::publish_single()) { + char s[10]; + snprintf(s, sizeof(s), "0x%04X", i); + Mqtt::publish(F("system/watch"), s); + // Mqtt::publish(F("system/watch"), read_flash_string(FL_(enum_watch)[EMSESP::watch()]).c_str()); + } return true; } return false; @@ -188,7 +217,7 @@ void System::system_restart() { // saves all settings void System::wifi_reconnect() { - LOG_INFO(F("Wifi reconnecting...")); + LOG_INFO(F("WiFi reconnecting...")); Shell::loop_all(); EMSESP::console_.loop(); delay(1000); // wait a second @@ -196,7 +225,6 @@ void System::wifi_reconnect() { EMSESP::esp8266React.getNetworkSettingsService()->callUpdateHandlers("local"); // in case we've changed ssid or password } -// format fs // format the FS. Wipes everything. void System::format(uuid::console::Shell & shell) { auto msg = F("Formatting file system. This will reset all settings to their defaults"); @@ -234,7 +262,7 @@ void System::syslog_start() { syslog_.hostname(hostname().c_str()); // register the command - Command::add(EMSdevice::DeviceType::SYSTEM, F_(syslog_level), System::command_syslog_level, F("changes syslog level"), CommandFlag::ADMIN_ONLY); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(syslog), System::command_syslog_level, F("change the syslog level"), CommandFlag::ADMIN_ONLY); } else if (was_enabled) { // in case service is still running, this flushes the queue @@ -244,30 +272,50 @@ void System::syslog_start() { syslog_.mark_interval(0); syslog_.destination(""); } + + if (Mqtt::publish_single()) { + Mqtt::publish(F("system/syslog"), syslog_enabled_ ? read_flash_string(FL_(enum_syslog_level)[syslog_level_ + 1]).c_str() : "off"); + if (EMSESP::watch_id() == 0 || EMSESP::watch() == 0) { + Mqtt::publish(F("system/watch"), read_flash_string(FL_(enum_watch)[EMSESP::watch()]).c_str()); + } else { + char s[10]; + snprintf(s, sizeof(s), "0x%04X", EMSESP::watch_id()); + Mqtt::publish(F("system/watch"), s); + } + } #endif } -// read all the settings except syslog from the config files and store locally +// read some specific system settings to store locally for faster access void System::get_settings() { EMSESP::webSettingsService.read([&](WebSettings & settings) { - // Button - pbutton_gpio_ = settings.pbutton_gpio; - - // ADC + pbutton_gpio_ = settings.pbutton_gpio; analog_enabled_ = settings.analog_enabled; + low_clock_ = settings.low_clock; + hide_led_ = settings.hide_led; + led_gpio_ = settings.led_gpio; + board_profile_ = settings.board_profile; + telnet_enabled_ = settings.telnet_enabled; - // Sysclock - low_clock_ = settings.low_clock; + rx_gpio_ = settings.rx_gpio; + tx_gpio_ = settings.tx_gpio; + dallas_gpio_ = settings.dallas_gpio; - // LED - hide_led_ = settings.hide_led; - led_gpio_ = settings.led_gpio; + syslog_enabled_ = settings.syslog_enabled; + syslog_level_ = settings.syslog_level; + syslog_mark_interval_ = settings.syslog_mark_interval; + syslog_host_ = settings.syslog_host; + syslog_port_ = settings.syslog_port; - // Board profile - board_profile_ = settings.board_profile; + fahrenheit_ = settings.fahrenheit; + bool_format_ = settings.bool_format; + enum_format_ = settings.enum_format; + readonly_mode_ = settings.readonly_mode; - // Ethernet PHY - phy_type_ = settings.phy_type; + phy_type_ = settings.phy_type; + eth_power_ = settings.eth_power; + eth_phy_addr_ = settings.eth_phy_addr; + eth_clock_mode_ = settings.eth_clock_mode; }); } @@ -328,7 +376,7 @@ void System::start(uint32_t heap_start) { #ifndef EMSESP_STANDALONE // disable bluetooth module - periph_module_disable(PERIPH_BT_MODULE); + // periph_module_disable(PERIPH_BT_MODULE); if (low_clock_) { setCpuFrequencyMhz(160); } @@ -336,12 +384,10 @@ void System::start(uint32_t heap_start) { EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { hostname(networkSettings.hostname.c_str()); // sets the hostname - LOG_INFO(F("System name: %s"), hostname().c_str()); }); commands_init(); // console & api commands led_init(false); // init LED - adc_init(false); // analog ADC button_init(false); // the special button network_init(false); // network syslog_start(); // start Syslog @@ -349,21 +395,6 @@ void System::start(uint32_t heap_start) { EMSESP::init_uart(); // start UART } -// adc and bluetooth -void System::adc_init(bool refresh) { - if (refresh) { - get_settings(); - } -#ifndef EMSESP_STANDALONE - // disable ADC - /* - if (!analog_enabled_) { - adc_power_release(); // turn off ADC to save power if not needed - } - */ -#endif -} - // button single click void System::button_OnClick(PButton & b) { LOG_DEBUG(F("Button pressed - single click")); @@ -403,9 +434,9 @@ void System::button_init(bool refresh) { if (is_valid_gpio(pbutton_gpio_)) { if (!myPButton_.init(pbutton_gpio_, HIGH)) { - LOG_INFO(F("Multi-functional button not detected")); + LOG_DEBUG(F("Multi-functional button not detected")); } else { - LOG_INFO(F("Multi-functional button enabled")); + LOG_DEBUG(F("Multi-functional button enabled")); } } else { LOG_WARNING(F("Invalid button GPIO. Check config.")); @@ -424,8 +455,8 @@ void System::led_init(bool refresh) { } if ((led_gpio_ != 0) && is_valid_gpio(led_gpio_)) { - pinMode(led_gpio_, OUTPUT); // 0 means disabled - digitalWrite(led_gpio_, hide_led_ ? !LED_ON : LED_ON); + pinMode(led_gpio_, OUTPUT); // 0 means disabled + digitalWrite(led_gpio_, !LED_ON); // start with LED off } } @@ -462,9 +493,6 @@ void System::loop() { led_monitor(); // check status and report back using the LED system_check(); // check system health - if (analog_enabled_) { - measure_analog(); - } // send out heartbeat uint32_t currentMillis = uuid::get_uptime(); @@ -509,29 +537,30 @@ bool System::heartbeat_json(JsonObject & output) { output["bus_status"] = FJSON("disconnected"); } - output["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); - + output["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); output["uptime_sec"] = uuid::get_uptime_sec(); output["rxreceived"] = EMSESP::rxservice_.telegram_count(); output["rxfails"] = EMSESP::rxservice_.telegram_error_count(); output["txreads"] = EMSESP::txservice_.telegram_read_count(); output["txwrites"] = EMSESP::txservice_.telegram_write_count(); - output["txfails"] = EMSESP::txservice_.telegram_fail_count(); + output["txfails"] = EMSESP::txservice_.telegram_read_fail_count() + EMSESP::txservice_.telegram_write_fail_count(); + if (Mqtt::enabled()) { output["mqttfails"] = Mqtt::publish_fails(); + output["mqttfails"] = Mqtt::publish_fails(); } - if (EMSESP::dallas_enabled()) { - output["dallasfails"] = EMSESP::sensor_fails(); + output["apicalls"] = WebAPIService::api_count(); // + WebAPIService::api_fails(); + output["apifails"] = WebAPIService::api_fails(); + + if (EMSESP::dallas_enabled() || EMSESP::analog_enabled()) { + output["sensorreads"] = EMSESP::dallassensor_.reads() + EMSESP::analogsensor_.reads(); + output["sensorfails"] = EMSESP::dallassensor_.fails() + EMSESP::analogsensor_.fails(); } #ifndef EMSESP_STANDALONE output["freemem"] = ESP.getFreeHeap() / 1000L; // kilobytes #endif - if (analog_enabled_) { - output["adc"] = analog_; - } - #ifndef EMSESP_STANDALONE if (!ethernet_connected_) { int8_t rssi = WiFi.RSSI(); @@ -550,43 +579,14 @@ void System::send_heartbeat() { return; } - StaticJsonDocument doc; - JsonObject json = doc.to(); + StaticJsonDocument doc; + JsonObject json = doc.to(); if (heartbeat_json(json)) { - Mqtt::publish(F_(heartbeat), doc.as()); // send to MQTT with retain off. This will add to MQTT queue. + Mqtt::publish(F_(heartbeat), json); // send to MQTT with retain off. This will add to MQTT queue. } } -// measure and moving average adc -void System::measure_analog() { - static uint32_t measure_last_ = 0; - - if (!measure_last_ || (uint32_t)(uuid::get_uptime() - measure_last_) >= SYSTEM_MEASURE_ANALOG_INTERVAL) { - measure_last_ = uuid::get_uptime(); -#if defined(EMSESP_STANDALONE) - uint16_t a = 0; -#else - uint16_t a = analogReadMilliVolts(ADC1_CHANNEL_0_GPIO_NUM); -#endif - static uint32_t sum_ = 0; - - if (!analog_) { // init first time - analog_ = a; - sum_ = a * 512; - } else { // simple moving average filter - sum_ = (sum_ * 511) / 512 + a; - analog_ = sum_ / 512; - } - } -} - -// sets rate of led flash -void System::set_led_speed(uint32_t speed) { - led_flash_speed_ = speed; - led_monitor(); -} - // initializes network void System::network_init(bool refresh) { if (refresh) { @@ -600,72 +600,57 @@ void System::network_init(bool refresh) { return; } - uint8_t phy_addr; // I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110) - int power; // Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source) - int mdc; // Pin# of the I²C clock signal for the Ethernet PHY - int mdio; // Pin# of the I²C IO signal for the Ethernet PHY - eth_phy_type_t type; // Type of the Ethernet PHY (LAN8720 or TLK110) - eth_clock_mode_t clock_mode; // ETH_CLOCK_GPIO0_IN or ETH_CLOCK_GPIO0_OUT, ETH_CLOCK_GPIO16_OUT, ETH_CLOCK_GPIO17_OUT for 50Hz inverted clock - - if (phy_type_ == PHY_type::PHY_TYPE_LAN8720) { - phy_addr = 1; - power = 16; - mdc = 23; - mdio = 18; - type = ETH_PHY_LAN8720; - clock_mode = ETH_CLOCK_GPIO0_IN; - } else if (phy_type_ == PHY_type::PHY_TYPE_TLK110) { - phy_addr = 31; - power = -1; - mdc = 23; - mdio = 18; - type = ETH_PHY_TLK110; - clock_mode = ETH_CLOCK_GPIO0_IN; - } else { - return; // no valid profile - } - - // special case for Olimex ESP32-EVB (LAN8720) (different power and phy_addr) - if (board_profile_.equals("OLIMEX")) { - phy_addr = 0; - power = -1; - mdc = 23; - mdio = 18; - type = ETH_PHY_LAN8720; - clock_mode = ETH_CLOCK_GPIO0_IN; - } + // configure Ethernet + int mdc = 23; // Pin# of the I²C clock signal for the Ethernet PHY - hardcoded + int mdio = 18; // Pin# of the I²C IO signal for the Ethernet PHY - hardcoded + uint8_t phy_addr = eth_phy_addr_; // I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110) + int8_t power = eth_power_; // Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source) + eth_phy_type_t type = (phy_type_ == PHY_type::PHY_TYPE_LAN8720) ? ETH_PHY_LAN8720 : ETH_PHY_TLK110; // Type of the Ethernet PHY (LAN8720 or TLK110) + // clock mode + // ETH_CLOCK_GPIO0_IN = 0 RMII clock input to GPIO0 + // ETH_CLOCK_GPIO0_OUT = 1 RMII clock output from GPIO0 + // ETH_CLOCK_GPIO16_OUT = 2 RMII clock output from GPIO16 + // ETH_CLOCK_GPIO17_OUT = 3 RMII clock output from GPIO17, for 50hz inverted clock + eth_clock_mode_t clock_mode = (eth_clock_mode_t)eth_clock_mode_; ETH.begin(phy_addr, power, mdc, mdio, type, clock_mode); } -// check health of system, done every few seconds +// check health of system, done every 5 seconds void System::system_check() { if (!last_system_check_ || ((uint32_t)(uuid::get_uptime() - last_system_check_) >= SYSTEM_CHECK_FREQUENCY)) { last_system_check_ = uuid::get_uptime(); -#ifndef EMSESP_STANDALONE + // check if we have a valid network connection if (!ethernet_connected() && (WiFi.status() != WL_CONNECTED)) { - set_led_speed(LED_WARNING_BLINK_FAST); - system_healthy_ = false; - return; - } -#endif - - // not healthy if bus not connected - if (!EMSbus::bus_connected()) { - if (system_healthy_) { - LOG_ERROR(F("Error: No connection to the EMS bus")); - } - system_healthy_ = false; - set_led_speed(LED_WARNING_BLINK); // flash every 1/2 second from now on + healthcheck_ |= HEALTHCHECK_NO_NETWORK; } else { - // if it was unhealthy but now we're better, make sure the LED is solid again cos we've been healed - if (!system_healthy_) { - system_healthy_ = true; - send_heartbeat(); + healthcheck_ &= ~HEALTHCHECK_NO_NETWORK; + } + + // check if we have a bus connection + if (!EMSbus::bus_connected()) { + healthcheck_ |= HEALTHCHECK_NO_BUS; + } else { + healthcheck_ &= ~HEALTHCHECK_NO_BUS; + } + + // see if the healthcheck state has changed + static uint8_t last_healthcheck_ = 0; + if (healthcheck_ != last_healthcheck_) { + last_healthcheck_ = healthcheck_; + // see if we're better now + if (healthcheck_ == 0) { + // everything is healthy, show LED permanently on or off depending on setting if (led_gpio_) { digitalWrite(led_gpio_, hide_led_ ? !LED_ON : LED_ON); } + send_heartbeat(); + } else { + // turn off LED so we're ready to the flashes + if (led_gpio_) { + digitalWrite(led_gpio_, !LED_ON); + } } } } @@ -676,45 +661,94 @@ void System::commands_init() { Command::add(EMSdevice::DeviceType::SYSTEM, F_(pin), System::command_pin, - F("sets a GPIO on/off"), + F("set a GPIO on/off"), CommandFlag::MQTT_SUB_FLAG_NOSUB | CommandFlag::ADMIN_ONLY); // dont create a MQTT topic for this - Command::add(EMSdevice::DeviceType::SYSTEM, F_(send), System::command_send, F("sends a telegram"), CommandFlag::ADMIN_ONLY); - Command::add(EMSdevice::DeviceType::SYSTEM, F_(fetch), System::command_fetch, F("refreshes all EMS values"), CommandFlag::ADMIN_ONLY); - Command::add(EMSdevice::DeviceType::SYSTEM, F_(restart), System::command_restart, F("restarts EMS-ESP"), CommandFlag::ADMIN_ONLY); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(send), System::command_send, F("send a telegram"), CommandFlag::ADMIN_ONLY); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(fetch), System::command_fetch, F("refresh all EMS values"), CommandFlag::ADMIN_ONLY); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(restart), System::command_restart, F("restart EMS-ESP"), CommandFlag::ADMIN_ONLY); Command::add(EMSdevice::DeviceType::SYSTEM, F_(watch), System::command_watch, F("watch incoming telegrams")); + // Command::add(EMSdevice::DeviceType::SYSTEM, F_(syslog), System::command_syslog_level, F("set syslog level"), CommandFlag::ADMIN_ONLY); if (Mqtt::enabled()) { - Command::add(EMSdevice::DeviceType::SYSTEM, F_(publish), System::command_publish, F("forces a MQTT publish")); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(publish), System::command_publish, F("force a MQTT publish")); } // these commands will return data in JSON format Command::add(EMSdevice::DeviceType::SYSTEM, F_(info), System::command_info, F("show system status")); - Command::add(EMSdevice::DeviceType::SYSTEM, F_(settings), System::command_settings, F("shows system settings")); - Command::add(EMSdevice::DeviceType::SYSTEM, F_(commands), System::command_commands, F("shows system commands")); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(settings), System::command_settings, F("fetch system settings")); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(customizations), System::command_customizations, F("fetch system customizations")); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(commands), System::command_commands, F("fetch system commands")); #if defined(EMSESP_DEBUG) - Command::add(EMSdevice::DeviceType::SYSTEM, F("test"), System::command_test, F("runs a specific test")); + Command::add(EMSdevice::DeviceType::SYSTEM, F("test"), System::command_test, F("run a specific test")); #endif // MQTT subscribe "ems-esp/system/#" Mqtt::subscribe(EMSdevice::DeviceType::SYSTEM, "system/#", nullptr); // use empty function callback } -// flashes the LED +// uses LED to show system health void System::led_monitor() { - if (!led_gpio_) { - return; + // we only need to run the LED healthcheck if there are errors + if (!healthcheck_) { + return; // all good } - static uint32_t led_last_blink_ = 0; + static uint32_t led_long_timer_ = 1; // 1 will kick it off immediately + static uint32_t led_short_timer_ = 0; + static uint8_t led_flash_step_ = 0; // 0 means we're not in the short flash timer + auto current_time = uuid::get_uptime(); - if (!led_last_blink_ || (uint32_t)(uuid::get_uptime() - led_last_blink_) >= led_flash_speed_) { - led_last_blink_ = uuid::get_uptime(); + // first long pause before we start flashing + if (led_long_timer_ && (uint32_t)(current_time - led_long_timer_) >= HEALTHCHECK_LED_LONG_DUARATION) { + // Serial.println("starting the flash check"); + led_short_timer_ = current_time; // start the short timer + led_long_timer_ = 0; // stop long timer + led_flash_step_ = 1; // enable the short flash timer + } - // if bus_not_connected or network not connected, start flashing - if (!system_healthy_) { - digitalWrite(led_gpio_, !digitalRead(led_gpio_)); + // the flash timer which starts after the long pause + if (led_flash_step_ && (uint32_t)(current_time - led_short_timer_) >= HEALTHCHECK_LED_FLASH_DUARATION) { + led_long_timer_ = 0; // stop the long timer + led_short_timer_ = current_time; + static bool led_on_ = false; + + if (++led_flash_step_ == 8) { + // reset the whole sequence + // Serial.println("resetting flash check"); + led_long_timer_ = uuid::get_uptime(); + led_flash_step_ = 0; + digitalWrite(led_gpio_, !LED_ON); // LED off + } else if (led_flash_step_ % 2) { + // handle the step events (on odd numbers 3,5,7,etc). see if we need to turn on a LED + // 1 flash is the EMS bus is not connected + // 2 flashes if the network (wifi or ethernet) is not connected + // 3 flashes is both the bus and the network are not connected. Then you know you're truly f*cked. + + if ((led_flash_step_ == 3) + && (((healthcheck_ & HEALTHCHECK_NO_NETWORK) == HEALTHCHECK_NO_NETWORK) || ((healthcheck_ & HEALTHCHECK_NO_BUS) == HEALTHCHECK_NO_BUS))) { + led_on_ = true; + } + + if ((led_flash_step_ == 5) && ((healthcheck_ & HEALTHCHECK_NO_NETWORK) == HEALTHCHECK_NO_NETWORK)) { + led_on_ = true; + } + + if ((led_flash_step_ == 7) && ((healthcheck_ & HEALTHCHECK_NO_NETWORK) == HEALTHCHECK_NO_NETWORK) + && ((healthcheck_ & HEALTHCHECK_NO_BUS) == HEALTHCHECK_NO_BUS)) { + led_on_ = true; + } + + if (led_on_ && led_gpio_) { + digitalWrite(led_gpio_, LED_ON); + } + } else { + // turn the led off after the flash, on even number count + if (led_on_ && led_gpio_) { + digitalWrite(led_gpio_, !LED_ON); + led_on_ = false; + } } } } @@ -761,19 +795,19 @@ void System::show_system(uuid::console::Shell & shell) { switch (WiFi.status()) { case WL_IDLE_STATUS: - shell.printfln(F("WiFi: Idle")); + shell.printfln(F("Network: Idle")); break; case WL_NO_SSID_AVAIL: - shell.printfln(F("WiFi: Network not found")); + shell.printfln(F("Network: Network not found")); break; case WL_SCAN_COMPLETED: - shell.printfln(F("WiFi: Network scan complete")); + shell.printfln(F("Network: Network scan complete")); break; case WL_CONNECTED: - shell.printfln(F("WiFi: Connected")); + shell.printfln(F("Network: connected")); shell.printfln(F("SSID: %s"), WiFi.SSID().c_str()); shell.printfln(F("BSSID: %s"), WiFi.BSSIDstr().c_str()); shell.printfln(F("RSSI: %d dBm (%d %%)"), WiFi.RSSI(), wifi_quality(WiFi.RSSI())); @@ -788,28 +822,28 @@ void System::show_system(uuid::console::Shell & shell) { break; case WL_CONNECT_FAILED: - shell.printfln(F("WiFi: Connection failed")); + shell.printfln(F("WiFi Network: Connection failed")); break; case WL_CONNECTION_LOST: - shell.printfln(F("WiFi: Connection lost")); + shell.printfln(F("WiFi Network: Connection lost")); break; case WL_DISCONNECTED: - shell.printfln(F("WiFi: Disconnected")); + shell.printfln(F("WiFi Network: Disconnected")); break; case WL_NO_SHIELD: default: - shell.printfln(F("WiFi: Unknown")); + shell.printfln(F("WiFi Network: Unknown")); break; } shell.println(); - // show Ethernet + // show Ethernet if connected if (ethernet_connected_) { - shell.printfln(F("Ethernet: Connected")); + shell.printfln(F("Wired Network: connected")); shell.printfln(F("MAC address: %s"), ETH.macAddress().c_str()); shell.printfln(F("Hostname: %s"), ETH.getHostname()); shell.printfln(F("IPv4 address: %s/%s"), uuid::printable_to_string(ETH.localIP()).c_str(), uuid::printable_to_string(ETH.subnetMask()).c_str()); @@ -818,8 +852,6 @@ void System::show_system(uuid::console::Shell & shell) { if (ETH.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000") { shell.printfln(F("IPv6 address: %s"), uuid::printable_to_string(ETH.localIPv6()).c_str()); } - } else { - shell.printfln(F("Ethernet: disconnected")); } shell.println(); @@ -856,18 +888,20 @@ bool System::command_commands(const char * value, const int8_t id, JsonObject & // export all settings to JSON text // http://ems-esp/api/system/settings // value and id are ignored +// note: ssid and passwords are excluded bool System::command_settings(const char * value, const int8_t id, JsonObject & output) { - JsonObject node; + output["label"] = "settings"; - node = output.createNestedObject("System"); + JsonObject node = output.createNestedObject("System"); node["version"] = EMSESP_APP_VERSION; - // hide ssid from this list EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & settings) { node = output.createNestedObject("Network"); node["hostname"] = settings.hostname; node["static_ip_config"] = settings.staticIPConfig; node["enableIPv6"] = settings.enableIPv6; + node["low_bandwidth"] = settings.bandwidth20; + node["disable_sleep"] = settings.nosleep; JsonUtils::writeIP(node, "local_ip", settings.localIP); JsonUtils::writeIP(node, "gateway_ip", settings.gatewayIP); JsonUtils::writeIP(node, "subnet_mask", settings.subnetMask); @@ -878,35 +912,41 @@ bool System::command_settings(const char * value, const int8_t id, JsonObject & #ifndef EMSESP_STANDALONE EMSESP::esp8266React.getAPSettingsService()->read([&](APSettings & settings) { node = output.createNestedObject("AP"); - node["provision_mode"] = settings.provisionMode; + const char * pM[] = {"always", "disconnected", "never"}; + node["provision_mode"] = pM[settings.provisionMode]; + node["security"] = settings.password.length() ? "wpa2" : "open"; node["ssid"] = settings.ssid; node["local_ip"] = settings.localIP.toString(); node["gateway_ip"] = settings.gatewayIP.toString(); node["subnet_mask"] = settings.subnetMask.toString(); + node["channel"] = settings.channel; + node["ssid_hidden"] = settings.ssidHidden; + node["max_clients"] = settings.maxClients; }); #endif EMSESP::esp8266React.getMqttSettingsService()->read([&](MqttSettings & settings) { - node = output.createNestedObject("MQTT"); - node["enabled"] = settings.enabled; -#ifndef EMSESP_STANDALONE - node["host"] = settings.host; - node["port"] = settings.port; - node["username"] = settings.username; - node["client_id"] = settings.clientId; - node["keep_alive"] = settings.keepAlive; - node["clean_session"] = settings.cleanSession; -#endif + node = output.createNestedObject("MQTT"); + node["enabled"] = settings.enabled; + node["host"] = settings.host; + node["port"] = settings.port; + node["username"] = settings.username; + node["client_id"] = settings.clientId; + node["keep_alive"] = settings.keepAlive; + node["clean_session"] = settings.cleanSession; + node["base"] = settings.base; + node["discovery_prefix"] = settings.discovery_prefix; + node["nested_format"] = settings.nested_format; + node["ha_enabled"] = settings.ha_enabled; + node["mqtt_qos"] = settings.mqtt_qos; + node["mqtt_retain"] = settings.mqtt_retain; node["publish_time_boiler"] = settings.publish_time_boiler; node["publish_time_thermostat"] = settings.publish_time_thermostat; node["publish_time_solar"] = settings.publish_time_solar; node["publish_time_mixer"] = settings.publish_time_mixer; node["publish_time_other"] = settings.publish_time_other; node["publish_time_sensor"] = settings.publish_time_sensor; - node["ha_climate_format"] = settings.ha_climate_format; - node["ha_enabled"] = settings.ha_enabled; - node["mqtt_qos"] = settings.mqtt_qos; - node["mqtt_retain"] = settings.mqtt_retain; + node["publish_single"] = settings.publish_single; node["send_response"] = settings.send_response; }); @@ -949,15 +989,73 @@ bool System::command_settings(const char * value, const int8_t id, JsonObject & node["dallas_gpio"] = settings.dallas_gpio; node["pbutton_gpio"] = settings.pbutton_gpio; node["led_gpio"] = settings.led_gpio; - node["phy_type"] = settings.phy_type; - node["hide_led"] = settings.hide_led; - node["notoken_api"] = settings.notoken_api; + node["hide_led"] = settings.hide_led; + node["notoken_api"] = settings.notoken_api; + node["readonly_mode"] = settings.readonly_mode; + + node["fahrenheit"] = settings.fahrenheit; node["dallas_parasite"] = settings.dallas_parasite; - node["dallas_format"] = settings.dallas_format; node["bool_format"] = settings.bool_format; node["enum_format"] = settings.enum_format; node["analog_enabled"] = settings.analog_enabled; + node["telnet_enabled"] = settings.telnet_enabled; + + node["phy_type"] = settings.phy_type; + node["eth_power"] = settings.eth_power; + node["eth_phy_addr"] = settings.eth_phy_addr; + node["eth_clock_mode"] = settings.eth_clock_mode; + }); + + return true; +} + +// http://ems-esp/api/system/customizations +bool System::command_customizations(const char * value, const int8_t id, JsonObject & output) { + output["label"] = "customizations"; + + JsonObject node = output.createNestedObject("Customizations"); + + // hide ssid from this list + EMSESP::webCustomizationService.read([&](WebCustomization & settings) { + // sensors + JsonArray sensorsJson = node.createNestedArray("sensors"); + for (const auto & sensor : settings.sensorCustomizations) { + JsonObject sensorJson = sensorsJson.createNestedObject(); + sensorJson["id_str"] = sensor.id_str; // key, is + sensorJson["name"] = sensor.name; // n + sensorJson["offset"] = sensor.offset; // o + } + + JsonArray analogJson = node.createNestedArray("analogs"); + for (const AnalogCustomization & sensor : settings.analogCustomizations) { + JsonObject sensorJson = analogJson.createNestedObject(); + sensorJson["gpio"] = sensor.id; + sensorJson["name"] = sensor.name; + if (EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX) { + sensorJson["type"] = sensor.type; + } else { + sensorJson["type"] = FL_(enum_sensortype)[sensor.type]; + } + if (sensor.type == AnalogSensor::AnalogType::ADC) { + sensorJson["offset"] = sensor.offset; + sensorJson["factor"] = sensor.factor; + sensorJson["uom"] = EMSdevice::uom_to_string(sensor.uom); + } + } + + // exclude entities + JsonArray exclude_entitiesJson = node.createNestedArray("exclude_entities"); + for (const auto & entityCustomization : settings.entityCustomizations) { + JsonObject entityJson = exclude_entitiesJson.createNestedObject(); + entityJson["product_id"] = entityCustomization.product_id; + entityJson["device_id"] = entityCustomization.device_id; + + JsonArray exclude_entityJson = entityJson.createNestedArray("entity_ids"); + for (uint8_t entity_id : entityCustomization.entity_ids) { + exclude_entityJson.add(entity_id); + } + } }); return true; @@ -981,7 +1079,11 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["reset reason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1); if (EMSESP::dallas_enabled()) { - node["Dallas sensors"] = EMSESP::sensor_devices().size(); + node["Temperature sensors"] = EMSESP::dallassensor_.no_sensors(); + } + + if (EMSESP::analog_enabled()) { + node["Analog sensors"] = EMSESP::analogsensor_.no_sensors(); } #ifndef EMSESP_STANDALONE @@ -1001,7 +1103,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["IPv6 address"] = uuid::printable_to_string(WiFi.localIPv6()); } } else if (EMSESP::system_.ethernet_connected()) { - node["connection"] = F("Ethernet"); + node["connection"] = F("Wired"); node["hostname"] = ETH.getHostname(); node["MAC"] = ETH.macAddress(); node["IPv4 address"] = uuid::printable_to_string(ETH.localIP()) + "/" + uuid::printable_to_string(ETH.subnetMask()); @@ -1021,7 +1123,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["bus status"] = (F("disconnected")); break; case EMSESP::BUS_STATUS_TX_ERRORS: - node["bus status"] = (F("connected, instable tx")); + node["bus status"] = (F("connected, tx issues - try a different tx-mode")); break; case EMSESP::BUS_STATUS_CONNECTED: default: @@ -1030,27 +1132,39 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp } if (EMSESP::bus_status() != EMSESP::BUS_STATUS_OFFLINE) { - node["bus protocol"] = EMSbus::is_ht3() ? F("HT3") : F("Buderus"); - node["telegrams received"] = EMSESP::rxservice_.telegram_count(); - node["read requests sent"] = EMSESP::txservice_.telegram_read_count(); - node["write requests sent"] = EMSESP::txservice_.telegram_write_count(); - node["incomplete telegrams"] = EMSESP::rxservice_.telegram_error_count(); - node["tx fails"] = EMSESP::txservice_.telegram_fail_count(); - node["rx line quality"] = EMSESP::rxservice_.quality(); - node["tx line quality"] = EMSESP::txservice_.quality(); + node["bus protocol"] = EMSbus::is_ht3() ? F("HT3") : F("Buderus"); + node["bus telegrams received (rx)"] = EMSESP::rxservice_.telegram_count(); + node["bus reads (tx)"] = EMSESP::txservice_.telegram_read_count(); + node["bus writes (tx)"] = EMSESP::txservice_.telegram_write_count(); + node["bus incomplete telegrams"] = EMSESP::rxservice_.telegram_error_count(); + node["bus reads failed"] = EMSESP::txservice_.telegram_read_fail_count(); + node["bus writes failed"] = EMSESP::txservice_.telegram_write_fail_count(); + node["bus rx line quality"] = EMSESP::rxservice_.quality(); + node["bus tx line quality"] = (EMSESP::txservice_.read_quality() + EMSESP::txservice_.read_quality()) / 2; if (Mqtt::enabled()) { - node["MQTT"] = Mqtt::connected() ? F_(connected) : F_(disconnected); + node["MQTT status"] = Mqtt::connected() ? F_(connected) : F_(disconnected); node["MQTT publishes"] = Mqtt::publish_count(); node["MQTT publish fails"] = Mqtt::publish_fails(); } + node["Temperature sensors"] = EMSESP::dallassensor_.no_sensors(); if (EMSESP::dallas_enabled()) { - node["Dallas reads"] = EMSESP::sensor_reads(); - node["Dallas fails"] = EMSESP::sensor_fails(); + node["Temperature sensor reads"] = EMSESP::dallassensor_.reads(); + node["Temperature sensor fails"] = EMSESP::dallassensor_.fails(); } + node["Analog sensors"] = EMSESP::analogsensor_.no_sensors(); + if (EMSESP::analog_enabled()) { + node["Analog sensor reads"] = EMSESP::analogsensor_.reads(); + node["Analog sensor fails"] = EMSESP::analogsensor_.fails(); + } + node["API calls"] = WebAPIService::api_count(); + node["API fails"] = WebAPIService::api_fails(); + #ifndef EMSESP_STANDALONE if (EMSESP::system_.syslog_enabled_) { - node["syslog IP"] = syslog_.ip(); - node["syslog active"] = syslog_.started(); + node["syslog_started"] = syslog_.started(); + node["syslog_level"] = FL_(enum_syslog_level)[syslog_.log_level() + 1]; + node["syslog_ip"] = syslog_.ip(); + node["syslog_queue"] = syslog_.queued(); } #endif } @@ -1064,9 +1178,17 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp obj["type"] = emsdevice->device_type_name(); obj["name"] = emsdevice->to_string(); char result[200]; - (void)emsdevice->show_telegram_handlers(result); + (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::RECEIVED); if (result[0] != '\0') { - obj["handlers"] = result; // don't show hanlders if there aren't any + obj["handlers_received"] = result; // don't show handlers if there aren't any + } + (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::FETCHED); + if (result[0] != '\0') { + obj["handlers_fetched"] = result; + } + (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::PENDING); + if (result[0] != '\0') { + obj["handlers_pending"] = result; } } } @@ -1084,29 +1206,55 @@ bool System::command_test(const char * value, const int8_t id) { #endif // takes a board profile and populates a data array with GPIO configurations -// data = led, dallas, rx, tx, button, phy_type // returns false if profile is not found -bool System::load_board_profile(std::vector & data, const std::string & board_profile) { +// +// data = led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode +// +// clock modes: +// ETH_CLOCK_GPIO0_IN = 0 RMII clock input to GPIO0 +// ETH_CLOCK_GPIO0_OUT = 1 RMII clock output from GPIO0 +// ETH_CLOCK_GPIO16_OUT = 2 RMII clock output from GPIO16 +// ETH_CLOCK_GPIO17_OUT = 3 RMII clock output from GPIO17, for 50hz inverted cloc +bool System::load_board_profile(std::vector & data, const std::string & board_profile) { if (board_profile == "S32") { - data = {2, 18, 23, 5, 0, PHY_type::PHY_TYPE_NONE}; // BBQKees Gateway S32 + data = {2, 18, 23, 5, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0}; // BBQKees Gateway S32 } else if (board_profile == "E32") { - data = {2, 4, 5, 17, 33, PHY_type::PHY_TYPE_LAN8720}; // BBQKees Gateway E32 + data = {2, 4, 5, 17, 33, PHY_type::PHY_TYPE_LAN8720, 16, 1, 0}; // BBQKees Gateway E32 } else if (board_profile == "MH-ET") { - data = {2, 18, 23, 5, 0, PHY_type::PHY_TYPE_NONE}; // MH-ET Live D1 Mini + data = {2, 18, 23, 5, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0}; // MH-ET Live D1 Mini } else if (board_profile == "NODEMCU") { - data = {2, 18, 23, 5, 0, PHY_type::PHY_TYPE_NONE}; // NodeMCU 32S + data = {2, 18, 23, 5, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0}; // NodeMCU 32S } else if (board_profile == "LOLIN") { - data = {2, 18, 17, 16, 0, PHY_type::PHY_TYPE_NONE}; // Lolin D32 + data = {2, 18, 17, 16, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0}; // Lolin D32 } else if (board_profile == "OLIMEX") { - data = {0, 0, 36, 4, 34, PHY_type::PHY_TYPE_LAN8720}; // Olimex ESP32-EVB (uses U1TXD/U1RXD/BUTTON, no LED or Dallas) + data = {0, 0, 36, 4, 34, PHY_type::PHY_TYPE_LAN8720, -1, 0, 0}; // Olimex ESP32-EVB (uses U1TXD/U1RXD/BUTTON, no LED or Dallas) + } else if (board_profile == "OLIMEXPOE") { + data = {0, 0, 36, 4, 34, PHY_type::PHY_TYPE_LAN8720, 12, 0, 3}; // Olimex ESP32-POE + } else if (board_profile == "CUSTOM") { + // send back current values + data = {(int8_t)EMSESP::system_.led_gpio_, + (int8_t)EMSESP::system_.dallas_gpio_, + (int8_t)EMSESP::system_.rx_gpio_, + (int8_t)EMSESP::system_.tx_gpio_, + (int8_t)EMSESP::system_.pbutton_gpio_, + (int8_t)EMSESP::system_.phy_type_, + EMSESP::system_.eth_power_, + (int8_t)EMSESP::system_.eth_phy_addr_, + (int8_t)EMSESP::system_.eth_clock_mode_}; } else { - data = {EMSESP_DEFAULT_LED_GPIO, - EMSESP_DEFAULT_DALLAS_GPIO, - EMSESP_DEFAULT_RX_GPIO, - EMSESP_DEFAULT_TX_GPIO, - EMSESP_DEFAULT_PBUTTON_GPIO, - EMSESP_DEFAULT_PHY_TYPE}; - return (board_profile == "CUSTOM"); + // unknown, use defaults + data = { + EMSESP_DEFAULT_LED_GPIO, + EMSESP_DEFAULT_DALLAS_GPIO, + EMSESP_DEFAULT_RX_GPIO, + EMSESP_DEFAULT_TX_GPIO, + EMSESP_DEFAULT_PBUTTON_GPIO, + EMSESP_DEFAULT_PHY_TYPE, + -1, // power + 0, // phy_addr, + 0 // clock_mode + }; + return false; } return true; @@ -1147,7 +1295,7 @@ const std::string System::reset_reason(uint8_t cpu) { case 13: return ("RTC watch dog reset: CPU"); case 14: - return ("APP CPU reseted by PRO CPU"); + return ("APP CPU reset by PRO CPU"); case 15: return ("Brownout reset"); case 16: diff --git a/src/system.h b/src/system.h index 3da5571f3..3edb2d6a0 100644 --- a/src/system.h +++ b/src/system.h @@ -28,7 +28,6 @@ #include "telegram.h" #ifndef EMSESP_STANDALONE -#include "driver/adc.h" #include #include #include @@ -63,6 +62,7 @@ class System { static bool command_info(const char * value, const int8_t id, JsonObject & output); static bool command_settings(const char * value, const int8_t id, JsonObject & output); + static bool command_customizations(const char * value, const int8_t id, JsonObject & output); static bool command_commands(const char * value, const int8_t id, JsonObject & output); const std::string reset_reason(uint8_t cpu); @@ -80,13 +80,12 @@ class System { void send_heartbeat(); void led_init(bool refresh); - void adc_init(bool refresh); void network_init(bool refresh); void button_init(bool refresh); void commands_init(); static bool is_valid_gpio(uint8_t pin); - static bool load_board_profile(std::vector & data, const std::string & board_profile); + static bool load_board_profile(std::vector & data, const std::string & board_profile); static void restart_requested(bool restart_requested) { restart_requested_ = restart_requested; @@ -96,12 +95,47 @@ class System { return restart_requested_; } + bool telnet_enabled() { + return telnet_enabled_; + } + bool analog_enabled() { return analog_enabled_; } - uint16_t analog() { - return analog_; + bool readonly_mode() { + return readonly_mode_; + } + + void readonly_mode(bool readonly_mode) { + readonly_mode_ = readonly_mode; + } + + uint8_t bool_format() { + return bool_format_; + } + + // see default_settings.h + // BOOL_FORMAT_ONOFF_STR = 1, + // BOOL_FORMAT_ONOFF_STR_CAP = 2 + // BOOL_FORMAT_TRUEFALSE_STR = 3 + // BOOL_FORMAT_TRUEFALSE = 4 + // BOOL_FORMAT_10_STR = 5 + // BOOL_FORMAT_10 = 6 + void bool_format(uint8_t format) { + bool_format_ = format; + } + + uint8_t enum_format() { + return enum_format_; + } + + void enum_format(uint8_t format) { + enum_format_ = format; + } + + std::string board_profile() { + return std::string(board_profile_.c_str()); } std::string hostname() { @@ -128,6 +162,18 @@ class System { #endif } + void fahrenheit(bool b) { + fahrenheit_ = b; + } + + bool fahrenheit() { + return fahrenheit_; + } + + void healthcheck(uint8_t healthcheck) { + healthcheck_ = healthcheck; + } + void show_system(uuid::console::Shell & shell); void wifi_reconnect(); void show_users(uuid::console::Shell & shell); @@ -148,46 +194,59 @@ class System { static constexpr uint32_t BUTTON_LongPressDelay = 750; // Hold period for a long press event (in ms) static constexpr uint32_t BUTTON_VLongPressDelay = 9000; // Hold period for a very long press event (in ms) - static constexpr uint32_t SYSTEM_CHECK_FREQUENCY = 5000; // check every 5 seconds - static constexpr uint32_t LED_WARNING_BLINK = 1000; // pulse to show no connection, 1 sec - static constexpr uint32_t LED_WARNING_BLINK_FAST = 100; // flash quickly for boot up sequence - static constexpr uint32_t SYSTEM_HEARTBEAT_INTERVAL = 60000; // in milliseconds, how often the MQTT heartbeat is sent (1 min) - static constexpr uint32_t SYSTEM_MEASURE_ANALOG_INTERVAL = 500; - static constexpr uint8_t LED_ON = HIGH; // LED + // healthcheck + static constexpr uint32_t SYSTEM_CHECK_FREQUENCY = 5000; // do a system check every 5 seconds + static constexpr uint32_t HEALTHCHECK_LED_LONG_DUARATION = 1500; + static constexpr uint32_t HEALTHCHECK_LED_FLASH_DUARATION = 150; + static constexpr uint8_t HEALTHCHECK_NO_BUS = (1 << 0); // 1 + static constexpr uint8_t HEALTHCHECK_NO_NETWORK = (1 << 1); // 2 + static constexpr uint32_t SYSTEM_HEARTBEAT_INTERVAL = 60000; // in milliseconds, how often the MQTT heartbeat is sent (1 min) + static constexpr uint8_t LED_ON = HIGH; // LED on #ifndef EMSESP_STANDALONE static uuid::syslog::SyslogService syslog_; #endif void led_monitor(); - void set_led_speed(uint32_t speed); void system_check(); - void measure_analog(); int8_t wifi_quality(int8_t dBm); - bool system_healthy_ = false; - uint32_t led_flash_speed_ = LED_WARNING_BLINK_FAST; // default boot flashes quickly - uint32_t last_heartbeat_ = 0; - uint32_t last_system_check_ = 0; - bool upload_status_ = false; // true if we're in the middle of a OTA firmware upload - bool ethernet_connected_ = false; - uint16_t analog_; + uint8_t healthcheck_ = HEALTHCHECK_NO_NETWORK | HEALTHCHECK_NO_BUS; // start with all flags set, no wifi and no ems bus connection + uint32_t last_heartbeat_ = 0; + uint32_t last_system_check_ = 0; - // settings - std::string hostname_ = "ems-esp"; + bool upload_status_ = false; // true if we're in the middle of a OTA firmware upload + bool ethernet_connected_ = false; + + // EMS-ESP settings + // copies from WebSettings class in WebSettingsService.h + std::string hostname_ = FACTORY_WIFI_HOSTNAME; bool hide_led_; uint8_t led_gpio_; - bool syslog_enabled_ = false; bool analog_enabled_; bool low_clock_; String board_profile_; uint8_t pbutton_gpio_; - uint8_t phy_type_; + uint8_t rx_gpio_; + uint8_t tx_gpio_; + uint8_t dallas_gpio_; + bool telnet_enabled_; + bool syslog_enabled_; int8_t syslog_level_; uint32_t syslog_mark_interval_; String syslog_host_; uint16_t syslog_port_; + bool fahrenheit_; + uint8_t bool_format_; + uint8_t enum_format_; + bool readonly_mode_; + + // ethernet + uint8_t phy_type_; + int8_t eth_power_; + uint8_t eth_phy_addr_; + uint8_t eth_clock_mode_; }; } // namespace emsesp diff --git a/src/telegram.cpp b/src/telegram.cpp index 186430b91..8414f1333 100644 --- a/src/telegram.cpp +++ b/src/telegram.cpp @@ -37,6 +37,7 @@ const uint8_t ems_crc_table[] = {0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0xF9, 0xFB, 0xFD, 0xFF, 0xF1, 0xF3, 0xF5, 0xF7, 0xE9, 0xEB, 0xED, 0xEF, 0xE1, 0xE3, 0xE5, 0xE7}; uint32_t EMSbus::last_bus_activity_ = 0; // timestamp of last time a valid Rx came in +uint32_t EMSbus::bus_uptime_start_ = 0; // timestamp of when the bus was started bool EMSbus::bus_connected_ = false; // start assuming the bus hasn't been connected uint8_t EMSbus::ems_mask_ = EMS_MASK_UNSET; // unset so its triggered when booting, the its 0x00=buderus, 0x80=junker/ht3 uint8_t EMSbus::ems_bus_id_ = EMSESP_DEFAULT_EMS_BUS_ID; @@ -262,7 +263,7 @@ void TxService::start() { read_request(EMSdevice::EMS_TYPE_UBADevices, EMSdevice::EMS_DEVICE_ID_BOILER); } -// sends a 1 byte poll which is our own device ID +// sends a 1 byte poll which is our own deviceID void TxService::send_poll() { //LOG_DEBUG(F("Ack %02X"),ems_bus_id() ^ ems_mask()); if (tx_mode()) { @@ -359,13 +360,18 @@ void TxService::send_telegram(const QueuedTxTelegram & tx_telegram) { } } - uint8_t length = message_p; - telegram_last_ = std::make_shared(*telegram); // make a copy of the telegram + uint8_t length = message_p; telegram_raw[length] = calculate_crc(telegram_raw, length); // generate and append CRC to the end + length++; // add one since we want to now include the CRC - length++; // add one since we want to now include the CRC + // if we're in simulation mode, don't send anything, just quit + if (EMSESP::system_.readonly_mode() && (telegram->operation == Telegram::Operation::TX_WRITE)) { + LOG_INFO(F("[readonly] Sending write Tx telegram: %s"), Helpers::data_to_hex(telegram_raw, length - 1).c_str()); + tx_state(Telegram::Operation::NONE); + return; + } LOG_DEBUG(F("Sending %s Tx [#%d], telegram: %s"), (telegram->operation == Telegram::Operation::TX_WRITE) ? F("write") : F("read"), @@ -373,12 +379,19 @@ void TxService::send_telegram(const QueuedTxTelegram & tx_telegram) { Helpers::data_to_hex(telegram_raw, length - 1).c_str()); // exclude the last CRC byte set_post_send_query(tx_telegram.validateid_); - // send the telegram to the UART Tx + + // + // this is the core send command to the UART + // uint16_t status = EMSuart::transmit(telegram_raw, length); if (status == EMS_TX_STATUS_ERR) { LOG_ERROR(F("Failed to transmit Tx via UART.")); - increment_telegram_fail_count(); // another Tx fail + if (telegram->operation == Telegram::Operation::TX_READ) { + increment_telegram_read_fail_count(); // another Tx fail + } else { + increment_telegram_write_fail_count(); // another Tx fail + } tx_state(Telegram::Operation::NONE); // nothing send, tx not in wait state return; } @@ -577,9 +590,13 @@ void TxService::send_raw(const char * telegram_data) { void TxService::retry_tx(const uint8_t operation, const uint8_t * data, const uint8_t length) { // have we reached the limit? if so, reset count and give up if (++retry_count_ > MAXIMUM_TX_RETRIES) { - reset_retry_count(); // give up - increment_telegram_fail_count(); // another Tx fail - EMSESP::wait_validate(0); // do not wait for validation + reset_retry_count(); // give up + if (operation == Telegram::Operation::TX_READ) { + increment_telegram_read_fail_count(); // another Tx fail + } else { + increment_telegram_write_fail_count(); // another Tx fail + } + EMSESP::wait_validate(0); // do not wait for validation LOG_ERROR(F("Last Tx %s operation failed after %d retries. Ignoring request: %s"), (operation == Telegram::Operation::TX_WRITE) ? F("Write") : F("Read"), diff --git a/src/telegram.h b/src/telegram.h index 9bc3259f7..5ce46c5ad 100644 --- a/src/telegram.h +++ b/src/telegram.h @@ -34,7 +34,7 @@ #include "helpers.h" #define MAX_RX_TELEGRAMS 10 // size of Rx queue -#define MAX_TX_TELEGRAMS 30 // size of Tx queue +#define MAX_TX_TELEGRAMS 50 // size of Tx queue // default values for null values static constexpr uint8_t EMS_VALUE_BOOL = 0xFF; // used to mark that something is a boolean @@ -166,6 +166,7 @@ class EMSbus { ems_bus_id_ = ems_bus_id; } + // checks every 30 seconds if the EMS bus is still alive static bool bus_connected() { #ifndef EMSESP_STANDALONE if ((uuid::get_uptime() - last_bus_activity_) > EMS_BUS_TIMEOUT) { @@ -179,8 +180,22 @@ class EMSbus { // sets the flag for EMS bus connected static void last_bus_activity(uint32_t timestamp) { + // record the first time we connected to the BUS, as this will be our uptime + if (!last_bus_activity_) { + bus_uptime_start_ = timestamp; + } + last_bus_activity_ = timestamp; - bus_connected_ = true; + + bus_connected_ = true; + } + + // return bus uptime in seconds + static uint32_t bus_uptime() { + if (!bus_uptime_start_) { + return 0; // not yet initialized + } + return (uint32_t)((uuid::get_uptime() - bus_uptime_start_) / 1000ULL); } static uint8_t tx_state() { @@ -196,6 +211,7 @@ class EMSbus { static constexpr uint32_t EMS_BUS_TIMEOUT = 30000; // timeout in ms before recognizing the ems bus is offline (30 seconds) static uint32_t last_bus_activity_; // timestamp of last time a valid Rx came in + static uint32_t bus_uptime_start_; // timestamp of first time we connected to the bus static bool bus_connected_; // start assuming the bus hasn't been connected static uint8_t ems_mask_; // unset=0xFF, buderus=0x00, junkers/ht3=0x80 static uint8_t ems_bus_id_; // the bus id, which configurable and stored in settings @@ -224,6 +240,7 @@ class RxService : public EMSbus { return telegram_error_count_; } + // returns a % uint8_t quality() const { if (telegram_error_count_ == 0) { return 100; // all good, 100% @@ -308,49 +325,61 @@ class TxService : public EMSbus { uint32_t telegram_read_count() const { return telegram_read_count_; } + uint32_t telegram_write_count() const { + return telegram_write_count_; + } - void telegram_read_count(uint8_t telegram_read_count) { + void telegram_read_count(uint32_t telegram_read_count) { telegram_read_count_ = telegram_read_count; } + void telegram_write_count(uint32_t telegram_write_count) { + telegram_write_count_ = telegram_write_count; + } + void increment_telegram_read_count() { telegram_read_count_++; } - uint32_t telegram_fail_count() const { - return telegram_fail_count_; - } - - void telegram_fail_count(uint8_t telegram_fail_count) { - telegram_fail_count_ = telegram_fail_count; - } - - uint8_t quality() const { - if (telegram_fail_count_ == 0) { - return 100; // all good, 100% - } - if (telegram_fail_count_ >= telegram_read_count_) { - return 100; - } - return (100 - (uint8_t)(((float)telegram_fail_count_ / telegram_read_count_ * 100))); - } - - void increment_telegram_fail_count() { - telegram_fail_count_++; - } - - uint32_t telegram_write_count() const { - return telegram_write_count_; - } - - void telegram_write_count(uint8_t telegram_write_count) { - telegram_write_count_ = telegram_write_count; - } - void increment_telegram_write_count() { telegram_write_count_++; } + uint32_t telegram_read_fail_count() const { + return telegram_read_fail_count_; + } + + uint32_t telegram_write_fail_count() const { + return telegram_write_fail_count_; + } + + void telegram_fail_count(uint32_t telegram_fail_count) { + telegram_read_fail_count_ = telegram_fail_count; + telegram_write_fail_count_ = telegram_fail_count; + } + + uint8_t read_quality() const { + if (telegram_read_fail_count_ == 0) { + return 100; // all good, 100% + } + return (100 - (uint8_t)((telegram_read_fail_count_ * 100 / (telegram_read_fail_count_ + telegram_read_count_)))); + } + + uint8_t write_quality() const { + if (telegram_write_fail_count_ == 0) { + return 100; // all good, 100% + } + return (100 - (uint8_t)((telegram_write_fail_count_ * 100 / (telegram_write_fail_count_ + telegram_write_count_)))); + } + + void increment_telegram_read_fail_count() { + telegram_read_fail_count_++; + } + + void increment_telegram_write_fail_count() { + telegram_write_fail_count_++; + } + struct QueuedTxTelegram { const uint16_t id_; const std::shared_ptr telegram_; @@ -381,9 +410,10 @@ class TxService : public EMSbus { private: std::deque tx_telegrams_; // the Tx queue - uint32_t telegram_read_count_ = 0; // # Tx successful reads - uint32_t telegram_write_count_ = 0; // # Tx successful writes - uint32_t telegram_fail_count_ = 0; // # Tx unsuccessful transmits + uint32_t telegram_read_count_ = 0; // # Tx successful reads + uint32_t telegram_write_count_ = 0; // # Tx successful writes + uint32_t telegram_read_fail_count_ = 0; // # Tx unsuccessful transmits + uint32_t telegram_write_fail_count_ = 0; // # Tx unsuccessful transmits std::shared_ptr telegram_last_; uint16_t telegram_last_post_send_query_; // which type ID to query after a successful send, to read back the values just written @@ -392,9 +422,7 @@ class TxService : public EMSbus { uint8_t tx_telegram_id_ = 0; // queue counter - void send_telegram(const QueuedTxTelegram & tx_telegram); - // void send_telegram(const uint8_t * data, const uint8_t length); }; } // namespace emsesp diff --git a/src/test/test.cpp b/src/test/test.cpp index 16db7e6ff..f72a53dff 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -53,6 +53,38 @@ bool Test::run_test(const char * command, int8_t id) { return true; } + if (strcmp(command, "2thermostats") == 0) { + EMSESP::logger().info(F("Testing with multiple thermostats...")); + + add_device(0x08, 123); // GB072 + add_device(0x10, 158); // RC310 + add_device(0x18, 157); // Bosch CR100 + + // Boiler -> Me, UBAMonitorFast(0x18), telegram: 08 00 18 00 00 02 5A 73 3D 0A 10 65 40 02 1A 80 00 01 E1 01 76 0E 3D 48 00 C9 44 02 00 (#data=25) + uart_telegram({0x08, 0x00, 0x18, 0x00, 0x00, 0x02, 0x5A, 0x73, 0x3D, 0x0A, 0x10, 0x65, 0x40, 0x02, 0x1A, + 0x80, 0x00, 0x01, 0xE1, 0x01, 0x76, 0x0E, 0x3D, 0x48, 0x00, 0xC9, 0x44, 0x02, 0x00}); + + // Boiler -> Thermostat, UBAParameterWW(0x33), telegram: 08 97 33 00 23 24 (#data=2) + uart_telegram({0x08, 0x90, 0x33, 0x00, 0x23, 0x24}); + + // Boiler -> Me, UBAParameterWW(0x33), telegram: 08 0B 33 00 08 FF 34 FB 00 28 00 00 46 00 FF FF 00 (#data=13) + uart_telegram({0x08, 0x0B, 0x33, 0x00, 0x08, 0xFF, 0x34, 0xFB, 0x00, 0x28, 0x00, 0x00, 0x46, 0x00, 0xFF, 0xFF, 0x00}); + + // Thermostat 0x2A5 for HC1 + uart_telegram({0x10, 00, 0xFF, 00, 01, 0xA5, 0x80, 00, 01, 0x30, 0x28, 00, 0x30, 0x28, 01, 0x54, + 03, 03, 01, 01, 0x54, 02, 0xA8, 00, 00, 0x11, 01, 03, 0xFF, 0xFF, 00}); + + // RC300WWmode2(0x31D), data: 00 00 09 07 + uart_telegram({0x10, 00, 0xFF, 00, 02, 0x1D, 00, 00, 0x09, 0x07}); + + // 2nd thermostat + // Thermostat RCPLUSStatusMessage_HC2(0x01A6) + uart_telegram({0x98, 0x00, 0xFF, 0x00, 0x01, 0xA6, 0x00, 0xCF, 0x21, 0x2E, 0x00, 0x00, 0x2E, 0x24, + 0x03, 0x25, 0x03, 0x03, 0x01, 0x03, 0x25, 0x00, 0xC8, 0x00, 0x00, 0x11, 0x01, 0x03}); + + return true; + } + if (strcmp(command, "310") == 0) { EMSESP::logger().info(F("Adding a GB072/RC310 combo...")); @@ -141,6 +173,8 @@ bool Test::run_test(const char * command, int8_t id) { if (strcmp(command, "thermostat") == 0) { EMSESP::logger().info(F("Adding thermostat...")); + Mqtt::nested_format(1); // use nested + // Mqtt::nested_format(2); // single add_device(0x10, 192); // FW120 @@ -189,14 +223,12 @@ bool Test::run_test(const char * command, int8_t id) { // These next tests are run from the Console // using the test command -void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { +void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const std::string & data) { // switch to su shell.add_flags(CommandFlags::ADMIN); // init stuff Mqtt::ha_enabled(true); - EMSESP::dallassensor_.dallas_format(1); - Mqtt::ha_climate_format(1); EMSESP::rxservice_.ems_mask(EMSbus::EMS_MASK_BUDERUS); EMSESP::watch(EMSESP::Watch::WATCH_RAW); // raw @@ -334,7 +366,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { shell.printfln(F("Testing unknown2...")); // simulate getting version information back from an unknown device - rx_telegram({0x09, 0x0B, 0x02, 0x00, 0x5A, 0x01, 0x02}); // product id is 90 which doesn't exist + rx_telegram({0x09, 0x0B, 0x02, 0x00, 0x5A, 0x01, 0x02}); // productID is 90 which doesn't exist } if (command == "gateway") { @@ -351,9 +383,19 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { shell.invoke_command("show mqtt"); } + if (command == "2thermostats") { + shell.printfln(F("Testing multiple thermostats...")); + run_test("2thermostats"); + shell.invoke_command("show"); + shell.invoke_command("show devices"); + } + if (command == "web") { shell.printfln(F("Testing Web...")); + Mqtt::enabled(false); // turn off mqtt + Mqtt::ha_enabled(false); // turn off ha + run_test("boiler"); run_test("thermostat"); @@ -373,10 +415,12 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { shell.println(); Serial.print(COLOR_RESET); - doc.clear(); - JsonObject root = doc.to(); - emsdevice->generate_values_json_web(root); + // JsonObject root = doc.to(); + // emsdevice->generate_values_web(root); + + JsonArray output = doc.to(); + emsdevice->generate_values_web_all(output); Serial.print(COLOR_BRIGHT_MAGENTA); serializeJson(doc, Serial); @@ -453,7 +497,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { } if (command == "ha") { - shell.printfln(F("Testing HA discovery")); + shell.printfln(F("Testing HA mqtt discovery")); Mqtt::ha_enabled(true); // Mqtt::nested_format(1); Mqtt::nested_format(2); @@ -466,25 +510,10 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { shell.invoke_command("call system publish"); shell.invoke_command("show mqtt"); - shell.invoke_command("call boiler fanwork"); - shell.invoke_command("call thermostat seltemp"); // sensor.thermostat_hc1_selected_room_temperature - shell.invoke_command("call thermostat entities"); - shell.invoke_command("call boiler entities"); - } - - if (command == "dv") { - shell.printfln(F("Testing device value rendering")); - - Mqtt::ha_enabled(true); - Mqtt::nested_format(1); - Mqtt::send_response(false); - - run_test("boiler"); - run_test("thermostat"); - - // change a value to null/bogus/dormant - shell.invoke_command("call boiler wwseltemp"); - shell.invoke_command("call system publish"); + // shell.invoke_command("call boiler fanwork"); + // shell.invoke_command("call thermostat seltemp"); // sensor.thermostat_hc1_selected_room_temperature + // shell.invoke_command("call thermostat entities"); + // shell.invoke_command("call boiler entities"); } if (command == "lastcode") { @@ -505,6 +534,67 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { // shell.invoke_command("show"); } + if (command == "dv") { + shell.printfln(F("Testing device value rendering")); + + Mqtt::ha_enabled(true); + Mqtt::nested_format(1); + Mqtt::send_response(false); + + run_test("boiler"); + run_test("thermostat"); + + shell.invoke_command("call boiler wwseltemp"); + shell.invoke_command("call system publish"); + } + + if (command == "dallas") { + shell.printfln(F("Testing adding Dallas sensor")); + Mqtt::ha_enabled(true); + Mqtt::nested_format(1); + // Mqtt::nested_format(0); + + emsesp::EMSESP::dallassensor_.test(); + shell.invoke_command("show"); + shell.invoke_command("call system publish"); + + // rename + EMSESP::dallassensor_.update("01-0203-0405-0607", "testdallas", 2); + shell.invoke_command("show"); + shell.invoke_command("call system publish"); + } + + if (command == "analog") { + shell.printfln(F("Testing adding Analog sensor")); + Mqtt::ha_enabled(true); + // Mqtt::ha_enabled(false); + Mqtt::nested_format(1); + // Mqtt::nested_format(0); + + emsesp::EMSESP::analogsensor_.test(); + shell.invoke_command("show"); + // shell.invoke_command("call system publish"); + // shell.invoke_command("show mqtt"); + + // rename + // bool update(uint8_t id, const std::string & name, int16_t offset, float factor, uint8_t uom, uint8_t type); + EMSESP::analogsensor_.update(36, "analogtest", 2, 0.7, 17, 1); + shell.invoke_command("show"); + // shell.invoke_command("call system publish"); + } + + if (command == "healthcheck") { + uint8_t n = 0; + if (!data.empty()) { + n = Helpers::atoint(data.c_str()); + } + + // n=1 = EMSESP::system_.HEALTHCHECK_NO_BUS + // n=2 = EMSESP::system_.HEALTHCHECK_NO_NETWORK + shell.printfln(F("Testing healthcheck with %d"), n); + EMSESP::system_.healthcheck(n); + } + if (command == "dv2") { shell.printfln(F("Testing device value lost")); @@ -517,6 +607,41 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { shell.invoke_command("call system publish"); } + if (command == "api_values") { + shell.printfln(F("Testing API getting values")); + Mqtt::ha_enabled(false); + Mqtt::nested_format(1); + Mqtt::send_response(false); + // EMSESP::bool_format(BOOL_FORMAT_10); // BOOL_FORMAT_10_STR + EMSESP::system_.bool_format(BOOL_FORMAT_TRUEFALSE); // BOOL_FORMAT_TRUEFALSE_STR + + run_test("boiler"); + run_test("thermostat"); + + AsyncWebServerRequest request; + DynamicJsonDocument doc(2000); + JsonVariant json; + request.method(HTTP_GET); + request.url("/api/boiler/wwcirc"); + EMSESP::webAPIService.webAPIService_get(&request); + request.url("/api/boiler/values"); + EMSESP::webAPIService.webAPIService_get(&request); + } + + if (command == "mqtt_post") { + shell.printfln(F("Testing MQTT incoming changes")); + Mqtt::ha_enabled(false); + Mqtt::nested_format(1); + Mqtt::send_response(false); + EMSESP::system_.bool_format(BOOL_FORMAT_10); // BOOL_FORMAT_10_STR + // EMSESP::bool_format(BOOL_FORMAT_TRUEFALSE); // BOOL_FORMAT_TRUEFALSE_STR + + run_test("boiler"); + run_test("thermostat"); + + EMSESP::mqtt_.incoming("ems-esp/boiler/wwseltemp", "59"); + } + if (command == "api") { shell.printfln(F("Testing API with MQTT and REST, standalone")); @@ -609,10 +734,12 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { /* requestX.url("/api"); // should fail EMSESP::webAPIService.webAPIService_get(&requestX); + */ requestX.method(HTTP_POST); - char dataX[] = "{\"device\":\"thermostat\", \"entity\":\"seltemp\",\"value\":13}"; + /* + char dataX[] = "{\"device\":\"system\", \"entity\":\"settings\"}"; deserializeJson(docX, dataX); jsonX = docX.as(); requestX.url("/api"); @@ -620,6 +747,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { return; */ + /* // char dataX[] = "{\"value\":\"0B 88 19 19 02\"}"; char dataX[] = "{\"name\":\"temp\",\"value\":11}"; @@ -702,6 +830,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { #if defined(EMSESP_STANDALONE) // Web API TESTS AsyncWebServerRequest request; + request.method(HTTP_GET); request.url("/api/thermostat"); // check if defaults to info @@ -727,7 +856,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { JsonVariant json; // 1 - char data1[] = "{\"name\":\"temp\",\"value\":11}"; + char data1[] = "{\"entity\":\"seltemp\",\"value\":11}"; deserializeJson(doc, data1); json = doc.as(); request.url("/api/thermostat"); @@ -737,11 +866,11 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { char data2[] = "{\"value\":12}"; deserializeJson(doc, data2); json = doc.as(); - request.url("/api/thermostat/temp"); + request.url("/api/thermostat/seltemp"); EMSESP::webAPIService.webAPIService_post(&request, json); // 3 - char data3[] = "{\"device\":\"thermostat\", \"name\":\"seltemp\",\"value\":13}"; + char data3[] = "{\"device\":\"thermostat\", \"cmd\":\"seltemp\",\"value\":13}"; deserializeJson(doc, data3); json = doc.as(); request.url("/api"); @@ -1127,8 +1256,8 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { DynamicJsonDocument doc(EMSESP_JSON_SIZE_XXLARGE_DYN); - char key[6]; - char value[6]; + char key[8]; + char value[8]; // fit it up, to its limit of the Json buffer (which is about 169 records) for (uint8_t i = 0; i < 200; i++) { @@ -1170,23 +1299,29 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { char boiler_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; char thermostat_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; char system_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - EMSESP::EMSESP::mqtt_.publish("boiler", "test me"); Mqtt::show_mqtt(shell); // show queue strcpy(boiler_topic, "ems-esp/boiler"); strcpy(thermostat_topic, "ems-esp/thermostat"); strcpy(system_topic, "ems-esp/system"); - EMSESP::mqtt_.incoming(boiler_topic, ""); // test if ignore empty payloads + // test publishing + EMSESP::EMSESP::mqtt_.publish(boiler_topic, "test me"); + + // test receiving + EMSESP::mqtt_.incoming(boiler_topic, ""); // test if ignore empty payloads, should return values EMSESP::mqtt_.incoming(boiler_topic, "12345"); // error: invalid format - EMSESP::mqtt_.incoming("bad_topic", "12345"); // error: no matching topic + EMSESP::mqtt_.incoming("bad_topic", "123456"); // error: no matching topic EMSESP::mqtt_.incoming(boiler_topic, "{\"cmd\":\"garbage\",\"data\":22.52}"); // error: should report error EMSESP::mqtt_.incoming(boiler_topic, "{\"cmd\":\"comfort\",\"data\":\"eco\"}"); EMSESP::mqtt_.incoming(boiler_topic, "{\"cmd\":\"wwactivated\",\"data\":\"1\"}"); // with quotes EMSESP::mqtt_.incoming(boiler_topic, "{\"cmd\":\"wwactivated\",\"data\":1}"); // without quotes - EMSESP::mqtt_.incoming(boiler_topic, "{\"cmd\":\"flowtemp\",\"data\":55}"); + EMSESP::mqtt_.incoming(boiler_topic, "{\"cmd\":\"selflowtemp\",\"data\":55}"); + + // test direct commands + EMSESP::mqtt_.incoming("ems-esp/boiler/selflowtemp", "56"); EMSESP::mqtt_.incoming(system_topic, "{\"cmd\":\"send\",\"data\":\"01 02 03 04 05\"}"); EMSESP::mqtt_.incoming(system_topic, "{\"cmd\":\"pin\",\"id\":12,\"data\":\"1\"}"); diff --git a/src/test/test.h b/src/test/test.h index 1a7a9a7fc..58a2321de 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -30,22 +30,29 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "solar" // #define EMSESP_DEBUG_DEFAULT "mixer" // #define EMSESP_DEBUG_DEFAULT "web" +// #define EMSESP_DEBUG_DEFAULT "mqtt" // #define EMSESP_DEBUG_DEFAULT "general" // #define EMSESP_DEBUG_DEFAULT "boiler" // #define EMSESP_DEBUG_DEFAULT "mqtt2" // #define EMSESP_DEBUG_DEFAULT "mqtt_nested" -// #define EMSESP_DEBUG_DEFAULT "ha" +#define EMSESP_DEBUG_DEFAULT "ha" // #define EMSESP_DEBUG_DEFAULT "board_profile" // #define EMSESP_DEBUG_DEFAULT "shower_alert" // #define EMSESP_DEBUG_DEFAULT "310" // #define EMSESP_DEBUG_DEFAULT "render" -#define EMSESP_DEBUG_DEFAULT "api" +// #define EMSESP_DEBUG_DEFAULT "api" // #define EMSESP_DEBUG_DEFAULT "crash" // #define EMSESP_DEBUG_DEFAULT "dv" +// #define EMSESP_DEBUG_DEFAULT "lastcode" +// #define EMSESP_DEBUG_DEFAULT "2thermostats" +// #define EMSESP_DEBUG_DEFAULT "dallas" +// #define EMSESP_DEBUG_DEFAULT "analog" +// #define EMSESP_DEBUG_DEFAULT "api_values" +// #define EMSESP_DEBUG_DEFAULT "mqtt_post" class Test { public: - static void run_test(uuid::console::Shell & shell, const std::string & command); + static void run_test(uuid::console::Shell & shell, const std::string & command, const std::string & data = ""); static bool run_test(const char * command, int8_t id = 0); static void dummy_mqtt_commands(const char * message); static void rx_telegram(const std::vector & data); diff --git a/src/version.h b/src/version.h index 5987e4f1f..bc9615d0e 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.3.1b1" +#define EMSESP_APP_VERSION "3.4.0b0" diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index d9c2095e4..ab4c0d202 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -24,6 +24,9 @@ using namespace std::placeholders; // for `_1` etc namespace emsesp { +uint32_t WebAPIService::api_count_ = 0; +uint16_t WebAPIService::api_fails_ = 0; + WebAPIService::WebAPIService(AsyncWebServer * server, SecurityManager * securityManager) : _securityManager(securityManager) , _apiHandler("/api", std::bind(&WebAPIService::webAPIService_post, this, _1, _2), 256) { // for POSTS, must use 'Content-Type: application/json' in header @@ -66,6 +69,33 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) { is_admin = settings.notoken_api | AuthenticationPredicates::IS_ADMIN(authentication); }); + // check for query parameters first, the old style from v2 + // api?device={device}&cmd={name}&data={value}&id={hc} + if (request->url() == "/api") { + // get the device + if (request->hasParam(F_(device))) { + input["device"] = request->getParam(F_(device))->value().c_str(); + } + if (request->hasParam(F_(cmd))) { + input["cmd"] = request->getParam(F_(cmd))->value().c_str(); + } + if (request->hasParam(F_(data))) { + input["data"] = request->getParam(F_(data))->value().c_str(); + } + if (request->hasParam(F_(value))) { + input["value"] = request->getParam(F_(value))->value().c_str(); + } + if (request->hasParam(F_(id))) { + input["id"] = Helpers::atoint(request->getParam(F_(id))->value().c_str()); + } + if (request->hasParam(F_(hc))) { + input["hc"] = Helpers::atoint(request->getParam(F_(hc))->value().c_str()); + } + if (request->hasParam(F_(wwc))) { + input["wwc"] = Helpers::atoint(request->getParam(F_(wwc))->value().c_str()); + } + } + // output json buffer PrettyAsyncJsonResponse * response = new PrettyAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXLARGE_DYN); JsonObject output = response->getRoot(); @@ -81,8 +111,9 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) { snprintf(error, sizeof(error), "Call failed with error code (%s)", Command::return_code_string(return_code).c_str()); } emsesp::EMSESP::logger().err(error); + api_fails_++; } else { - emsesp::EMSESP::logger().debug(F("API command called successfully")); + // emsesp::EMSESP::logger().debug(F("API command called successfully")); // if there was no json output from the call, default to the output message 'OK'. if (!output.size()) { output["message"] = "OK"; @@ -96,6 +127,7 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) { response->setLength(); response->setContentType("application/json"); request->send(response); + api_count_++; #if defined(EMSESP_STANDALONE) Serial.print(COLOR_YELLOW); diff --git a/src/web/WebAPIService.h b/src/web/WebAPIService.h index 499061219..799cc82fd 100644 --- a/src/web/WebAPIService.h +++ b/src/web/WebAPIService.h @@ -19,14 +19,6 @@ #ifndef WebAPIService_h #define WebAPIService_h -#include -#include -#include - -#include -#include -#include - #define EMSESP_API_SERVICE_PATH "/api" namespace emsesp { @@ -38,10 +30,21 @@ class WebAPIService { void webAPIService_post(AsyncWebServerRequest * request, JsonVariant & json); // for POSTs void webAPIService_get(AsyncWebServerRequest * request); // for GETs + static uint32_t api_count() { + return api_count_; + } + + static uint16_t api_fails() { + return api_fails_; + } + private: SecurityManager * _securityManager; AsyncCallbackJsonWebHandler _apiHandler; // for POSTs + static uint32_t api_count_; + static uint16_t api_fails_; + void parse(AsyncWebServerRequest * request, JsonObject & input); }; diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp new file mode 100644 index 000000000..0a2498150 --- /dev/null +++ b/src/web/WebCustomizationService.cpp @@ -0,0 +1,272 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "emsesp.h" + +namespace emsesp { + +using namespace std::placeholders; // for `_1` etc + +WebCustomizationService::WebCustomizationService(AsyncWebServer * server, FS * fs, SecurityManager * securityManager) + : _httpEndpoint(WebCustomization::read, + WebCustomization::update, + this, + server, + EMSESP_CUSTOMIZATION_SERVICE_PATH, + securityManager, + AuthenticationPredicates::IS_AUTHENTICATED) + , _fsPersistence(WebCustomization::read, WebCustomization::update, this, fs, EMSESP_CUSTOMIZATION_FILE) + , _exclude_entities_handler(EXCLUDE_ENTITIES_PATH, + securityManager->wrapCallback(std::bind(&WebCustomizationService::exclude_entities, this, _1, _2), + AuthenticationPredicates::IS_AUTHENTICATED)) + , _device_entities_handler(DEVICE_ENTITIES_PATH, + securityManager->wrapCallback(std::bind(&WebCustomizationService::device_entities, this, _1, _2), + AuthenticationPredicates::IS_AUTHENTICATED)) { + server->on(DEVICES_SERVICE_PATH, + HTTP_GET, + securityManager->wrapRequest(std::bind(&WebCustomizationService::devices, this, _1), AuthenticationPredicates::IS_AUTHENTICATED)); + + server->on(RESET_CUSTOMIZATION_SERVICE_PATH, + HTTP_POST, + securityManager->wrapRequest(std::bind(&WebCustomizationService::reset_customization, this, _1), AuthenticationPredicates::IS_ADMIN)); + + _exclude_entities_handler.setMethod(HTTP_POST); + _exclude_entities_handler.setMaxContentLength(256); + server->addHandler(&_exclude_entities_handler); + + _device_entities_handler.setMethod(HTTP_POST); + _device_entities_handler.setMaxContentLength(256); + server->addHandler(&_device_entities_handler); +} + +// this creates the customization file, saving to the FS +void WebCustomization::read(WebCustomization & settings, JsonObject & root) { + // Dallas Sensor customization + JsonArray sensorsJson = root.createNestedArray("sensors"); + for (const SensorCustomization & sensor : settings.sensorCustomizations) { + JsonObject sensorJson = sensorsJson.createNestedObject(); + sensorJson["id_str"] = sensor.id_str; // is + sensorJson["name"] = sensor.name; // n + sensorJson["offset"] = sensor.offset; // o + } + + // Analog Sensor customization + JsonArray analogJson = root.createNestedArray("analogs"); + for (const AnalogCustomization & sensor : settings.analogCustomizations) { + JsonObject sensorJson = analogJson.createNestedObject(); + sensorJson["id"] = sensor.id; // i + sensorJson["name"] = sensor.name; // n + sensorJson["offset"] = sensor.offset; // o + sensorJson["factor"] = sensor.factor; // f + sensorJson["uom"] = sensor.uom; // u + sensorJson["type"] = sensor.type; // t + } + + // Exclude entities customization + JsonArray exclude_entitiesJson = root.createNestedArray("exclude_entities"); + for (const EntityCustomization & entityCustomization : settings.entityCustomizations) { + JsonObject entityJson = exclude_entitiesJson.createNestedObject(); + entityJson["product_id"] = entityCustomization.product_id; + entityJson["device_id"] = entityCustomization.device_id; + + JsonArray exclude_entityJson = entityJson.createNestedArray("entity_ids"); + for (uint8_t entity_id : entityCustomization.entity_ids) { + exclude_entityJson.add(entity_id); + } + } +} + +// call on initialization and also when the page is saved via web +// this loads the data into the internal class +StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & settings) { + // Dallas Sensor customization + settings.sensorCustomizations.clear(); + if (root["sensors"].is()) { + for (const JsonObject sensorJson : root["sensors"].as()) { + // create each of the sensor, overwritting any previous settings + SensorCustomization sensor = SensorCustomization(); + sensor.id_str = sensorJson["id_str"].as(); + sensor.name = sensorJson["name"].as(); + sensor.offset = sensorJson["offset"]; + settings.sensorCustomizations.push_back(sensor); // add to list + } + } + + // Analog Sensor customization + settings.analogCustomizations.clear(); + if (root["analogs"].is()) { + for (const JsonObject analogJson : root["analogs"].as()) { + // create each of the sensor, overwritting any previous settings + AnalogCustomization sensor = AnalogCustomization(); + sensor.id = analogJson["id"]; + sensor.name = analogJson["name"].as(); + sensor.offset = analogJson["offset"]; + sensor.factor = analogJson["factor"]; + sensor.uom = analogJson["uom"]; + sensor.type = analogJson["type"]; + settings.analogCustomizations.push_back(sensor); // add to list + } + } + + // load array of entities id's to exclude, building up the object class + settings.entityCustomizations.clear(); + if (root["exclude_entities"].is()) { + for (const JsonObject exclude_entities : root["exclude_entities"].as()) { + EntityCustomization new_entry = EntityCustomization(); + new_entry.product_id = exclude_entities["product_id"]; + new_entry.device_id = exclude_entities["device_id"]; + + for (const JsonVariant exclude_entity_id : exclude_entities["entity_ids"].as()) { + new_entry.entity_ids.push_back(exclude_entity_id.as()); // add entity list + } + settings.entityCustomizations.push_back(new_entry); // save the new object + } + } + + return StateUpdateResult::CHANGED; +} + +// deletes the customization file +void WebCustomizationService::reset_customization(AsyncWebServerRequest * request) { +#ifndef EMSESP_STANDALONE + if (LITTLEFS.remove(EMSESP_CUSTOMIZATION_FILE)) { + AsyncWebServerResponse * response = request->beginResponse(200); // OK + request->send(response); + EMSESP::system_.restart_requested(true); + return; + } + // failed + AsyncWebServerResponse * response = request->beginResponse(204); // no content error + request->send(response); +#endif +} + +// send back a short list devices used in the customization page +void WebCustomizationService::devices(AsyncWebServerRequest * request) { + AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN); + JsonObject root = response->getRoot(); + + JsonArray devices = root.createNestedArray("devices"); + for (auto & emsdevice : EMSESP::emsdevices) { + if (emsdevice->has_entities()) { + JsonObject obj = devices.createNestedObject(); + obj["i"] = emsdevice->unique_id(); // a unique id + + // shortname - we prefix the count to make it unique + uint8_t device_index = EMSESP::device_index(emsdevice->device_type(), emsdevice->unique_id()); + if (device_index) { + char s[10]; + obj["s"] = emsdevice->device_type_name() + Helpers::smallitoa(s, device_index); + } else { + obj["s"] = emsdevice->device_type_name(); + } + } + } + + response->setLength(); + request->send(response); +} + +// send back list device entities +void WebCustomizationService::device_entities(AsyncWebServerRequest * request, JsonVariant & json) { + if (json.is()) { + MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(true, EMSESP_JSON_SIZE_XXLARGE_DYN); + for (const auto & emsdevice : EMSESP::emsdevices) { + if (emsdevice) { + if (emsdevice->unique_id() == json["id"]) { +#ifndef EMSESP_STANDALONE + JsonArray output = response->getRoot(); + emsdevice->generate_values_web_all(output); +#endif + response->setLength(); + request->send(response); + return; + } + } + } + } + + // invalid, but send OK anyway + AsyncWebServerResponse * response = request->beginResponse(200); + request->send(response); +} + +// takes a list of excluded ids send from the webUI +// saves it in the customization service +// and updates the entity list real-time +void WebCustomizationService::exclude_entities(AsyncWebServerRequest * request, JsonVariant & json) { + if (json.is()) { + // find the device using the unique_id + for (const auto & emsdevice : EMSESP::emsdevices) { + if (emsdevice) { + uint8_t unique_device_id = json["id"]; + if (emsdevice->unique_id() == unique_device_id) { + JsonArray entity_ids = json["entity_ids"]; + + std::vector temp; + for (JsonVariant id : entity_ids) { + uint8_t entity_id = id.as(); + emsdevice->exclude_entity(entity_id); // this will have immediate affect + temp.push_back(entity_id); + } + + // Save the list to the customization file + uint8_t product_id = emsdevice->product_id(); + uint8_t device_id = emsdevice->device_id(); + + EMSESP::webCustomizationService.update( + [&](WebCustomization & settings) { + // if it exists (productid and deviceid match) overwrite it + for (auto & entityCustomization : settings.entityCustomizations) { + if ((entityCustomization.product_id == product_id) && (entityCustomization.device_id == device_id)) { + // already exists, clear the list and add the new values + entityCustomization.entity_ids.clear(); + for (uint8_t i = 0; i < temp.size(); i++) { + entityCustomization.entity_ids.push_back(temp[i]); + } + return StateUpdateResult::CHANGED; + } + } + // create a new entry in the list + EntityCustomization new_entry; + new_entry.product_id = product_id; + new_entry.device_id = device_id; + for (uint8_t i = 0; i < temp.size(); i++) { + new_entry.entity_ids.push_back(temp[i]); + } + settings.entityCustomizations.push_back(new_entry); + return StateUpdateResult::CHANGED; + }, + "local"); + + break; + } + } + } + } + + AsyncWebServerResponse * response = request->beginResponse(200); // OK + request->send(response); +} + +// load the settings when the service starts +void WebCustomizationService::begin() { + _fsPersistence.readFromFS(); +} + +} // namespace emsesp diff --git a/src/web/WebCustomizationService.h b/src/web/WebCustomizationService.h new file mode 100644 index 000000000..5371e74bb --- /dev/null +++ b/src/web/WebCustomizationService.h @@ -0,0 +1,106 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef WebCustomizationService_h +#define WebCustomizationService_h + +#define EMSESP_CUSTOMIZATION_FILE "/config/emsespCustomization.json" + +// GET +#define DEVICES_SERVICE_PATH "/rest/devices" +#define EMSESP_CUSTOMIZATION_SERVICE_PATH "/rest/customization" + +// POST +#define DEVICE_ENTITIES_PATH "/rest/deviceEntities" +#define EXCLUDE_ENTITIES_PATH "/rest/excludeEntities" +#define RESET_CUSTOMIZATION_SERVICE_PATH "/rest/resetCustomizations" + +namespace emsesp { + +// Customization for dallas sensor +class SensorCustomization { + public: + std::string id_str; + std::string name; + uint16_t offset; +}; + +class AnalogCustomization { + public: + uint8_t id; + std::string name; + uint16_t offset; + float factor; + uint8_t uom; // 0 is none + int8_t type; // -1 is for deletion + + // used for removing from a list + bool operator==(const AnalogCustomization & a) const { + return id == a.id; + } + bool operator!=(const AnalogCustomization & a) const { + return !operator==(a); + } +}; + +// we use product_id and device_id to make the device unique +class EntityCustomization { + public: + uint8_t product_id; // device's product id + uint8_t device_id; // device's device id + std::vector entity_ids; // array of entity ids to exclude +}; + +class WebCustomization { + public: + std::list sensorCustomizations; // for sensor names and offsets + std::list analogCustomizations; // for analog sensors + std::list entityCustomizations; // for a list of entities that should be excluded from the device list + + static void read(WebCustomization & settings, JsonObject & root); + static StateUpdateResult update(JsonObject & root, WebCustomization & settings); +}; + +class WebCustomizationService : public StatefulService { + public: + WebCustomizationService(AsyncWebServer * server, FS * fs, SecurityManager * securityManager); + + void begin(); + +// make all functions public so we can test in the debug and standalone mode +#ifndef EMSESP_STANDALONE + private: +#endif + + HttpEndpoint _httpEndpoint; + FSPersistence _fsPersistence; + + // GET + void devices(AsyncWebServerRequest * request); + + // POST + void exclude_entities(AsyncWebServerRequest * request, JsonVariant & json); + void device_entities(AsyncWebServerRequest * request, JsonVariant & json); + void reset_customization(AsyncWebServerRequest * request); + + AsyncCallbackJsonWebHandler _exclude_entities_handler, _device_entities_handler; +}; + +} // namespace emsesp + +#endif \ No newline at end of file diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index f906c0e33..c2efaffef 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -23,69 +23,131 @@ namespace emsesp { using namespace std::placeholders; // for `_1` etc WebDataService::WebDataService(AsyncWebServer * server, SecurityManager * securityManager) - : _device_dataHandler(DEVICE_DATA_SERVICE_PATH, - securityManager->wrapCallback(std::bind(&WebDataService::device_data, this, _1, _2), AuthenticationPredicates::IS_AUTHENTICATED)) - , _writevalue_dataHandler(WRITE_VALUE_SERVICE_PATH, - securityManager->wrapCallback(std::bind(&WebDataService::write_value, this, _1, _2), AuthenticationPredicates::IS_ADMIN)) - , _writesensor_dataHandler(WRITE_SENSOR_SERVICE_PATH, - securityManager->wrapCallback(std::bind(&WebDataService::write_sensor, this, _1, _2), AuthenticationPredicates::IS_ADMIN)) { - server->on(EMSESP_DATA_SERVICE_PATH, + : _device_data_handler(DEVICE_DATA_SERVICE_PATH, + securityManager->wrapCallback(std::bind(&WebDataService::device_data, this, _1, _2), AuthenticationPredicates::IS_AUTHENTICATED)) + , _write_value_handler(WRITE_VALUE_SERVICE_PATH, + securityManager->wrapCallback(std::bind(&WebDataService::write_value, this, _1, _2), AuthenticationPredicates::IS_ADMIN)) + , _write_sensor_handler(WRITE_SENSOR_SERVICE_PATH, + securityManager->wrapCallback(std::bind(&WebDataService::write_sensor, this, _1, _2), AuthenticationPredicates::IS_ADMIN)) + , _write_analog_handler(WRITE_ANALOG_SERVICE_PATH, + securityManager->wrapCallback(std::bind(&WebDataService::write_analog, this, _1, _2), AuthenticationPredicates::IS_ADMIN)) { + server->on(CORE_DATA_SERVICE_PATH, HTTP_GET, - securityManager->wrapRequest(std::bind(&WebDataService::all_devices, this, _1), AuthenticationPredicates::IS_AUTHENTICATED)); + securityManager->wrapRequest(std::bind(&WebDataService::core_data, this, _1), AuthenticationPredicates::IS_AUTHENTICATED)); + + server->on(SENSOR_DATA_SERVICE_PATH, + HTTP_GET, + securityManager->wrapRequest(std::bind(&WebDataService::sensor_data, this, _1), AuthenticationPredicates::IS_AUTHENTICATED)); + server->on(SCAN_DEVICES_SERVICE_PATH, - HTTP_GET, - securityManager->wrapRequest(std::bind(&WebDataService::scan_devices, this, _1), AuthenticationPredicates::IS_AUTHENTICATED)); + HTTP_POST, + securityManager->wrapRequest(std::bind(&WebDataService::scan_devices, this, _1), AuthenticationPredicates::IS_ADMIN)); - _device_dataHandler.setMethod(HTTP_POST); - _device_dataHandler.setMaxContentLength(256); - server->addHandler(&_device_dataHandler); + _device_data_handler.setMethod(HTTP_POST); + _device_data_handler.setMaxContentLength(256); + server->addHandler(&_device_data_handler); - _writevalue_dataHandler.setMethod(HTTP_POST); - _writevalue_dataHandler.setMaxContentLength(256); - server->addHandler(&_writevalue_dataHandler); + _write_value_handler.setMethod(HTTP_POST); + _write_value_handler.setMaxContentLength(256); + server->addHandler(&_write_value_handler); - _writesensor_dataHandler.setMethod(HTTP_POST); - _writesensor_dataHandler.setMaxContentLength(256); - server->addHandler(&_writesensor_dataHandler); + _write_sensor_handler.setMethod(HTTP_POST); + _write_sensor_handler.setMaxContentLength(256); + server->addHandler(&_write_sensor_handler); + + _write_analog_handler.setMethod(HTTP_POST); + _write_analog_handler.setMaxContentLength(256); + server->addHandler(&_write_analog_handler); } +// scan devices service void WebDataService::scan_devices(AsyncWebServerRequest * request) { + EMSESP::logger().info(F("Scanning devices...")); EMSESP::scan_devices(); request->send(200); } -void WebDataService::all_devices(AsyncWebServerRequest * request) { +// this is used in the dashboard and contains all ems device information +// /coreData endpoint +void WebDataService::core_data(AsyncWebServerRequest * request) { AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); JsonObject root = response->getRoot(); + // list is already sorted by device type + // Ignore Contoller JsonArray devices = root.createNestedArray("devices"); - for (const auto & emsdevice : EMSESP::emsdevices) { - if (emsdevice) { + for (auto & emsdevice : EMSESP::emsdevices) { + if (emsdevice && emsdevice->device_type() != EMSdevice::DeviceType::CONTROLLER) { JsonObject obj = devices.createNestedObject(); - obj["i"] = emsdevice->unique_id(); // id + obj["i"] = emsdevice->unique_id(); // a unique id obj["t"] = emsdevice->device_type_name(); // type obj["b"] = emsdevice->brand_to_string(); // brand obj["n"] = emsdevice->name(); // name obj["d"] = emsdevice->device_id(); // deviceid obj["p"] = emsdevice->product_id(); // productid obj["v"] = emsdevice->version(); // version + obj["e"] = emsdevice->count_entities(); // number of entities (device values) } } + // sensors stuff + root["active_sensors"] = EMSESP::dallassensor_.no_sensors() + (EMSESP::analogsensor_.analog_enabled() ? EMSESP::analogsensor_.no_sensors() : 0); + root["analog_enabled"] = EMSESP::analogsensor_.analog_enabled(); + + response->setLength(); + request->send(response); +} + +// sensor data - sends back to web +// /sensorData endpoint +// the "sensors" and "analogs" are arrays and must exist +void WebDataService::sensor_data(AsyncWebServerRequest * request) { + AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); + JsonObject root = response->getRoot(); + + // dallas sensors JsonArray sensors = root.createNestedArray("sensors"); - if (EMSESP::have_sensors()) { - uint8_t i = 1; - for (const auto & sensor : EMSESP::sensor_devices()) { + if (EMSESP::dallassensor_.have_sensors()) { + for (const auto & sensor : EMSESP::dallassensor_.sensors()) { JsonObject obj = sensors.createNestedObject(); - obj["n"] = i++; // no - obj["i"] = sensor.to_string(true); // id - obj["t"] = (float)(sensor.temperature_c) / 10; // temp - obj["o"] = (float)(sensor.offset()) / 10; // offset + obj["is"] = sensor.id_str(); // id + obj["n"] = sensor.name(); // name + if (EMSESP::system_.fahrenheit()) { + if (Helpers::hasValue(sensor.temperature_c)) { + obj["t"] = (float)sensor.temperature_c * 0.18 + 32; + } + obj["u"] = DeviceValueUOM::FAHRENHEIT; + obj["o"] = (float)sensor.offset() * 0.18; + } else { + if (Helpers::hasValue(sensor.temperature_c)) { + obj["t"] = (float)sensor.temperature_c / 10; + } + obj["u"] = DeviceValueUOM::DEGREES; + obj["o"] = (float)(sensor.offset()) / 10; + } } } - if (EMSESP::system_.analog_enabled()) { - root["analog"] = EMSESP::system_.analog(); + // analog sensors + // assume list is already sorted by id + JsonArray analogs = root.createNestedArray("analogs"); + if (EMSESP::analog_enabled() && EMSESP::analogsensor_.have_sensors()) { + for (const auto & sensor : EMSESP::analogsensor_.sensors()) { + // don't send if it's marked for removal + if (sensor.type() != AnalogSensor::AnalogType::MARK_DELETED) { + JsonObject obj = analogs.createNestedObject(); + obj["i"] = sensor.id(); + obj["n"] = sensor.name(); + obj["u"] = sensor.uom(); + obj["o"] = sensor.offset(); + obj["f"] = sensor.factor(); + obj["t"] = sensor.type(); + + if (sensor.type() != AnalogSensor::AnalogType::NOTUSED) { + obj["v"] = Helpers::round2(sensor.value(), 1); // is optional and is a float + } + } + } } response->setLength(); @@ -96,7 +158,7 @@ void WebDataService::all_devices(AsyncWebServerRequest * request) { // Compresses the JSON using MsgPack https://msgpack.org/index.html void WebDataService::device_data(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { - MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXLARGE_DYN); + MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXXLARGE_DYN); for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice) { if (emsdevice->unique_id() == json["id"]) { @@ -106,8 +168,8 @@ void WebDataService::device_data(AsyncWebServerRequest * request, JsonVariant & } EMSESP::wait_validate(0); // reset in case of timeout #ifndef EMSESP_STANDALONE - JsonObject root = response->getRoot(); - emsdevice->generate_values_json_web(root); + JsonObject output = response->getRoot(); + emsdevice->generate_values_web(output); #endif response->setLength(); request->send(response); @@ -117,12 +179,13 @@ void WebDataService::device_data(AsyncWebServerRequest * request, JsonVariant & } } - // invalid + // invalid but send ok AsyncWebServerResponse * response = request->beginResponse(200); request->send(response); } -// takes a command and its data value from a specific Device, from the Web + +// takes a command and its data value from a specific EMS Device, from the Web // assumes the service has been checked for admin authentication void WebDataService::write_value(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { @@ -180,23 +243,42 @@ void WebDataService::write_value(AsyncWebServerRequest * request, JsonVariant & request->send(response); } -// takes a sensorname and optional offset from the Web +// takes a dallas sensor name and optional offset from the WebUI and update the customization settings +// via the Dallas service void WebDataService::write_sensor(AsyncWebServerRequest * request, JsonVariant & json) { bool ok = false; if (json.is()) { - JsonObject sensor = json["sensor"]; + JsonObject sensor = json; - // if valid add. - uint8_t no = sensor["no"]; - if (no > 0 && no < 100) { - char name[20]; - std::string id = sensor["id"]; - strlcpy(name, id.c_str(), sizeof(name)); - float offset = sensor["offset"]; // this will be a float value. We'll convert it to int and * 10 it - int16_t offset10 = offset * 10; - char idstr[3]; - ok = EMSESP::dallassensor_.update(Helpers::itoa(idstr, no, 10), name, offset10); + std::string id_str = sensor["id_str"]; // this is the key + std::string name = sensor["name"]; + + // calculate offset. We'll convert it to an int and * 10 + float offset = sensor["offset"]; + int16_t offset10 = offset * 10; + if (EMSESP::system_.fahrenheit()) { + offset10 = offset / 0.18; } + ok = EMSESP::dallassensor_.update(id_str, name, offset10); + } + + AsyncWebServerResponse * response = request->beginResponse(ok ? 200 : 204); + request->send(response); +} + +// update the analog record, or create a new one +void WebDataService::write_analog(AsyncWebServerRequest * request, JsonVariant & json) { + bool ok = false; + if (json.is()) { + JsonObject analog = json; + + uint8_t id = analog["id"]; // this is the unique key + std::string name = analog["name"]; + float factor = analog["factor"]; + int16_t offset = analog["offset"]; + uint8_t uom = analog["uom"]; + int8_t type = analog["type"]; + ok = EMSESP::analogsensor_.update(id, name, offset, factor, uom, type); } AsyncWebServerResponse * response = request->beginResponse(ok ? 200 : 204); diff --git a/src/web/WebDataService.h b/src/web/WebDataService.h index 31b3673e7..54f487121 100644 --- a/src/web/WebDataService.h +++ b/src/web/WebDataService.h @@ -19,16 +19,16 @@ #ifndef WebDataService_h #define WebDataService_h -#include -#include -#include -#include - -#define EMSESP_DATA_SERVICE_PATH "/rest/data" +// GET +#define CORE_DATA_SERVICE_PATH "/rest/coreData" #define SCAN_DEVICES_SERVICE_PATH "/rest/scanDevices" #define DEVICE_DATA_SERVICE_PATH "/rest/deviceData" +#define SENSOR_DATA_SERVICE_PATH "/rest/sensorData" + +// POST #define WRITE_VALUE_SERVICE_PATH "/rest/writeValue" #define WRITE_SENSOR_SERVICE_PATH "/rest/writeSensor" +#define WRITE_ANALOG_SERVICE_PATH "/rest/writeAnalog" namespace emsesp { @@ -42,15 +42,17 @@ class WebDataService { #endif // GET - void all_devices(AsyncWebServerRequest * request); - void scan_devices(AsyncWebServerRequest * request); + void core_data(AsyncWebServerRequest * request); + void sensor_data(AsyncWebServerRequest * request); // POST void device_data(AsyncWebServerRequest * request, JsonVariant & json); void write_value(AsyncWebServerRequest * request, JsonVariant & json); void write_sensor(AsyncWebServerRequest * request, JsonVariant & json); + void write_analog(AsyncWebServerRequest * request, JsonVariant & json); + void scan_devices(AsyncWebServerRequest * request); - AsyncCallbackJsonWebHandler _device_dataHandler, _writevalue_dataHandler, _writesensor_dataHandler; + AsyncCallbackJsonWebHandler _device_data_handler, _write_value_handler, _write_sensor_handler, _write_analog_handler; }; } // namespace emsesp diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 406cf3b1f..18c25b03e 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -27,6 +27,7 @@ WebLogService::WebLogService(AsyncWebServer * server, SecurityManager * security , setValues_(LOG_SETTINGS_PATH, std::bind(&WebLogService::setValues, this, _1, _2), 256) { // for POSTS events_.setFilter(securityManager->filterRequest(AuthenticationPredicates::IS_ADMIN)); + server->addHandler(&events_); server->on(EVENT_SOURCE_LOG_PATH, HTTP_GET, std::bind(&WebLogService::forbidden, this, _1)); @@ -104,6 +105,14 @@ WebLogService::QueuedLogMessage::QueuedLogMessage(unsigned long id, std::shared_ } void WebLogService::operator<<(std::shared_ptr message) { + /* + // special case for trace, show trace and notice messages only + // added by mvdp + if (log_level() == uuid::log::Level::TRACE && message->level != uuid::log::Level::TRACE && message->level != uuid::log::Level::NOTICE) { + return; + } + */ + if (log_messages_.size() >= maximum_log_messages_) { log_messages_.pop_front(); } @@ -184,7 +193,7 @@ void WebLogService::transmit(const QueuedLogMessage & message) { // send the complete log buffer to the API, not filtering on log level void WebLogService::fetchLog(AsyncWebServerRequest * request) { - MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXLARGE_DYN); // 16kb buffer + MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN + 192 * log_messages_.size()); JsonObject root = response->getRoot(); JsonArray log = root.createNestedArray("events"); diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index 1f9e52eae..0686f6e42 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -19,13 +19,6 @@ #ifndef WebLogService_h #define WebLogService_h -#include -#include -#include -#include - -#include - #define EVENT_SOURCE_LOG_PATH "/es/log" #define FETCH_LOG_PATH "/rest/fetchLog" #define LOG_SETTINGS_PATH "/rest/logSettings" diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index e8b4e4d10..e20cf12be 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -50,63 +50,49 @@ void WebSettings::read(WebSettings & settings, JsonObject & root) { root["shower_alert"] = settings.shower_alert; root["rx_gpio"] = settings.rx_gpio; root["tx_gpio"] = settings.tx_gpio; - root["phy_type"] = settings.phy_type; root["dallas_gpio"] = settings.dallas_gpio; root["dallas_parasite"] = settings.dallas_parasite; root["led_gpio"] = settings.led_gpio; root["hide_led"] = settings.hide_led; root["low_clock"] = settings.low_clock; + root["telnet_enabled"] = settings.telnet_enabled; root["notoken_api"] = settings.notoken_api; + root["readonly_mode"] = settings.readonly_mode; root["analog_enabled"] = settings.analog_enabled; root["pbutton_gpio"] = settings.pbutton_gpio; root["solar_maxflow"] = settings.solar_maxflow; root["board_profile"] = settings.board_profile; - root["dallas_format"] = settings.dallas_format; + root["fahrenheit"] = settings.fahrenheit; root["bool_format"] = settings.bool_format; root["enum_format"] = settings.enum_format; root["weblog_level"] = settings.weblog_level; root["weblog_buffer"] = settings.weblog_buffer; root["weblog_compact"] = settings.weblog_compact; - - for (uint8_t i = 0; i < MAX_NUM_SENSOR_NAMES; i++) { - char buf[20]; - snprintf(buf, sizeof(buf), "sensor_id%d", i); - root[buf] = settings.sensor[i].id; - snprintf(buf, sizeof(buf), "sensor_name%d", i); - root[buf] = settings.sensor[i].name; - snprintf(buf, sizeof(buf), "sensor_offset%d", i); - root[buf] = settings.sensor[i].offset; - } + root["phy_type"] = settings.phy_type; + root["eth_power"] = settings.eth_power; + root["eth_phy_addr"] = settings.eth_phy_addr; + root["eth_clock_mode"] = settings.eth_clock_mode; } // call on initialization and also when settings are updated via web or console StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) { // load default GPIO configuration based on board profile - std::vector data; // led, dallas, rx, tx, button, phy_type + std::vector data; // // led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode - String old_board_profile = settings.board_profile; - settings.board_profile = root["board_profile"] | EMSESP_DEFAULT_BOARD_PROFILE; + settings.board_profile = root["board_profile"] | EMSESP_DEFAULT_BOARD_PROFILE; if (!System::load_board_profile(data, settings.board_profile.c_str())) { settings.board_profile = EMSESP_DEFAULT_BOARD_PROFILE; // invalid board configuration, override the default in case it has been misspelled } - uint8_t default_led_gpio = data[0]; - uint8_t default_dallas_gpio = data[1]; - uint8_t default_rx_gpio = data[2]; - uint8_t default_tx_gpio = data[3]; - uint8_t default_pbutton_gpio = data[4]; - uint8_t default_phy_type = data[5]; - - if (old_board_profile != settings.board_profile) { - EMSESP::logger().info(F("EMS-ESP version %s"), EMSESP_APP_VERSION); - - // check to see if we have a settings file, if not it's a fresh install - if (!root.size()) { - EMSESP::logger().info(F("Initializing configuration with board profile %s"), settings.board_profile.c_str()); - } else { - EMSESP::logger().info(F("Using configuration from board profile %s"), settings.board_profile.c_str()); - } - } + uint8_t default_led_gpio = data[0]; + uint8_t default_dallas_gpio = data[1]; + uint8_t default_rx_gpio = data[2]; + uint8_t default_tx_gpio = data[3]; + uint8_t default_pbutton_gpio = data[4]; + uint8_t default_phy_type = data[5]; + uint8_t default_eth_power = data[6]; + uint8_t default_eth_phy_addr = data[7]; + uint8_t default_eth_clock_mode = data[8]; int prev; reset_flags(); @@ -135,6 +121,10 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) settings.syslog_mark_interval = root["syslog_mark_interval"] | EMSESP_DEFAULT_SYSLOG_MARK_INTERVAL; check_flag(prev, settings.syslog_mark_interval, ChangeFlags::SYSLOG); + prev = settings.syslog_port; + settings.syslog_port = root["syslog_port"] | EMSESP_DEFAULT_SYSLOG_PORT; + check_flag(prev, settings.syslog_port, ChangeFlags::SYSLOG); + #ifndef EMSESP_STANDALONE String old_syslog_host = settings.syslog_host; settings.syslog_host = root["syslog_host"] | EMSESP_DEFAULT_SYSLOG_HOST; @@ -143,15 +133,6 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) } #endif - prev = settings.syslog_port; - settings.syslog_port = root["syslog_port"] | EMSESP_DEFAULT_SYSLOG_PORT; - check_flag(prev, settings.syslog_port, ChangeFlags::SYSLOG); - - // adc - prev = settings.analog_enabled; - settings.analog_enabled = root["analog_enabled"] | EMSESP_DEFAULT_ANALOG_ENABLED; - check_flag(prev, settings.analog_enabled, ChangeFlags::ADC); - // button prev = settings.pbutton_gpio; settings.pbutton_gpio = root["pbutton_gpio"] | default_pbutton_gpio; @@ -181,15 +162,48 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) settings.hide_led = root["hide_led"] | EMSESP_DEFAULT_HIDE_LED; check_flag(prev, settings.hide_led, ChangeFlags::LED); - // - // next ones are settings that don't need any follow-up actions - // + // adc + prev = settings.analog_enabled; + settings.analog_enabled = root["analog_enabled"] | EMSESP_DEFAULT_ANALOG_ENABLED; + check_flag(prev, settings.analog_enabled, ChangeFlags::ADC); - // these need reboots to be applied - settings.ems_bus_id = root["ems_bus_id"] | EMSESP_DEFAULT_EMS_BUS_ID; + // + // these need reboots to be applied... + // + prev = settings.telnet_enabled; + settings.telnet_enabled = root["telnet_enabled"] | EMSESP_DEFAULT_TELNET_ENABLED; + check_flag(prev, settings.telnet_enabled, ChangeFlags::RESTART); + + prev = settings.ems_bus_id; + settings.ems_bus_id = root["ems_bus_id"] | EMSESP_DEFAULT_EMS_BUS_ID; + check_flag(prev, settings.ems_bus_id, ChangeFlags::RESTART); + + prev = settings.low_clock; + settings.low_clock = root["low_clock"] | false; + check_flag(prev, settings.low_clock, ChangeFlags::RESTART); + + prev = settings.master_thermostat; settings.master_thermostat = root["master_thermostat"] | EMSESP_DEFAULT_MASTER_THERMOSTAT; - settings.low_clock = root["low_clock"] | false; - settings.phy_type = root["phy_type"] | default_phy_type; // use whatever came from the board profile + check_flag(prev, settings.master_thermostat, ChangeFlags::RESTART); + + // use whatever came from the board profile + prev = settings.phy_type; + settings.phy_type = root["phy_type"] | default_phy_type; + check_flag(prev, settings.phy_type, ChangeFlags::RESTART); + + prev = settings.eth_power; + settings.eth_power = root["eth_power"] | default_eth_power; + check_flag(prev, settings.eth_power, ChangeFlags::RESTART); + + prev = settings.eth_phy_addr; + settings.eth_phy_addr = root["eth_phy_addr"] | default_eth_phy_addr; + check_flag(prev, settings.eth_phy_addr, ChangeFlags::RESTART); + + prev = settings.eth_clock_mode; + settings.eth_clock_mode = root["eth_clock_mode"] | default_eth_clock_mode; + check_flag(prev, settings.eth_clock_mode, ChangeFlags::RESTART); + + // without checks... settings.trace_raw = root["trace_raw"] | EMSESP_DEFAULT_TRACELOG_RAW; EMSESP::trace_raw(settings.trace_raw); @@ -197,27 +211,25 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) settings.notoken_api = root["notoken_api"] | EMSESP_DEFAULT_NOTOKEN_API; settings.solar_maxflow = root["solar_maxflow"] | EMSESP_DEFAULT_SOLAR_MAXFLOW; - settings.dallas_format = root["dallas_format"] | EMSESP_DEFAULT_DALLAS_FORMAT; - EMSESP::dallassensor_.dallas_format(settings.dallas_format); + settings.fahrenheit = root["fahrenheit"] | false; + EMSESP::system_.fahrenheit(settings.fahrenheit); + + settings.readonly_mode = root["readonly_mode"] | false; + EMSESP::system_.readonly_mode(settings.readonly_mode); settings.bool_format = root["bool_format"] | EMSESP_DEFAULT_BOOL_FORMAT; - EMSESP::bool_format(settings.bool_format); + EMSESP::system_.bool_format(settings.bool_format); settings.enum_format = root["enum_format"] | EMSESP_DEFAULT_ENUM_FORMAT; - EMSESP::enum_format(settings.enum_format); + EMSESP::system_.enum_format(settings.enum_format); settings.weblog_level = root["weblog_level"] | EMSESP_DEFAULT_WEBLOG_LEVEL; settings.weblog_buffer = root["weblog_buffer"] | EMSESP_DEFAULT_WEBLOG_BUFFER; settings.weblog_compact = root["weblog_compact"] | EMSESP_DEFAULT_WEBLOG_COMPACT; - for (uint8_t i = 0; i < MAX_NUM_SENSOR_NAMES; i++) { - char buf[20]; - snprintf(buf, sizeof(buf), "sensor_id%d", i); - settings.sensor[i].id = root[buf] | EMSESP_DEFAULT_SENSOR_NAME; - snprintf(buf, sizeof(buf), "sensor_name%d", i); - settings.sensor[i].name = root[buf] | EMSESP_DEFAULT_SENSOR_NAME; - snprintf(buf, sizeof(buf), "sensor_offset%d", i); - settings.sensor[i].offset = root[buf] | 0; + // save the settings + if (flags_ == WebSettings::ChangeFlags::RESTART) { + return StateUpdateResult::CHANGED_RESTART; // tell WebUI that a restart is needed } return StateUpdateResult::CHANGED; @@ -243,7 +255,7 @@ void WebSettingsService::onUpdate() { } if (WebSettings::has_flags(WebSettings::ChangeFlags::ADC)) { - EMSESP::system_.adc_init(true); // reload settings + EMSESP::analogsensor_.start(); } if (WebSettings::has_flags(WebSettings::ChangeFlags::BUTTON)) { @@ -270,22 +282,20 @@ void WebSettingsService::board_profile(AsyncWebServerRequest * request, JsonVari if (json.is()) { AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_MEDIUM); JsonObject root = response->getRoot(); - if (json.containsKey("code")) { - String board_profile = json["code"]; - std::vector data; // led, dallas, rx, tx, button - // check for valid board - if (System::load_board_profile(data, board_profile.c_str())) { - root["led_gpio"] = data[0]; - root["dallas_gpio"] = data[1]; - root["rx_gpio"] = data[2]; - root["tx_gpio"] = data[3]; - root["pbutton_gpio"] = data[4]; - root["phy_type"] = data[5]; - } else { - AsyncWebServerResponse * response = request->beginResponse(200); - request->send(response); - return; - } + + if (json.containsKey("board_profile")) { + String board_profile = json["board_profile"]; + std::vector data; // led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode + (void)System::load_board_profile(data, board_profile.c_str()); + root["led_gpio"] = data[0]; + root["dallas_gpio"] = data[1]; + root["rx_gpio"] = data[2]; + root["tx_gpio"] = data[3]; + root["pbutton_gpio"] = data[4]; + root["phy_type"] = data[5]; + root["eth_power"] = data[6]; + root["eth_phy_addr"] = data[7]; + root["eth_clock_mode"] = data[8]; response->setLength(); request->send(response); diff --git a/src/web/WebSettingsService.h b/src/web/WebSettingsService.h index 16d08b866..5ff6ef1c9 100644 --- a/src/web/WebSettingsService.h +++ b/src/web/WebSettingsService.h @@ -16,25 +16,17 @@ * along with this program. If not, see . */ -#ifndef WebSettingsConfig_h -#define WebSettingsConfig_h - -#include -#include +#ifndef WebSettingsService_h +#define WebSettingsService_h #include "../default_settings.h" #define EMSESP_SETTINGS_FILE "/config/emsespSettings.json" -#define EMSESP_SETTINGS_SERVICE_PATH "/rest/emsespSettings" +#define EMSESP_SETTINGS_SERVICE_PATH "/rest/settings" #define EMSESP_BOARD_PROFILE_SERVICE_PATH "/rest/boardProfile" -#define MAX_NUM_SENSOR_NAMES 20 - namespace emsesp { -enum { BOOL_FORMAT_ONOFF = 1, BOOL_FORMAT_ONOFF_CAP, BOOL_FORMAT_TRUEFALSE, BOOL_FORMAT_10 }; // matches Web UI settings -enum { ENUM_FORMAT_TEXT = 1, ENUM_FORMAT_NUMBER }; // matches Web UI settings - class WebSettings { public: uint8_t tx_mode; @@ -55,38 +47,39 @@ class WebSettings { uint8_t led_gpio; bool hide_led; bool low_clock; + bool telnet_enabled; bool notoken_api; + bool readonly_mode; bool analog_enabled; uint8_t pbutton_gpio; uint8_t solar_maxflow; String board_profile; - uint8_t phy_type; - uint8_t dallas_format; uint8_t bool_format; uint8_t enum_format; int8_t weblog_level; uint8_t weblog_buffer; bool weblog_compact; + bool fahrenheit; - struct { - String id; - String name; - int16_t offset; - } sensor[MAX_NUM_SENSOR_NAMES]; + uint8_t phy_type; + int8_t eth_power; // -1 means disabled + uint8_t eth_phy_addr; + uint8_t eth_clock_mode; static void read(WebSettings & settings, JsonObject & root); static StateUpdateResult update(JsonObject & root, WebSettings & settings); enum ChangeFlags : uint8_t { - NONE = 0, - UART = (1 << 0), // 1 - SYSLOG = (1 << 1), // 2 - ADC = (1 << 2), // 4 - DALLAS = (1 << 3), // 8 - SHOWER = (1 << 4), // 16 - LED = (1 << 5), // 32 - BUTTON = (1 << 6) // 64 + NONE = 0, + UART = (1 << 0), // 1 + SYSLOG = (1 << 1), // 2 + ADC = (1 << 2), // 4 - analog + DALLAS = (1 << 3), // 8 + SHOWER = (1 << 4), // 16 + LED = (1 << 5), // 32 + BUTTON = (1 << 6), // 64 + RESTART = 0xFF }; diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 08be35f5c..114fcaa97 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -34,13 +34,13 @@ WebStatusService::WebStatusService(AsyncWebServer * server, SecurityManager * se void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { switch (event) { case SYSTEM_EVENT_STA_DISCONNECTED: - EMSESP::logger().info(F("WiFi Disconnected. Reason code=%d"), info.disconnected.reason); + EMSESP::logger().info(F("WiFi disconnected. Reason code=%d"), info.disconnected.reason); WiFi.disconnect(true); break; case SYSTEM_EVENT_STA_GOT_IP: #ifndef EMSESP_STANDALONE - EMSESP::logger().info(F("WiFi Connected with IP=%s, hostname=%s"), WiFi.localIP().toString().c_str(), WiFi.getHostname()); + EMSESP::logger().info(F("WiFi connected with IP=%s, hostname=%s"), WiFi.localIP().toString().c_str(), WiFi.getHostname()); #endif EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { if (!networkSettings.enableIPv6) { @@ -52,7 +52,7 @@ void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { break; case SYSTEM_EVENT_ETH_START: - EMSESP::logger().info(F("Ethernet initialized")); + // EMSESP::logger().info(F("Ethernet initialized")); ETH.setHostname(EMSESP::system_.hostname().c_str()); // configure for static IP @@ -68,7 +68,7 @@ void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { // prevent double calls if (!EMSESP::system_.ethernet_connected()) { #ifndef EMSESP_STANDALONE - EMSESP::logger().info(F("Ethernet Connected with IP=%s, speed %d Mbps"), ETH.localIP().toString().c_str(), ETH.linkSpeed()); + EMSESP::logger().info(F("Ethernet connected with IP=%s, speed %d Mbps"), ETH.localIP().toString().c_str(), ETH.linkSpeed()); #endif EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { if (!networkSettings.enableIPv6) { @@ -82,12 +82,12 @@ void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { break; case SYSTEM_EVENT_ETH_DISCONNECTED: - EMSESP::logger().info(F("Ethernet Disconnected")); + EMSESP::logger().info(F("Ethernet disconnected")); EMSESP::system_.ethernet_connected(false); break; case SYSTEM_EVENT_ETH_STOP: - EMSESP::logger().info(F("Ethernet Stopped")); + EMSESP::logger().info(F("Ethernet stopped")); EMSESP::system_.ethernet_connected(false); break; @@ -110,9 +110,9 @@ void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { case SYSTEM_EVENT_GOT_IP6: if (EMSESP::system_.ethernet_connected()) { - EMSESP::logger().info(F("Ethernet Connected with IP=%s, speed %d Mbps"), ETH.localIPv6().toString().c_str(), ETH.linkSpeed()); + EMSESP::logger().info(F("Ethernet connected with IP=%s, speed %d Mbps"), ETH.localIPv6().toString().c_str(), ETH.linkSpeed()); } else { - EMSESP::logger().info(F("WiFi Connected with IP=%s, hostname=%s"), WiFi.localIPv6().toString().c_str(), WiFi.getHostname()); + EMSESP::logger().info(F("WiFi connected with IP=%s, hostname=%s"), WiFi.localIPv6().toString().c_str(), WiFi.getHostname()); } EMSESP::system_.send_heartbeat(); EMSESP::system_.syslog_start(); @@ -129,11 +129,34 @@ void WebStatusService::webStatusService(AsyncWebServerRequest * request) { AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_MEDIUM_DYN); JsonObject root = response->getRoot(); - root["status"] = EMSESP::bus_status(); // 0, 1 or 2 - root["rx_received"] = EMSESP::rxservice_.telegram_count(); - root["tx_sent"] = EMSESP::txservice_.telegram_read_count() + EMSESP::txservice_.telegram_write_count(); - root["rx_quality"] = EMSESP::rxservice_.quality(); - root["tx_quality"] = EMSESP::txservice_.quality(); + root["status"] = EMSESP::bus_status(); // 0, 1 or 2 + root["num_devices"] = EMSESP::count_devices(); // excluding Controller + root["num_sensors"] = EMSESP::dallassensor_.no_sensors(); + root["num_analogs"] = EMSESP::analogsensor_.no_sensors(); + root["tx_mode"] = EMSESP::txservice_.tx_mode(); + root["rx_received"] = EMSESP::rxservice_.telegram_count(); + root["tx_reads"] = EMSESP::txservice_.telegram_read_count(); + root["tx_writes"] = EMSESP::txservice_.telegram_write_count(); + root["rx_quality"] = EMSESP::rxservice_.quality(); + root["tx_read_quality"] = EMSESP::txservice_.read_quality(); + root["tx_write_quality"] = EMSESP::txservice_.write_quality(); + root["rx_fails"] = EMSESP::rxservice_.telegram_error_count(); + root["tx_read_fails"] = EMSESP::txservice_.telegram_read_fail_count(); + root["tx_write_fails"] = EMSESP::txservice_.telegram_write_fail_count(); + root["sensor_fails"] = EMSESP::dallassensor_.fails(); + root["sensor_reads"] = EMSESP::dallassensor_.reads(); + root["sensor_quality"] = EMSESP::dallassensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::dallassensor_.fails()) / EMSESP::dallassensor_.reads()); + root["analog_fails"] = EMSESP::analogsensor_.fails(); + root["analog_reads"] = EMSESP::analogsensor_.reads(); + root["analog_quality"] = EMSESP::analogsensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::analogsensor_.fails()) / EMSESP::analogsensor_.reads()); + root["mqtt_fails"] = Mqtt::publish_fails(); + root["mqtt_count"] = Mqtt::publish_count(); + root["mqtt_quality"] = Mqtt::publish_count() == 0 ? 100 : 100 - (Mqtt::publish_fails() * 100) / (Mqtt::publish_count() + Mqtt::publish_fails()); + root["api_calls"] = WebAPIService::api_count(); // + WebAPIService::api_fails(); + root["api_fails"] = WebAPIService::api_fails(); + root["api_quality"] = + WebAPIService::api_count() == 0 ? 100 : 100 - (WebAPIService::api_fails() * 100) / (WebAPIService::api_count() + WebAPIService::api_fails()); + root["uptime"] = EMSbus::bus_uptime(); response->setLength(); request->send(response); diff --git a/src/web/WebStatusService.h b/src/web/WebStatusService.h index 09d7b13e6..332533ed9 100644 --- a/src/web/WebStatusService.h +++ b/src/web/WebStatusService.h @@ -19,15 +19,9 @@ #ifndef WebStatusService_h #define WebStatusService_h -#include -#include -#include -#include -#include - #include -#define EMSESP_STATUS_SERVICE_PATH "/rest/emsespStatus" +#define EMSESP_STATUS_SERVICE_PATH "/rest/status" namespace emsesp { From a38d8c14fae4add4eab0b047bc807dde96f2d552 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 23 Jan 2022 18:08:52 +0100 Subject: [PATCH 002/319] Function parameter 'sensor' should be passed by const reference --- src/analogsensor.cpp | 2 +- src/analogsensor.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 85651df01..5c438d18e 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -231,7 +231,7 @@ bool AnalogSensor::updated_values() { } // publish a single sensor to MQTT -void AnalogSensor::publish_sensor(Sensor sensor) { +void AnalogSensor::publish_sensor(const Sensor & sensor) { if (Mqtt::publish_single()) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; snprintf(topic, sizeof(topic), "%s/%s", read_flash_string(F_(analogsensor)).c_str(), sensor.name().c_str()); diff --git a/src/analogsensor.h b/src/analogsensor.h index e07191826..70e94fd95 100644 --- a/src/analogsensor.h +++ b/src/analogsensor.h @@ -119,7 +119,7 @@ class AnalogSensor { void start(); void loop(); - void publish_sensor(Sensor sensor); + void publish_sensor(const Sensor & sensor); void publish_values(const bool force); void reload(); bool updated_values(); From b0111d6653286be52f0ea22f3f3bfc259fd21263 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 24 Jan 2022 12:49:16 +0100 Subject: [PATCH 003/319] formatting --- .../src/framework/mqtt/MqttSettingsForm.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index 1d0768277..1d609ff33 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -187,13 +187,13 @@ const MqttSettingsForm: FC = () => { control={} label="Publish single value topics on change" /> - - } - label="Enable MQTT Discovery (for Home Assistant, Domoticz)" - /> - - {data.ha_enabled && ( + + } + label="Enable MQTT Discovery (for Home Assistant, Domoticz)" + /> + + {data.ha_enabled && ( { margin="normal" /> - )} + )} Publish Intervals (in seconds, 0=automatic) From e02f20d74ed419cfd626ffbf95725db22b00cc01 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 24 Jan 2022 12:49:57 +0100 Subject: [PATCH 004/319] fix refresh sensorData --- interface/src/project/DashboardData.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 50a8726dd..a94b69aac 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -103,7 +103,7 @@ const DashboardData: FC = () => { } loadData(); - if (selectedDevice === 0) { + if (sensorData) { fetchSensorData(); } else if (selectedDevice) { fetchDeviceData(selectedDevice); @@ -116,7 +116,7 @@ const DashboardData: FC = () => { clearInterval(timer); }; // eslint-disable-next-line - }, [analog, sensor, deviceValue, selectedDevice]); + }, [analog, sensor, deviceValue, sensorData, selectedDevice]); const fetchDeviceData = async (unique_id: number) => { try { From 8f5e26acd1a85ae8b94224d7e412e7b8520ecdfb Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 24 Jan 2022 12:50:27 +0100 Subject: [PATCH 005/319] fix read command with length --- src/console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/console.cpp b/src/console.cpp index 50a9feb4d..63068352e 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -245,7 +245,7 @@ void EMSESPShell::add_console_commands() { commands->add_command(ShellContext::MAIN, CommandFlags::USER, flash_string_vector{F_(read)}, - flash_string_vector{F_(deviceid_mandatory), F_(typeid_mandatory), F_(offset_optional)}, + flash_string_vector{F_(deviceid_mandatory), F_(typeid_mandatory), F_(offset_optional), F_(length_optional)}, [=](Shell & shell __attribute__((unused)), const std::vector & arguments) { uint8_t device_id = Helpers::hextoint(arguments.front().c_str()); From d27243eb34ab7f2c0529ec114f1a6616d4e3d7ca Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 24 Jan 2022 12:51:13 +0100 Subject: [PATCH 006/319] rename Wired->Ethernet --- interface/src/framework/network/NetworkStatusForm.tsx | 4 ++-- mock-api/server.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/framework/network/NetworkStatusForm.tsx b/interface/src/framework/network/NetworkStatusForm.tsx index 4fd490c5a..986b60d14 100644 --- a/interface/src/framework/network/NetworkStatusForm.tsx +++ b/interface/src/framework/network/NetworkStatusForm.tsx @@ -46,7 +46,7 @@ const networkStatus = ({ status }: NetworkStatus) => { case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: return 'Connected (WiFi)'; case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: - return 'Connected (Wired)'; + return 'Connected (Ethernet)'; case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: return 'Connection Failed'; case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: @@ -65,7 +65,7 @@ const dnsServers = ({ dns_ip_1, dns_ip_2 }: NetworkStatus) => { if (!dns_ip_1) { return 'none'; } - return dns_ip_1 + (dns_ip_2 ? ',' + dns_ip_2 : ''); + return dns_ip_1 + (dns_ip_2 === '0.0.0.0' ? '' : ',' + dns_ip_2); }; const IPs = (status: NetworkStatus) => { diff --git a/mock-api/server.js b/mock-api/server.js index 85d5f87f9..ca2f5a44f 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -1103,7 +1103,7 @@ const emsesp_info = { 'Dallas sensors': 3, }, Network: { - connection: 'Wired', + connection: 'Ethernet', hostname: 'ems-esp', MAC: 'A8:03:2A:62:64:CF', 'IPv4 address': '192.168.1.134/255.255.255.0', From f62317a338f773a2835857d8f911d981b2030e7b Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 24 Jan 2022 12:54:41 +0100 Subject: [PATCH 007/319] system info: lower case and underscores --- src/system.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index 9da12917f..a85f8ce07 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1079,11 +1079,11 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["reset reason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1); if (EMSESP::dallas_enabled()) { - node["Temperature sensors"] = EMSESP::dallassensor_.no_sensors(); + node["temperature sensors"] = EMSESP::dallassensor_.no_sensors(); } if (EMSESP::analog_enabled()) { - node["Analog sensors"] = EMSESP::analogsensor_.no_sensors(); + node["analog sensors"] = EMSESP::analogsensor_.no_sensors(); } #ifndef EMSESP_STANDALONE @@ -1103,7 +1103,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["IPv6 address"] = uuid::printable_to_string(WiFi.localIPv6()); } } else if (EMSESP::system_.ethernet_connected()) { - node["connection"] = F("Wired"); + node["connection"] = F("Ethernet"); node["hostname"] = ETH.getHostname(); node["MAC"] = ETH.macAddress(); node["IPv4 address"] = uuid::printable_to_string(ETH.localIP()) + "/" + uuid::printable_to_string(ETH.subnetMask()); @@ -1146,25 +1146,25 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["MQTT publishes"] = Mqtt::publish_count(); node["MQTT publish fails"] = Mqtt::publish_fails(); } - node["Temperature sensors"] = EMSESP::dallassensor_.no_sensors(); + node["temperature sensors"] = EMSESP::dallassensor_.no_sensors(); if (EMSESP::dallas_enabled()) { - node["Temperature sensor reads"] = EMSESP::dallassensor_.reads(); - node["Temperature sensor fails"] = EMSESP::dallassensor_.fails(); + node["temperature sensor reads"] = EMSESP::dallassensor_.reads(); + node["temperature sensor fails"] = EMSESP::dallassensor_.fails(); } - node["Analog sensors"] = EMSESP::analogsensor_.no_sensors(); + node["analog sensors"] = EMSESP::analogsensor_.no_sensors(); if (EMSESP::analog_enabled()) { - node["Analog sensor reads"] = EMSESP::analogsensor_.reads(); - node["Analog sensor fails"] = EMSESP::analogsensor_.fails(); + node["analog sensor reads"] = EMSESP::analogsensor_.reads(); + node["analog sensor fails"] = EMSESP::analogsensor_.fails(); } node["API calls"] = WebAPIService::api_count(); node["API fails"] = WebAPIService::api_fails(); #ifndef EMSESP_STANDALONE if (EMSESP::system_.syslog_enabled_) { - node["syslog_started"] = syslog_.started(); - node["syslog_level"] = FL_(enum_syslog_level)[syslog_.log_level() + 1]; - node["syslog_ip"] = syslog_.ip(); - node["syslog_queue"] = syslog_.queued(); + node["syslog started"] = syslog_.started(); + node["syslog level"] = FL_(enum_syslog_level)[syslog_.log_level() + 1]; + node["syslog ip"] = syslog_.ip(); + node["syslog queue"] = syslog_.queued(); } #endif } @@ -1180,15 +1180,15 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp char result[200]; (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::RECEIVED); if (result[0] != '\0') { - obj["handlers_received"] = result; // don't show handlers if there aren't any + obj["handlers received"] = result; // don't show handlers if there aren't any } (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::FETCHED); if (result[0] != '\0') { - obj["handlers_fetched"] = result; + obj["handlers fetched"] = result; } (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::PENDING); if (result[0] != '\0') { - obj["handlers_pending"] = result; + obj["handlers pending"] = result; } } } From be20fcf0210a01ee24d6b2bb6ed247fc218a66cf Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 24 Jan 2022 13:06:07 +0100 Subject: [PATCH 008/319] remove unused strings --- src/locale_EN.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/locale_EN.h b/src/locale_EN.h index a5e1a1125..f28d9f5ce 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -71,7 +71,6 @@ MAKE_PSTR_WORD(publish) MAKE_PSTR_WORD(timeout) MAKE_PSTR_WORD(board_profile) MAKE_PSTR_WORD(counter) -MAKE_PSTR_WORD(sensorname) // for commands MAKE_PSTR_WORD(call) @@ -125,7 +124,6 @@ MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc")) // strings -MAKE_PSTR(show_optional, "[devices | users | ems | mqtt | system | commands]") MAKE_PSTR(EMSESP, "EMS-ESP") MAKE_PSTR(cmd_optional, "[cmd]") MAKE_PSTR(ha_optional, "[ha]") @@ -198,8 +196,8 @@ MAKE_PSTR(dbm, "dBm") MAKE_PSTR(fahrenheit, "°F") MAKE_PSTR(mv, "mV") MAKE_PSTR(sqm, "sqm") -MAKE_PSTR(times, "times") -MAKE_PSTR(oclock, "o'clock") +// MAKE_PSTR(times, "times") +// MAKE_PSTR(oclock, "o'clock") // TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp // use empty string if want to suppress showing tags @@ -334,7 +332,6 @@ MAKE_PSTR(smoke_temperature, "smoke temperature") // thermostat lists MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | hh:mm:ss dd.mm.yyyy-dw-dst >")) -// MAKE_PSTR_LIST(tpl_switchtime, F("Format: < p:nn.d.o.hh:mm > prog, no, day, on, time")) MAKE_PSTR_LIST(tpl_switchtime, F("Format: [ not_set | day hh:mm on|off ]")) MAKE_PSTR_LIST(tpl_holidays, F("format: < dd.mm.yyyy-dd.mm.yyyy >")) MAKE_PSTR_LIST(enum_ibaMainDisplay, @@ -367,7 +364,7 @@ MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) // CRF MAKE_PSTR_LIST(enum_mode6, F_(nofrost), F_(night), F_(day)) // RC10 MAKE_PSTR_LIST(enum_modetype, F_(eco), F_(comfort)) -MAKE_PSTR_LIST(enum_modetype2, F_(day)) +// MAKE_PSTR_LIST(enum_modetype2, F_(day)) MAKE_PSTR_LIST(enum_modetype3, F_(night), F_(day)) MAKE_PSTR_LIST(enum_modetype4, F_(nofrost), F_(eco), F_(heat)) MAKE_PSTR_LIST(enum_modetype5, F_(off), F_(on)) @@ -376,7 +373,7 @@ MAKE_PSTR_LIST(enum_reducemode, F_(nofrost), F_(reduce), F_(room), F_(outdoor)) MAKE_PSTR_LIST(enum_controlmode, F_(off), F_(optimized), F_(simple), F_(mpc), F_(room), F_(power), F_(constant)) MAKE_PSTR_LIST(enum_controlmode2, F_(outdoor), F_(room)) -MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor")) +// MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor")) MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x)) MAKE_PSTR_LIST(enum_j_control, F_(off), F("fb10"), F("fb110")) From a27a5ebf4ce8f1ad5dec8525f742f60b3543f537 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 24 Jan 2022 13:14:28 +0100 Subject: [PATCH 009/319] sync DE-string (not completly translated) --- src/locale_DE.h | 259 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 184 insertions(+), 75 deletions(-) diff --git a/src/locale_DE.h b/src/locale_DE.h index caadceafb..82345d198 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -71,21 +71,23 @@ MAKE_PSTR_WORD(publish) MAKE_PSTR_WORD(timeout) MAKE_PSTR_WORD(board_profile) MAKE_PSTR_WORD(counter) -MAKE_PSTR_WORD(sensorname) // for commands MAKE_PSTR_WORD(call) MAKE_PSTR_WORD(cmd) MAKE_PSTR_WORD(id) +MAKE_PSTR_WORD(hc) +MAKE_PSTR_WORD(wwc) MAKE_PSTR_WORD(device) MAKE_PSTR_WORD(data) MAKE_PSTR_WORD(command) MAKE_PSTR_WORD(commands) MAKE_PSTR_WORD(info) -// MAKE_PSTR_WORD(info_short) MAKE_PSTR_WORD(settings) +MAKE_PSTR_WORD(customizations) MAKE_PSTR_WORD(value) MAKE_PSTR_WORD(error) +MAKE_PSTR_WORD(entities) // devices MAKE_PSTR_WORD(boiler) @@ -98,10 +100,9 @@ MAKE_PSTR_WORD(controller) MAKE_PSTR_WORD(connect) MAKE_PSTR_WORD(heatpump) MAKE_PSTR_WORD(generic) -MAKE_PSTR_WORD(sensor) +MAKE_PSTR_WORD(analogsensor) MAKE_PSTR_WORD(unknown) -MAKE_PSTR_WORD(Sensor) -MAKE_PSTR_WORD(other) +MAKE_PSTR_WORD(dallassensor) // format strings MAKE_PSTR(master_thermostat_fmt, "Master Thermostat Device ID: %s") @@ -112,18 +113,17 @@ MAKE_PSTR(board_profile_fmt, "Board Profile: %s") MAKE_PSTR(mark_interval_fmt, "Mark interval: %lus") MAKE_PSTR(wifi_ssid_fmt, "WiFi SSID: %s") MAKE_PSTR(wifi_password_fmt, "WiFi Password: %S") -MAKE_PSTR(ethernet_option_fmt, "Ethernet option: %d") MAKE_PSTR(tx_mode_fmt, "Tx mode: %d") MAKE_PSTR(bus_id_fmt, "Bus ID: %02X") MAKE_PSTR(log_level_fmt, "Log level: %s") -MAKE_STR(productid_fmt, "%s EMS Product ID") +MAKE_STR(productid_fmt, "%s EMS ProductID") MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F_(error), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all")) MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) +MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc")) // strings -MAKE_PSTR(show_optional, "[devices | users | ems | mqtt | system | commands]") MAKE_PSTR(EMSESP, "EMS-ESP") MAKE_PSTR(cmd_optional, "[cmd]") MAKE_PSTR(ha_optional, "[ha]") @@ -138,6 +138,7 @@ MAKE_PSTR(sensorid_optional, "[sensor ID]") MAKE_PSTR(id_optional, "[id|hc]") MAKE_PSTR(data_optional, "[data]") MAKE_PSTR(offset_optional, "[offset]") +MAKE_PSTR(length_optional, "[length]") MAKE_PSTR(typeid_mandatory, "") MAKE_PSTR(deviceid_mandatory, "") MAKE_PSTR(device_type_optional, "[device]") @@ -151,8 +152,9 @@ MAKE_PSTR(password_prompt, "Password: ") MAKE_PSTR(unset, "") // command descriptions -MAKE_PSTR(info_cmd, "list all values") -MAKE_PSTR(commands_cmd, "list all commands") +MAKE_PSTR(info_cmd, "lists all values") +MAKE_PSTR(commands_cmd, "lists all commands") +MAKE_PSTR(entities_cmd, "lists all entities") MAKE_PSTR_WORD(number) MAKE_PSTR_WORD(enum) @@ -167,8 +169,10 @@ MAKE_PSTR_WORD(60) MAKE_PSTR_LIST(div2, F_(2)) MAKE_PSTR_LIST(div4, F_(4)) MAKE_PSTR_LIST(div10, F_(10)) -MAKE_PSTR_LIST(div100, F_(100)) MAKE_PSTR_LIST(div60, F_(60)) +MAKE_PSTR_LIST(div100, F_(100)) +MAKE_PSTR_LIST(mul5, F("-5")) +MAKE_PSTR_LIST(mul10, F("-10")) MAKE_PSTR_LIST(mul15, F("-15")) // Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp @@ -181,6 +185,7 @@ MAKE_PSTR(wh, "Wh") MAKE_PSTR(bar, "bar") MAKE_PSTR(minutes, "Minuten") MAKE_PSTR(hours, "Stunden") +MAKE_PSTR(days, "Tage") MAKE_PSTR(ua, "uA") MAKE_PSTR(lmin, "l/min") MAKE_PSTR(kw, "kW") @@ -191,6 +196,8 @@ MAKE_PSTR(dbm, "dBm") MAKE_PSTR(fahrenheit, "°F") MAKE_PSTR(mv, "mV") MAKE_PSTR(sqm, "sqm") +// MAKE_PSTR(times, "mal") +// MAKE_PSTR(oclock, "Uhr") // TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp // use empty string if want to suppress showing tags @@ -204,6 +211,10 @@ MAKE_PSTR(tag_hc1, "hc1") MAKE_PSTR(tag_hc2, "hc2") MAKE_PSTR(tag_hc3, "hc3") MAKE_PSTR(tag_hc4, "hc4") +MAKE_PSTR(tag_hc5, "hc5") +MAKE_PSTR(tag_hc6, "hc6") +MAKE_PSTR(tag_hc7, "hc7") +MAKE_PSTR(tag_hc8, "hc8") MAKE_PSTR(tag_wwc1, "wwc1") MAKE_PSTR(tag_wwc2, "wwc2") MAKE_PSTR(tag_wwc3, "wwc3") @@ -240,34 +251,40 @@ MAKE_PSTR_WORD(4x3min) MAKE_PSTR_WORD(5x3min) MAKE_PSTR_WORD(6x3min) MAKE_PSTR_(continuos, "kontinuierlich") -MAKE_PSTR(3wayvalve, "3-wege Ventil") +MAKE_PSTR(3wayvalve, "3-Wege Ventil") MAKE_PSTR(chargepump, "Ladepumpe") MAKE_PSTR(hot, "Heiss") -MAKE_PSTR_WORD(eco) -MAKE_PSTR_WORD(intelligent) -MAKE_PSTR(manual, "Manuell") +MAKE_PSTR(eco, "Eco") +MAKE_PSTR(intelligent, "Intelligent") MAKE_PSTR_(flow, "Fluss") +MAKE_PSTR(manual, "Manuell") MAKE_PSTR_(buffer, "Speicher") MAKE_PSTR(bufferedflow, "Durchlaufspeicher") MAKE_PSTR(layeredbuffer, "Schichtspeicher") -MAKE_PSTR_WORD(maintenance) +MAKE_PSTR(maintenance, "Wartung") // boiler lists MAKE_PSTR_LIST(tpl_date, F("Format: < dd.mm.yyyy >")) // template for text input MAKE_PSTR_LIST(enum_off_time_date_manual, F_(off), F_(time), F_(date), F_(manual)) -MAKE_PSTR_LIST(enum_freq, F_(off), F_(1x3min), F_(2x3min), F_(3x3min), F_(4x3min), F_(5x3min), F_(6x3min), F_(continuos)) +MAKE_PSTR_LIST(enum_freq, F_(off), F_(1x3min), F_(2x3min), F_(3x3min), F_(4x3min), F_(5x3min), F_(6x3min), F_(continuous)) MAKE_PSTR_LIST(enum_charge, F_(chargepump), F_(3wayvalve)) MAKE_PSTR_LIST(enum_comfort, F_(hot), F_(eco), F_(intelligent)) MAKE_PSTR_LIST(enum_flow, F_(off), F_(flow), F_(bufferedflow), F_(buffer), F_(layeredbuffer)) -MAKE_PSTR_LIST(enum_reset, F_(maintenance), F_(error)) -// MAKE_PSTR_LIST(enum_bool, F_(Aus), F_(Ein)) +MAKE_PSTR_LIST(enum_reset, F("-"), F_(maintenance), F_(error)) +// MAKE_PSTR_LIST(enum_bool, F_(off), F_(on)) + +//heatpump +MAKE_PSTR_LIST(enum_hpactivity, F("Kein"), F("Heizen"), F("Kühlen"), F("Warmwasser"), F("Pool")) + +// mixer +MAKE_PSTR_LIST(enum_shunt, F("gestoppt"), F("öffnen"), F("schließen"), F("Offen"), F("Geschlossen")) // thermostat MAKE_PSTR(light, "Leicht") MAKE_PSTR(medium, "Mittel") MAKE_PSTR(heavy, "Schwer") MAKE_PSTR(own_prog, "Eigenprog") -MAKE_PSTR_WORD(start) +MAKE_PSTR(start, "Start") MAKE_PSTR(heat, "Heizen") MAKE_PSTR(hold, "Halten") MAKE_PSTR(cool, "Kühl") @@ -282,7 +299,7 @@ MAKE_PSTR(radiator, "Heizkörper") MAKE_PSTR(convector, "Konvektor") MAKE_PSTR(floor, "Fussboden") MAKE_PSTR(summer, "Sommer") -MAKE_PSTR_WORD(winter) +MAKE_PSTR(winter, "Winter") MAKE_PSTR(outdoor, "Aussentemperatur") MAKE_PSTR_WORD(mpc) MAKE_PSTR(room, "Raum") @@ -302,9 +319,9 @@ MAKE_PSTR(design, "Auslegung") MAKE_PSTR_WORD(tempauto) MAKE_PSTR(minflow, "minfluss") MAKE_PSTR(maxflow, "maxfluss") - MAKE_PSTR_WORD(rc3x) MAKE_PSTR_WORD(rc20) + MAKE_PSTR(internal_temperature, "interne Temperatur") MAKE_PSTR(internal_setpoint, "interner Sollwert") MAKE_PSTR(external_temperature, "externe Temperatur") @@ -316,6 +333,7 @@ MAKE_PSTR(smoke_temperature, "Abgastemperatur") // thermostat lists MAKE_PSTR_LIST(tpl_datetime, F("Format: < hh:mm:ss dd/mm/yyyy-dw-dst | NTP >")) MAKE_PSTR_LIST(tpl_switchtime, F("Format: < nn.d.o.hh:mm >")) +MAKE_PSTR_LIST(tpl_holidays, F("Format: < dd.mm.yyyy-dd.mm.yyyy >")) MAKE_PSTR_LIST(enum_ibaMainDisplay, F_(internal_temperature), F_(internal_setpoint), @@ -329,21 +347,24 @@ MAKE_PSTR_LIST(enum_ibaMainDisplay, MAKE_PSTR_LIST(enum_ibaLanguage, F_(german), F_(dutch), F_(french), F_(italian)) MAKE_PSTR_LIST(enum_floordrystatus, F_(off), F_(start), F_(heat), F_(hold), F_(cool), F_(end)) MAKE_PSTR_LIST(enum_ibaBuildingType, F_(light), F_(medium), F_(heavy)) // RC300 +MAKE_PSTR_LIST(enum_PID, F("fast"), F_(medium), F("slow")) MAKE_PSTR_LIST(enum_wwMode, F_(off), F_(low), F_(high), F_(auto), F_(own_prog)) MAKE_PSTR_LIST(enum_wwCircMode, F_(off), F_(on), F_(auto), F_(own_prog)) MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) -MAKE_PSTR_LIST(enum_wwCircMode2, F_(off), F_(on), F_(auto)) +MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto)) MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) +MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer)) -MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) -MAKE_PSTR_LIST(enum_mode2, F_(off), F_(manual), F_(auto)) -MAKE_PSTR_LIST(enum_mode3, F_(night), F_(day), F_(auto)) +MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310 +MAKE_PSTR_LIST(enum_mode2, F_(off), F_(manual), F_(auto)) // RC20 +MAKE_PSTR_LIST(enum_mode3, F_(night), F_(day), F_(auto)) // RC35, RC30, RC25 MAKE_PSTR_LIST(enum_mode4, F_(nofrost), F_(eco), F_(heat), F_(auto)) // JUNKERS -MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) +MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) // CRF +MAKE_PSTR_LIST(enum_mode6, F_(nofrost), F_(night), F_(day)) // RC10 MAKE_PSTR_LIST(enum_modetype, F_(eco), F_(comfort)) -MAKE_PSTR_LIST(enum_modetype2, F_(day)) +// MAKE_PSTR_LIST(enum_modetype2, F_(day)) MAKE_PSTR_LIST(enum_modetype3, F_(night), F_(day)) MAKE_PSTR_LIST(enum_modetype4, F_(nofrost), F_(eco), F_(heat)) MAKE_PSTR_LIST(enum_modetype5, F_(off), F_(on)) @@ -352,25 +373,31 @@ MAKE_PSTR_LIST(enum_reducemode, F_(nofrost), F_(reduce), F_(room), F_(outdoor)) MAKE_PSTR_LIST(enum_controlmode, F_(off), F_(optimized), F_(simple), F_(mpc), F_(room), F_(power), F_(constant)) MAKE_PSTR_LIST(enum_controlmode2, F_(outdoor), F_(room)) -MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor")) +// MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor")) MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x)) +MAKE_PSTR_LIST(enum_j_control, F_(off), F("fb10"), F("fb110")) -MAKE_PSTR_LIST(enum_wwProgMode, F("std prog"), F_(own_prog)) -MAKE_PSTR_LIST(enum_wwDisinfectDay, F("Mo"), F("Di"), F("Mi"), F("Do"), F("Fr"), F("Sa"), F("So"), F("t�glich")) -MAKE_PSTR_LIST(enum_wwChargeDuration, F_(off), F("15min"), F("30min"), F("45min"), F("60min"), F("75min"), F("90min"), F("105min"), F("120min")) +MAKE_PSTR_LIST(enum_wwProgMode, F("std Prog"), F_(own_prog)) +MAKE_PSTR_LIST(enum_dayOfWeek, F("Mo"), F("Di"), F("Mi"), F("Do"), F("Fr"), F("Sa"), F("So"), F("Alle")) +MAKE_PSTR_LIST(enum_progMode, F("Prog_1"), F("Prog_2")) +MAKE_PSTR_LIST(enum_progMode2, F("Eigen_1"), F("Familie"), F("Morgends"), F("Abends"), F("Vormittag"), F("Nachmittag"), F("Mittag"), F("Singles"), F("Senioren"), F("Neu"), F("Eigen_2")) +MAKE_PSTR_LIST(enum_progMode3, F("Familie"), F("Morgends"), F("Abends"), F("Vormittag"), F("Nachmittag"), F("Mittag"), F("Singles"), F("Senioren")) +MAKE_PSTR_LIST(enum_progMode4, F("prog_a"), F("prog_b"), F("prog_c"), F("prog_d"), F("prog_e"), F("prog_f")) + +MAKE_PSTR_LIST(enum_switchmode, F_(off), F_(eco), F_(comfort), F_(heat)) // solar list MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog")) -MAKE_PSTR_LIST(enum_collectortype, F("flat"), F("vacuum")) +MAKE_PSTR_LIST(enum_collectortype, F("flach"), F("vakuum")) +MAKE_PSTR_LIST(enum_cylprio, F("Zyl_1"), F("Zyl_2")) // id used to store the device ID, goes into MQTT payload -// empty full name to prevent being shown in web or console MAKE_PSTR_LIST(ID, F_(id)) // Boiler // extra commands MAKE_PSTR_LIST(wwtapactivated, F("wwtapactivated"), F("Aktiviere Warmwasser im Wartungsmodus")) -MAKE_PSTR_LIST(reset, F("reset"), F("Sende 'RESET'")) +MAKE_PSTR_LIST(reset, F("reset"), F("Reset")) // single mqtt topics MAKE_PSTR_WORD(heating_active) @@ -392,10 +419,12 @@ MAKE_PSTR_LIST(sysPress, F("syspress"), F("Systemdruck")) MAKE_PSTR_LIST(boilTemp, F("boiltemp"), F("Kesseltemperatur")) MAKE_PSTR_LIST(exhaustTemp, F("exhausttemp"), F("Auslasstemperatur")) MAKE_PSTR_LIST(burnGas, F("burngas"), F("Gas")) +MAKE_PSTR_LIST(burnGas2, F("burngas2"), F("Gas Stufe 2")) MAKE_PSTR_LIST(flameCurr, F("flamecurr"), F("Flammstrom")) MAKE_PSTR_LIST(heatingPump, F("heatingpump"), F("Heizungspumpe")) MAKE_PSTR_LIST(fanWork, F("fanwork"), F("Gebläse")) MAKE_PSTR_LIST(ignWork, F("ignwork"), F("Zündung")) +MAKE_PSTR_LIST(oilPreHeat, F("oilpreheat"), F("oil preheating")) MAKE_PSTR_LIST(heatingActivated, F("heatingactivated"), F("Heizen aktiviert")) MAKE_PSTR_LIST(heatingTemp, F("heatingtemp"), F("Kesseltemperatur")) MAKE_PSTR_LIST(pumpModMax, F("pumpmodmax"), F("Kesselpumpen Maximalleistung")) @@ -421,26 +450,47 @@ MAKE_PSTR_LIST(maintenanceDate, F("maintenancedate"), F("Wartungsdatum")) MAKE_PSTR_LIST(maintenanceType, F_(maintenance), F("Wartungsplan")) MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("Wartung in")) +// heatpump/compress specific MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("Betriebszeit total heizen")) MAKE_PSTR_LIST(upTimeCompHeating, F("uptimecompheating"), F("Betriebszeit Kompressor heizen")) MAKE_PSTR_LIST(upTimeCompCooling, F("uptimecompcooling"), F("Betriebszeit Kompressor kühlen")) MAKE_PSTR_LIST(upTimeCompWw, F("uptimecompww"), F("Betriebszeit Kompressor")) +MAKE_PSTR_LIST(upTimeCompPool, F("uptimecomppool"), F("Betriebszeit Kompressor Pool")) +MAKE_PSTR_LIST(totalCompStarts, F("totalcompstarts"), F("gesamt Kompressor Starts")) MAKE_PSTR_LIST(heatingStarts, F("heatingstarts"), F("Heizen Starts")) MAKE_PSTR_LIST(coolingStarts, F("coolingstarts"), F("Kühlen Starts")) +MAKE_PSTR_LIST(poolStarts, F("poolstarts"), F("Pool Starts")) MAKE_PSTR_LIST(nrgConsTotal, F("nrgconstotal"), F("totaler Energieverbrauch")) MAKE_PSTR_LIST(nrgConsCompTotal, F("nrgconscomptotal"), F("Energieverbrauch Kompressor total")) MAKE_PSTR_LIST(nrgConsCompHeating, F("nrgconscompheating"), F("Energieverbrauch Kompressor heizen")) MAKE_PSTR_LIST(nrgConsCompWw, F("nrgconscompww"), F("Energieverbrauch Kompressor")) MAKE_PSTR_LIST(nrgConsCompCooling, F("nrgconscompcooling"), F("Energieverbrauch Kompressor kühlen")) +MAKE_PSTR_LIST(nrgConsCompPool, F("nrgconscomppool"), F("Energieverbrauch Kompressor Pool")) MAKE_PSTR_LIST(nrgSuppTotal, F("nrgsupptotal"), F("gesamte Energieabgabe")) MAKE_PSTR_LIST(nrgSuppHeating, F("nrgsuppheating"), F("gesamte Energieabgabe heizen")) MAKE_PSTR_LIST(nrgSuppWw, F("nrgsuppww"), F("gesamte Energieabgabe")) MAKE_PSTR_LIST(nrgSuppCooling, F("nrgsuppcooling"), F("gesamte Energieabgabe kühlen")) +MAKE_PSTR_LIST(nrgSuppPool, F("nrgsupppool"), F("gesamte Energieabgabe Pool")) MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, F("auxelecheatnrgconstotal"), F("Energieverbrauch el. Zusatzheizung")) -MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, F("auxelecheatnrgconsheating"), F("Energieverbrauch el. Zusatzheizung heizen")) +MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, F("auxelecheatnrgconsheating"), F("Energieverbrauch el. Zusatzheizung Heizen")) MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("Energieverbrauch el. Zusatzheizung")) +MAKE_PSTR_LIST(auxElecHeatNrgConsPool, F("auxelecheatnrgconspool"), F("Energieverbrauch el. Zusatzheizung Pool")) MAKE_PSTR_LIST(hpPower, F("hppower"), F("Leistung Wärmepumpe")) +MAKE_PSTR_LIST(hpCompOn, F("hpcompon"), F("HP Compressor")) +MAKE_PSTR_LIST(hpHeatingOn, F("hpheatingon"), F("HP Heating")) +MAKE_PSTR_LIST(hpCoolingOn, F("hpcoolingon"), F("HP Cooling")) +MAKE_PSTR_LIST(hpWwOn, F("hpwwon"), F("HP dhw")) +MAKE_PSTR_LIST(hpPoolOn, F("hppoolon"), F("HP Pool")) +MAKE_PSTR_LIST(hpBrinePumpSpd, F("hpbrinepumpspd"), F("Brine Pump Speed")) +MAKE_PSTR_LIST(hpCompSpd, F("hpcompspd"), F("Compressor Speed")) +MAKE_PSTR_LIST(hpCircSpd, F("hpcircspd"), F("Circulation pump Speed")) +MAKE_PSTR_LIST(hpBrineIn, F("hpbrinein"), F("Brine in/Evaporator")) +MAKE_PSTR_LIST(hpBrineOut, F("hpbrineout"), F("Brine out/Condenser")) +MAKE_PSTR_LIST(hpSuctionGas, F("hpsuctiongas"), F("Suction gas")) +MAKE_PSTR_LIST(hpHotGas, F("hphotgas"), F("Hot gas/Compressed")) +MAKE_PSTR_LIST(hpSwitchValve, F("hpswitchvalve"), F("Switch Valve")) +MAKE_PSTR_LIST(hpActivity, F("hpactivity"), F("Compressor Activity")) MAKE_PSTR_LIST(hpTc0, F("hptc0"), F("Wärmeträgerflüssigkeit Eingang (TC0)")) MAKE_PSTR_LIST(hpTc1, F("hptc1"), F("Wärmeträgerflüssigkeit Ausgang (TC1)")) MAKE_PSTR_LIST(hpTc3, F("hptc3"), F("Verflüssigertemperatur (TC3)")) @@ -453,7 +503,11 @@ MAKE_PSTR_LIST(hpTl2, F("hptl2"), F("Außenlufttemperaturfühler (TL2)")) MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("Niedrigdruckfühler (PL1)")) MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("Hochdruckfühler (PH1)")) +// the following are dhw for the boiler and automatically tagged with 'ww' MAKE_PSTR_LIST(wWSelTemp, F("wwseltemp"), F("gewählte Temperatur")) +MAKE_PSTR_LIST(wwSelTempLow, F("wwseltemplow"), F("selected lower temperature")) +MAKE_PSTR_LIST(wwSelTempOff, F("wwseltempoff"), F("selected temperature for off")) +MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperature")) MAKE_PSTR_LIST(wWSetTemp, F("wwsettemp"), F("Solltemperatur")) MAKE_PSTR_LIST(wWType, F("wwtype"), F("Typ")) MAKE_PSTR_LIST(wWComfort, F("wwcomfort"), F("Komfort")) @@ -471,60 +525,65 @@ MAKE_PSTR_LIST(wWStorageTemp1, F("wwstoragetemp1"), F("interne Speichertemperatu MAKE_PSTR_LIST(wWStorageTemp2, F("wwstoragetemp2"), F("externer Speichertemperatur")) MAKE_PSTR_LIST(wWActivated, F("wwactivated"), F("aktiviert")) MAKE_PSTR_LIST(wWOneTime, F("wwonetime"), F("Einmalladung")) -MAKE_PSTR_LIST(wWDisinfect, F("wwdisinfect"), F("Desinfizieren")) +MAKE_PSTR_LIST(wWDisinfecting, F("wwdisinfect"), F("Desinfizieren")) MAKE_PSTR_LIST(wWCharging, F("wwcharging"), F("Laden")) MAKE_PSTR_LIST(wWRecharging, F("wwrecharging"), F("Nachladen")) MAKE_PSTR_LIST(wWTempOK, F("wwtempok"), F("Temperatur ok")) MAKE_PSTR_LIST(wWActive, F("wwactive"), F("aktiv")) -MAKE_PSTR_LIST(wWHeat, F("wwheat"), F("heizen")) +MAKE_PSTR_LIST(ww3wayValve, F("ww3wayvalve"), F("3way valve active")) MAKE_PSTR_LIST(wWSetPumpPower, F("wwsetpumppower"), F("Soll Pumpenleistung")) MAKE_PSTR_LIST(mixerTemp, F("mixertemp"), F("Mischertemperatur")) -MAKE_PSTR_LIST(tankMiddleTemp, F("tankmiddletemp"), F("Speicher mittel temperatur (TS3)")) +MAKE_PSTR_LIST(wwCylMiddleTemp, F("wwcylmiddletemp"), F("cylinder middle temperature (TS3)")) MAKE_PSTR_LIST(wWStarts, F("wwstarts"), F("Anzahl starts")) MAKE_PSTR_LIST(wWStarts2, F("wwstarts2"), F("Kreis 2 Anzahl Starts")) MAKE_PSTR_LIST(wWWorkM, F("wwworkm"), F("aktive Zeit")) MAKE_PSTR_LIST(wWHystOn, F("wwhyston"), F("Hysterese Einschalttemperatur")) MAKE_PSTR_LIST(wWHystOff, F("wwhystoff"), F("Hysterese Ausschalttemperatur")) -MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("Starts")) -MAKE_PSTR_LIST(wwWorkM, F("wwworkm"), F("aktive Zeit")) -MAKE_PSTR_LIST(wwHystOn, F("wwhyston"), F("Hysterese an")) -MAKE_PSTR_LIST(wwHystOff, F("wwhystoff"), F("Hysterese aus")) MAKE_PSTR_LIST(wwProgMode, F("wwprogmode"), F("Programmmodus")) MAKE_PSTR_LIST(wwCircProg, F("wwcircprog"), F("Zirkulationsprogramm")) -// MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("Desinfizieren")) // same as in boiler -MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("Desinfizierung Tag")) -MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("Desinfizierung Stunde")) MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("Maximale Temperatur")) MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("Einmalladungstaste")) -MAKE_PSTR_LIST(switchtime, F("switchtime"), F("einzelne Programmschaltzeit")) // mqtt values / commands +MAKE_PSTR_LIST(switchtime1, F("switchtime1"), F("own1 program switchtime")) +MAKE_PSTR_LIST(switchtime2, F("switchtime2"), F("own2 program switchtime")) +MAKE_PSTR_LIST(wwswitchtime, F("wwswitchtime"), F("program switchtime")) +MAKE_PSTR_LIST(wwcircswitchtime, F("wwcircswitchtime"), F("circulation program switchtime")) MAKE_PSTR_LIST(dateTime, F("datetime"), F("Datum/Zeit")) MAKE_PSTR_LIST(errorCode, F("errorcode"), F("Fehlermeldung")) - MAKE_PSTR_LIST(ibaMainDisplay, F("display"), F("Anzeige")) MAKE_PSTR_LIST(ibaLanguage, F("language"), F("Sprache")) MAKE_PSTR_LIST(ibaClockOffset, F("clockoffset"), F("Uhrkorrektur")) MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("Gebäude")) +MAKE_PSTR_LIST(heatingPID, F("heatingpid"), F("heating PID")) MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("Korrektur interner Temperatur")) MAKE_PSTR_LIST(ibaMinExtTemperature, F("minexttemp"), F("min Aussentemperatur")) +MAKE_PSTR_LIST(backlight, F("backlight"), F("key backlight")) MAKE_PSTR_LIST(damping, F("damping"), F("Dämpfung der Außentemperatur")) - MAKE_PSTR_LIST(tempsensor1, F("inttemp1"), F("Temperatursensor 1")) MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("Temperatursensor 2")) MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("gedämpfte Aussentemperatur")) MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("Estrichtrocknung")) MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("Estrichtrocknungs Temperatur")) +// thermostat ww MAKE_PSTR_LIST(wwMode, F("wwmode"), F("modus")) MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("untere Solltemperatur")) +MAKE_PSTR_LIST(wwCharge, F("wwcharge"), F("charge")) MAKE_PSTR_LIST(wwChargeDuration, F("wwchargeduration"), F("charge duration")) +MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("disinfection")) +MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("disinfection day")) +MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("disinfection hour")) +MAKE_PSTR_LIST(wwDisinfectTime, F("wwdisinfecttime"), F("disinfection time")) MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("Kreis 1 Extra")) MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("Kreis 2 Extra")) +MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) +MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) +// thermostat hc MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("Sollwert Raumtemperatur")) MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("aktuelle Raumtemperatur")) MAKE_PSTR_LIST(mode, F("mode"), F("modus")) MAKE_PSTR_LIST(modetype, F("modetype"), F("modus Typ")) - +MAKE_PSTR_LIST(fastheatup, F("fastheatup"), F("fast heatup")) MAKE_PSTR_LIST(daytemp, F("daytemp"), F("Tagestemperatur")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("Heizen Temperatur")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("Nachttemperatur")) @@ -538,17 +597,19 @@ MAKE_PSTR_LIST(offsettemp, F("offsettemp"), F("Temperaturanhebung")) MAKE_PSTR_LIST(minflowtemp, F("minflowtemp"), F("min Flusstemperatur")) MAKE_PSTR_LIST(maxflowtemp, F("maxflowtemp"), F("max Flusstemperatur")) MAKE_PSTR_LIST(roominfluence, F("roominfluence"), F("Raumeinfluss")) +MAKE_PSTR_LIST(curroominfl, F("curroominfl"), F("current room influence")) MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("Frostschutztemperatur")) MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("berechnete Flusstemperatur")) MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("Heizungstyp")) MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("Einstellung Sommerbetrieb")) MAKE_PSTR_LIST(controlmode, F("controlmode"), F("Kontrollmodus")) MAKE_PSTR_LIST(control, F("control"), F("Fernsteuerung")) +MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates")) +MAKE_PSTR_LIST(vacations, F("vacations"), F("vacation dates")) MAKE_PSTR_LIST(program, F("program"), F("Programm")) MAKE_PSTR_LIST(pause, F("pause"), F("Pausenzeit")) MAKE_PSTR_LIST(party, F("party"), F("Partyzeit")) MAKE_PSTR_LIST(wwprio, F("wwprio"), F("dhw priority")) - MAKE_PSTR_LIST(holidaytemp, F("holidaytemp"), F("Urlaubstemperatur")) MAKE_PSTR_LIST(summermode, F("summermode"), F("Sommerbetrieb")) MAKE_PSTR_LIST(holidaymode, F("holidaymode"), F("Urlaubsbetrieb")) @@ -556,6 +617,8 @@ MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("Flusstemperaturanhebung") MAKE_PSTR_LIST(reducemode, F("reducemode"), F("Absenkmodus")) MAKE_PSTR_LIST(noreducetemp, F("noreducetemp"), F("Absenkung unterbrechen unter Temperatur")) MAKE_PSTR_LIST(remotetemp, F("remotetemp"), F("Raumtemperatur der Fernsteuerung")) +MAKE_PSTR_LIST(reducehours, F("reducehours"), F("duration for nighttemp")) +MAKE_PSTR_LIST(reduceminutes, F("reduceminutes"), F("remaining time for nightmode")) // heatpump MAKE_PSTR_LIST(airHumidity, F("airhumidity"), F("relative Luftfeuchte")) @@ -567,69 +630,112 @@ MAKE_PSTR_LIST(flowTempHc, F("flowtemphc"), F("Flusstemperatur des hk (TC1)")) MAKE_PSTR_LIST(pumpStatus, F("pumpstatus"), F("Pumpenstatus des hk (PC1)")) MAKE_PSTR_LIST(mixerStatus, F("valvestatus"), F("Mischerventil Position (VC1)")) MAKE_PSTR_LIST(flowTempVf, F("flowtempvf"), F("Flusstemperatur am Kessel (T0/Vf)")) - +MAKE_PSTR_LIST(mixerSetTime, F("valvesettime"), F("time to set valve")) +// mixer prefixed with wwc MAKE_PSTR_LIST(wwPumpStatus, F("pumpstatus"), F("Pumpenstatus des wwk (PC1)")) MAKE_PSTR_LIST(wwTempStatus, F("tempstatus"), F("Temperaturschalter des wwk (MC1)")) MAKE_PSTR_LIST(wwTemp, F("wwtemp"), F("aktuelle Temperatur")) +// mixer pool +MAKE_PSTR_LIST(poolSetTemp, F("poolsettemp"), F("pool set temperature")) +MAKE_PSTR_LIST(poolTemp, F("pooltemp"), F("pool temperature")) +MAKE_PSTR_LIST(poolShuntStatus, F("poolshuntstatus"), F("pool shunt status opening/closing")) +MAKE_PSTR_LIST(poolShunt, F("poolshunt"), F("pool shunt open/close (0% = pool / 100% = heat)")) // solar -MAKE_PSTR_LIST(type, F("type"), F("type")) MAKE_PSTR_LIST(collectorTemp, F("collectortemp"), F("Kollektortemperatur (TS1)")) -MAKE_PSTR_LIST(tankBottomTemp, F("tankbottomtemp"), F("Speicher Bodentemperatur (TS2)")) -MAKE_PSTR_LIST(tank2BottomTemp, F("tank2bottomtemp"), F("2. Speicher Bodentemperatur (TS5)")) +MAKE_PSTR_LIST(collector2Temp, F("collector2temp"), F("collector 2 temperature (TS7)")) +MAKE_PSTR_LIST(cylBottomTemp, F("cylbottomtemp"), F("Speicher Bodentemperatur (TS2)")) +MAKE_PSTR_LIST(cyl2BottomTemp, F("cyl2bottomtemp"), F("2. Speicher Bodentemperatur (TS5)")) MAKE_PSTR_LIST(heatExchangerTemp, F("heatexchangertemp"), F("wärmetauscher Temperatur (TS6)")) - +MAKE_PSTR_LIST(cylMiddleTemp, F("cylmiddletemp"), F("cylinder middle temperature (TS3)")) +MAKE_PSTR_LIST(retHeatAssist, F("retheatassist"), F("return temperature heat assistance (TS4)")) +// correct name for M1? value not found, try this: +MAKE_PSTR_LIST(m1Valve, F("heatassistvalve"), F("heat assistance valve (M1)")) +MAKE_PSTR_LIST(m1Power, F("heatassistpower"), F("heat assistance valve power (M1)")) MAKE_PSTR_LIST(collectorMaxTemp, F("collectormaxtemp"), F("maximale Kollektortemperatur")) MAKE_PSTR_LIST(collectorMinTemp, F("collectormintemp"), F("minimale Kollektortemperatur")) -MAKE_PSTR_LIST(tankMaxTemp, F("tankmaxtemp"), F("maximale Speichertemperatur")) -MAKE_PSTR_LIST(solarPumpModulation, F("solarpumpmodulation"), F("Pumpenmodulation (PS1)")) -MAKE_PSTR_LIST(cylinderPumpModulation, F("cylinderpumpmodulation"), F("Speicherpumpenmodulation (PS5)")) - +MAKE_PSTR_LIST(cylMaxTemp, F("cylmaxtemp"), F("maximale Speichertemperatur")) +// MAKE_PSTR_LIST(cyl2MaxTemp, F("cyl2maxtemp"), F("maximum cylinder 2 temperature")) +MAKE_PSTR_LIST(solarPumpMod, F("solarpumpmod"), F("Pumpenmodulation (PS1)")) +MAKE_PSTR_LIST(cylPumpMod, F("cylpumpmod"), F("Speicherpumpenmodulation (PS5)")) MAKE_PSTR_LIST(solarPump, F("solarpump"), F("Pumpe (PS1)")) +MAKE_PSTR_LIST(solarPump2, F("solarpump2"), F("pump 2 (PS4)")) +MAKE_PSTR_LIST(solarPump2Mod, F("solarpump2mod"), F("pump 2 modulation (PS4)")) MAKE_PSTR_LIST(valveStatus, F("valvestatus"), F("ventilstatus")) -MAKE_PSTR_LIST(tankHeated, F("tankheated"), F("Speichertemperatur erreicht")) +MAKE_PSTR_LIST(cylHeated, F("cylheated"), F("Speichertemperatur erreicht")) MAKE_PSTR_LIST(collectorShutdown, F("collectorshutdown"), F("Kollektorabschaltung")) - MAKE_PSTR_LIST(pumpWorkTime, F("pumpworktime"), F("Pumpenlaufzeit")) - +MAKE_PSTR_LIST(pump2WorkTime, F("pump2worktime"), F("Pumpe 2 Laufzeit")) +MAKE_PSTR_LIST(m1WorkTime, F("m1worktime"), F("Differenzregelung Arbeitszeit")) MAKE_PSTR_LIST(energyLastHour, F("energylasthour"), F("Energie letzte Std")) MAKE_PSTR_LIST(energyTotal, F("energytotal"), F("Gesamtenergie")) MAKE_PSTR_LIST(energyToday, F("energytoday"), F("Energie heute")) +MAKE_PSTR_LIST(pumpMinMod, F("pumpminmod"), F("minimum pump modulation")) +MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximum solar flow")) +MAKE_PSTR_LIST(solarPower, F("solarpower"), F("actual solar power")) +MAKE_PSTR_LIST(solarPumpTurnonDiff, F("turnondiff"), F("pump turn on difference")) +MAKE_PSTR_LIST(solarPumpTurnoffDiff, F("turnoffdiff"), F("pump turn off difference")) +MAKE_PSTR_LIST(pump2MinMod, F("pump2minmod"), F("minimum pump 2 modulation")) +MAKE_PSTR_LIST(solarPump2TurnonDiff, F("turnondiff2"), F("pump 2 turn on difference")) +MAKE_PSTR_LIST(solarPump2TurnoffDiff, F("turnoffdiff2"), F("pump 2 turn off difference")) + +// solar ww MAKE_PSTR_LIST(wwTemp1, F("wwtemp1"), F("Temperatur 1")) MAKE_PSTR_LIST(wwTemp3, F("wwtemp3"), F("Temperatur 3")) MAKE_PSTR_LIST(wwTemp4, F("wwtemp4"), F("Temperatur 4")) MAKE_PSTR_LIST(wwTemp5, F("wwtemp5"), F("Temperatur 5")) MAKE_PSTR_LIST(wwTemp7, F("wwtemp7"), F("Temperatur 7")) MAKE_PSTR_LIST(wwPump, F("wwpump"), F("Pumpe")) +// solar ww and mixer wwc MAKE_PSTR_LIST(wwMinTemp, F("wwmintemp"), F("minimale Temperatur")) -MAKE_PSTR_LIST(pumpMinMod, F("minpumpmod"), F("minimale Pumpenmodulation")) -MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximaler Durchfluss")) -MAKE_PSTR_LIST(solarPower, F("solarpower"), F("aktuelle Leistung")) -MAKE_PSTR_LIST(solarPumpTurnonDiff, F("turnondiff"), F("Einschaltdifferenz")) -MAKE_PSTR_LIST(solarPumpTurnoffDiff, F("turnoffdiff"), F("Ausschaltdifferenz")) +MAKE_PSTR_LIST(wwRedTemp, F("wwredtemp"), F("redizierte Temperatur")) +MAKE_PSTR_LIST(wwDailyTemp, F("wwdailytemp"), F("tägl. Temperatur")) +MAKE_PSTR_LIST(wwKeepWarm, F("wwkeepwarm"), F("Warmhalten")) +MAKE_PSTR_LIST(wwStatus2, F("wwstatus2"), F("Status 2")) +MAKE_PSTR_LIST(enum_wwStatus2, F(""), F(""), F(""), F("no_heat"), F(""), F(""), F("heatrequest"), F(""), F("disinfecting"), F("hold")) +MAKE_PSTR_LIST(wwPumpMod, F("wwpumpmod"), F("Pumpen Modulation")) +MAKE_PSTR_LIST(wwFlow, F("wwflow"), F("Flussrate")) +// extra mixer ww +MAKE_PSTR_LIST(wwRequiredTemp, F("wwrequiredtemp"), F("benötigte Temperatur")) +MAKE_PSTR_LIST(wwDiffTemp, F("wwdifftemp"), F("Start Differential Temperatur")) //SM100 -MAKE_PSTR_LIST(heatTransferSystem, F("heattransfersystem"), F("heattransfer system")) -MAKE_PSTR_LIST(externalTank, F("externaltank"), F("external tank")) -MAKE_PSTR_LIST(thermalDisinfect, F("thermaldisinfect"), F("thermal disinfection")) -MAKE_PSTR_LIST(heatMetering, F("heatmetering"), F("heatmetering")) +MAKE_PSTR_LIST(heatTransferSystem, F("heattransfersystem"), F("Wärmetransfer System")) +MAKE_PSTR_LIST(externalCyl, F("externalcyl"), F("Externer Speicher")) +MAKE_PSTR_LIST(thermalDisinfect, F("thermaldisinfect"), F("Thermische Desinfektion")) +MAKE_PSTR_LIST(heatMetering, F("heatmetering"), F("Wärmemessung")) MAKE_PSTR_LIST(solarIsEnabled, F("solarenabled"), F("Solarmodul aktiviert")) // telegram 0x035A -MAKE_PSTR_LIST(solarPumpMode, F("solarpumpmode"), F("solar pump mode")) +MAKE_PSTR_LIST(solarPumpMode, F("solarpumpmode"), F("solar Pumpen Einst.")) MAKE_PSTR_LIST(solarPumpKick, F("pumpkick"), F("pumpkick")) MAKE_PSTR_LIST(plainWaterMode, F("plainwatermode"), F("plain water mode")) MAKE_PSTR_LIST(doubleMatchFlow, F("doublematchflow"), F("doublematchflow")) +MAKE_PSTR_LIST(solarPump2Mode, F("pump2mode"), F("pump 2 mode")) +MAKE_PSTR_LIST(solarPump2Kick, F("pump2kick"), F("pumpkick 2")) + +// telegram 0x035F +MAKE_PSTR_LIST(cylPriority, F("cylpriority"), F("Speicher Priorität")) // telegram 0x380 MAKE_PSTR_LIST(climateZone, F("climatezone"), F("climate zone")) -MAKE_PSTR_LIST(collector1Area, F("collector1area"), F("collector 1 area")) -MAKE_PSTR_LIST(collector1Type, F("collector1type"), F("collector 1 type")) +MAKE_PSTR_LIST(collector1Area, F("collector1area"), F("Kollektor 1 Fläche")) +MAKE_PSTR_LIST(collector1Type, F("collector1type"), F("Kollektor 1 Type")) +MAKE_PSTR_LIST(collector2Area, F("collector2area"), F("Kollektor 2 Fläche")) +MAKE_PSTR_LIST(collector2Type, F("collector2type"), F("Kollektor 2 Type")) + +// telegram 0x0363 heatCounter +MAKE_PSTR_LIST(heatCntFlowTemp, F("heatcntflowtemp"), F("Wärmezähler Fluss-Temperatur")) +MAKE_PSTR_LIST(heatCntRetTemp, F("heatcntrettemp"), F("Wärmezähler Rückfluss-Temperatur")) +MAKE_PSTR_LIST(heatCnt, F("heatcnt"), F("Wärmezäler Impulse")) +MAKE_PSTR_LIST(swapFlowTemp, F("swapflowtemp"), F("Austausch Fluss-Temperatur (TS14)")) +MAKE_PSTR_LIST(swapRetTemp, F("swaprettemp"), F("Austausch Rückfluss-Temperatur (TS15)")) // switch MAKE_PSTR_LIST(activated, F("activated"), F("aktiviert")) MAKE_PSTR_LIST(status, F("status"), F("Status")) +// unknown fields to track (SM10) MAKE_PSTR_LIST(data11, F("data11"), F("unknown datafield 11")) MAKE_PSTR_LIST(data12, F("data12"), F("unknown datafield 12")) MAKE_PSTR_LIST(data8, F("data8"), F("unknown datafield 8")) @@ -637,3 +743,6 @@ MAKE_PSTR_LIST(data0, F("data0"), F("unknown datafield 0")) MAKE_PSTR_LIST(data1, F("data1"), F("unknown datafield 1")) MAKE_PSTR_LIST(setting3, F("setting3"), F("unknown setting 3")) MAKE_PSTR_LIST(setting4, F("setting4"), F("unknown setting 4")) + +// RF sensor, id 0x40, telegram 0x435 +MAKE_PSTR_LIST(RFTemp, F("rftemp"), F("RF Raumtemperatur Sensor")); From cd2ea1d5fc2c2be8942f1aaf7986719d39f04c13 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 24 Jan 2022 18:02:57 +0100 Subject: [PATCH 010/319] helptext for string commands --- interface/src/project/DashboardData.tsx | 4 ++++ interface/src/project/types.ts | 1 + src/emsdevice.cpp | 4 ++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index a94b69aac..96c9d17d3 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -14,6 +14,7 @@ import { DialogActions, MenuItem, InputAdornment, + FormHelperText, IconButton, List, ListItem, @@ -248,6 +249,9 @@ const DashboardData: FC = () => { }} /> )} + {deviceValue.h && ( + {deviceValue.h} + )} From acc2412742d4352849f9ac4aa0731be83c38bcf8 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 31 Jan 2022 13:39:30 +0100 Subject: [PATCH 024/319] fix #327, analogsensor sending multiple mqtt messages --- src/analogsensor.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 9f314eb5f..734b9e441 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -335,9 +335,8 @@ void AnalogSensor::publish_values(const bool force) { doc[sensor.name()] = sensor.value(); } } - - Mqtt::publish(F("analogsensor_data"), doc.as()); } + Mqtt::publish(F("analogsensor_data"), doc.as()); } // called from emsesp.cpp, similar to the emsdevice->get_value_info @@ -369,7 +368,7 @@ bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject if (id == -1) { // show number and id JsonObject dataSensor = output.createNestedObject(sensor.name()); dataSensor["id"] = sensor.id(); - dataSensor["type"] = FL_(enum_sensortype)[sensor.type()]; + dataSensor["type"] = FL_(enum_sensortype)[sensor.type()]; if (sensor.type() == AnalogType::ADC) { dataSensor["uom"] = EMSdevice::uom_to_string(sensor.uom()); dataSensor["offset"] = sensor.offset(); From 95f4670b470f515cb7a0474ffefacfd2598960c5 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 31 Jan 2022 17:00:11 +0100 Subject: [PATCH 025/319] use numberValue for input to make all number inputs uniform --- interface/src/project/DashboardData.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 80b4f91ff..fa3a5bfe5 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -239,7 +239,7 @@ const DashboardData: FC = () => { Date: Sat, 5 Feb 2022 09:51:16 +0100 Subject: [PATCH 026/319] fix test compiling --- src/test/test.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/test.cpp b/src/test/test.cpp index f72a53dff..e185c0818 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -608,6 +608,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const } if (command == "api_values") { +#if defined(EMSESP_STANDALONE) shell.printfln(F("Testing API getting values")); Mqtt::ha_enabled(false); Mqtt::nested_format(1); @@ -626,6 +627,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const EMSESP::webAPIService.webAPIService_get(&request); request.url("/api/boiler/values"); EMSESP::webAPIService.webAPIService_get(&request); +#endif } if (command == "mqtt_post") { From 47fb13aa4ad2f16416e0a4aa2a74e508ea4c88a8 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Feb 2022 09:51:34 +0100 Subject: [PATCH 027/319] allow larger exclude lists --- src/web/WebCustomizationService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 0a2498150..063a5f90a 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -46,7 +46,7 @@ WebCustomizationService::WebCustomizationService(AsyncWebServer * server, FS * f securityManager->wrapRequest(std::bind(&WebCustomizationService::reset_customization, this, _1), AuthenticationPredicates::IS_ADMIN)); _exclude_entities_handler.setMethod(HTTP_POST); - _exclude_entities_handler.setMaxContentLength(256); + _exclude_entities_handler.setMaxContentLength(1024); server->addHandler(&_exclude_entities_handler); _device_entities_handler.setMethod(HTTP_POST); From a65b6bf19d58139bc18cd32ebb5047940bc73887 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Feb 2022 13:11:42 +0100 Subject: [PATCH 028/319] fix compile warning --- src/devices/thermostat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 1f4dc7091..0c6e14ea1 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1005,7 +1005,7 @@ void Thermostat::process_RC300Set(std::shared_ptr telegram) { // see https://github.com/emsesp/EMS-ESP32/issues/321 int8_t tat = hc->tempautotemp; telegram->read_value(tat, 8); - if (tat == 0xFF) { + if ((uint8_t)tat == 0xFF) { tat = -2; } has_update(hc->tempautotemp, tat); From 64e755bc15b664741435929026223ce27871515a Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Feb 2022 13:11:58 +0100 Subject: [PATCH 029/319] update packages --- interface/package-lock.json | 114 ++++++++++++++++++------------------ interface/package.json | 8 +-- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 064da39f6..d73efb218 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -12,10 +12,10 @@ "@emotion/styled": "^11.6.0", "@msgpack/msgpack": "^2.7.1", "@mui/icons-material": "^5.3.1", - "@mui/material": "^5.3.1", + "@mui/material": "^5.4.0", "@types/lodash": "^4.14.178", - "@types/node": "^17.0.10", - "@types/react": "^17.0.38", + "@types/node": "^17.0.15", + "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", @@ -28,7 +28,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^11.5.1", + "react-dropzone": "^11.7.0", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", @@ -2707,9 +2707,9 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.66", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.66.tgz", - "integrity": "sha512-LARfVx0HmGV5YwU2pdIqEApQwz/CtEnYtKkV856hlY0cgi5NQL2htzZ/9ujKz0j3LFUaMYiYuJ2AOwrNtGFGrw==", + "version": "5.0.0-alpha.67", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.67.tgz", + "integrity": "sha512-yK2++NivZUitAVpheMc5QVuwrVCphrTw85L6qjKcvnSpB8wmVYne58CY2vzMCNEuHkuHG2jccq9/JlRZFGAanw==", "dependencies": { "@babel/runtime": "^7.16.7", "@emotion/is-prop-valid": "^1.1.1", @@ -2763,13 +2763,13 @@ } }, "node_modules/@mui/material": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.3.1.tgz", - "integrity": "sha512-XWPsJ2jet2zfnKojth5d2IaHIJPpJnHq1ACCSlNf898BjYh1j50gRWsPpIHiptQ0oc0pdWmMcmrXbdANKR1ybw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.0.tgz", + "integrity": "sha512-vfBIAMsRNWI/A4p/eP01MjqhSACwxRGYp/2Yi7WAU64PpI/TXR4b9SRl+XJMMJXVC7+abu4E3hTdF3oqwMCSYA==", "dependencies": { "@babel/runtime": "^7.16.7", - "@mui/base": "5.0.0-alpha.66", - "@mui/system": "^5.3.0", + "@mui/base": "5.0.0-alpha.67", + "@mui/system": "^5.4.0", "@mui/types": "^7.1.0", "@mui/utils": "^5.3.0", "@types/react-transition-group": "^4.4.4", @@ -2863,9 +2863,9 @@ } }, "node_modules/@mui/system": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.3.0.tgz", - "integrity": "sha512-mblz3EObrhhIMPwSEe2Az7MbMaXOFgrvItPOzZwcY5O9qERB7Rr8KQgbU8VouWLUqyV2i8BaFpLrkKPA6eX2Aw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.0.tgz", + "integrity": "sha512-LX7g5gK5yCwiueSUVG73uVNc0yeHjsWUIFLrnPjP3m+J7O38RkPqyao5nZahhaSL1PGNbR9+zfkxljXthO9QqA==", "dependencies": { "@babel/runtime": "^7.16.7", "@mui/private-theming": "^5.3.0", @@ -3597,9 +3597,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", - "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==" + "version": "17.0.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.15.tgz", + "integrity": "sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3632,9 +3632,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", - "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", + "version": "17.0.39", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", + "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -7858,9 +7858,9 @@ } }, "node_modules/file-selector": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", - "integrity": "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", "dependencies": { "tslib": "^2.0.3" }, @@ -14227,16 +14227,16 @@ } }, "node_modules/react-dropzone": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.5.1.tgz", - "integrity": "sha512-eNhttdq4ZDe3eKbXAe54Opt+sbtqmNK5NWTHf/l5d+1TdZqShJ8gMjBrya00qx5zkI//TYxRhu1d9pemTgaWwg==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.0.tgz", + "integrity": "sha512-XTHzXAeOLcTy4wxPv/1HD1XJBzXky67oW5zwKgFs0ulEPqgWC53aGYxxfpID7w5Jas/jwS1tFufBBydT3ItceA==", "dependencies": { - "attr-accept": "^2.2.1", - "file-selector": "^0.2.2", - "prop-types": "^15.7.2" + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" }, "engines": { - "node": ">= 10" + "node": ">= 10.13" }, "peerDependencies": { "react": ">= 16.8" @@ -19333,9 +19333,9 @@ "integrity": "sha512-ApwiSL2c9ObewdOE/sqt788P1C5lomBOHyO8nUBCr4ofErBCnYQ003NtJ8lS9OQZc11ximkbmgAZJjB8y6cCdA==" }, "@mui/base": { - "version": "5.0.0-alpha.66", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.66.tgz", - "integrity": "sha512-LARfVx0HmGV5YwU2pdIqEApQwz/CtEnYtKkV856hlY0cgi5NQL2htzZ/9ujKz0j3LFUaMYiYuJ2AOwrNtGFGrw==", + "version": "5.0.0-alpha.67", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.67.tgz", + "integrity": "sha512-yK2++NivZUitAVpheMc5QVuwrVCphrTw85L6qjKcvnSpB8wmVYne58CY2vzMCNEuHkuHG2jccq9/JlRZFGAanw==", "requires": { "@babel/runtime": "^7.16.7", "@emotion/is-prop-valid": "^1.1.1", @@ -19355,13 +19355,13 @@ } }, "@mui/material": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.3.1.tgz", - "integrity": "sha512-XWPsJ2jet2zfnKojth5d2IaHIJPpJnHq1ACCSlNf898BjYh1j50gRWsPpIHiptQ0oc0pdWmMcmrXbdANKR1ybw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.0.tgz", + "integrity": "sha512-vfBIAMsRNWI/A4p/eP01MjqhSACwxRGYp/2Yi7WAU64PpI/TXR4b9SRl+XJMMJXVC7+abu4E3hTdF3oqwMCSYA==", "requires": { "@babel/runtime": "^7.16.7", - "@mui/base": "5.0.0-alpha.66", - "@mui/system": "^5.3.0", + "@mui/base": "5.0.0-alpha.67", + "@mui/system": "^5.4.0", "@mui/types": "^7.1.0", "@mui/utils": "^5.3.0", "@types/react-transition-group": "^4.4.4", @@ -19394,9 +19394,9 @@ } }, "@mui/system": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.3.0.tgz", - "integrity": "sha512-mblz3EObrhhIMPwSEe2Az7MbMaXOFgrvItPOzZwcY5O9qERB7Rr8KQgbU8VouWLUqyV2i8BaFpLrkKPA6eX2Aw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.0.tgz", + "integrity": "sha512-LX7g5gK5yCwiueSUVG73uVNc0yeHjsWUIFLrnPjP3m+J7O38RkPqyao5nZahhaSL1PGNbR9+zfkxljXthO9QqA==", "requires": { "@babel/runtime": "^7.16.7", "@mui/private-theming": "^5.3.0", @@ -19902,9 +19902,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", - "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==" + "version": "17.0.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.15.tgz", + "integrity": "sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA==" }, "@types/parse-json": { "version": "4.0.0", @@ -19937,9 +19937,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", - "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", + "version": "17.0.39", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", + "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -23086,9 +23086,9 @@ } }, "file-selector": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", - "integrity": "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", "requires": { "tslib": "^2.0.3" } @@ -27560,13 +27560,13 @@ } }, "react-dropzone": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.5.1.tgz", - "integrity": "sha512-eNhttdq4ZDe3eKbXAe54Opt+sbtqmNK5NWTHf/l5d+1TdZqShJ8gMjBrya00qx5zkI//TYxRhu1d9pemTgaWwg==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.0.tgz", + "integrity": "sha512-XTHzXAeOLcTy4wxPv/1HD1XJBzXky67oW5zwKgFs0ulEPqgWC53aGYxxfpID7w5Jas/jwS1tFufBBydT3ItceA==", "requires": { - "attr-accept": "^2.2.1", - "file-selector": "^0.2.2", - "prop-types": "^15.7.2" + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" } }, "react-error-overlay": { diff --git a/interface/package.json b/interface/package.json index db5a461f2..f0ca99cfe 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,10 +8,10 @@ "@emotion/styled": "^11.6.0", "@msgpack/msgpack": "^2.7.1", "@mui/icons-material": "^5.3.1", - "@mui/material": "^5.3.1", + "@mui/material": "^5.4.0", "@types/lodash": "^4.14.178", - "@types/node": "^17.0.10", - "@types/react": "^17.0.38", + "@types/node": "^17.0.15", + "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", @@ -24,7 +24,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^11.5.1", + "react-dropzone": "^11.7.0", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", From e12ac264062d1555d29a21d461df3086431d09b8 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Feb 2022 13:12:03 +0100 Subject: [PATCH 030/319] bump to b3 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 1157224e3..70e1c03ff 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b2" +#define EMSESP_APP_VERSION "3.4.0b3" From 707909881003e43be93e87a4da718d466309c8e7 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Feb 2022 13:15:27 +0100 Subject: [PATCH 031/319] remove txmode off as option --- interface/src/project/SettingsApplication.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx index 169a61818..2213634ac 100644 --- a/interface/src/project/SettingsApplication.tsx +++ b/interface/src/project/SettingsApplication.tsx @@ -292,7 +292,6 @@ const SettingsApplication: FC = () => { margin="normal" select > - Off EMS EMS+ HT3 From 7d11539827755e0bd8fa27a3c4d66252c5a02996 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 6 Feb 2022 10:44:47 +0100 Subject: [PATCH 032/319] fix telegram_last dest read flag --- src/telegram.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/telegram.cpp b/src/telegram.cpp index 9c2a5084b..0fa1b531e 100644 --- a/src/telegram.cpp +++ b/src/telegram.cpp @@ -359,9 +359,9 @@ void TxService::send_telegram(const QueuedTxTelegram & tx_telegram) { telegram_raw[message_p++] = telegram->message_data[i]; } } - // make a copy of the telegram with new dest - telegram_last_ = - std::make_shared(telegram->operation, telegram->src, dest, telegram->type_id, telegram->offset, telegram->message_data, telegram->message_length); + // make a copy of the telegram with new dest (without read-flag) + telegram_last_ = std::make_shared( + telegram->operation, telegram->src, dest & 0x7F, telegram->type_id, telegram->offset, telegram->message_data, telegram->message_length); uint8_t length = message_p; telegram_raw[length] = calculate_crc(telegram_raw, length); // generate and append CRC to the end From ddee63b7184185d72fbb499ca26a91e7e6a00318 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 6 Feb 2022 15:47:20 +0100 Subject: [PATCH 033/319] fix osx firmware upload - #345 --- CHANGELOG_LATEST.md | 1 + interface/package-lock.json | 14 +++++++------- interface/package.json | 2 +- .../src/framework/system/FirmwareFileUpload.tsx | 3 ++- src/version.h | 2 +- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index fbc73103e..e9c0e154f 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -35,6 +35,7 @@ - Buderus RC25 - "hc1 mode type" incorrect value [#273](https://github.com/emsesp/EMS-ESP32/issues/273) - Increased number of Mixers and Heating Circuits [#294](https://github.com/emsesp/EMS-ESP32/issues/294) - Check receive status before removing a telegram fetch [#268](https://github.com/emsesp/EMS-ESP32/issues/268), [#282](https://github.com/emsesp/EMS-ESP32/issues/282) +- Fix uploading firmware on OSX [#345](https://github.com/emsesp/EMS-ESP32/issues/345) ### Changed diff --git a/interface/package-lock.json b/interface/package-lock.json index d73efb218..f944ce0ce 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -28,7 +28,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^11.7.0", + "react-dropzone": "^12.0.0", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", @@ -14227,9 +14227,9 @@ } }, "node_modules/react-dropzone": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.0.tgz", - "integrity": "sha512-XTHzXAeOLcTy4wxPv/1HD1XJBzXky67oW5zwKgFs0ulEPqgWC53aGYxxfpID7w5Jas/jwS1tFufBBydT3ItceA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.0.tgz", + "integrity": "sha512-xGZr9YFTLqLkYDSx7CMRhjW4rIEqE9w2DhJB0CIEslPzUj3OQQcg7fK8uW85exB+UaJoPfk74lnKi0kv7q6rDw==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", @@ -27560,9 +27560,9 @@ } }, "react-dropzone": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.7.0.tgz", - "integrity": "sha512-XTHzXAeOLcTy4wxPv/1HD1XJBzXky67oW5zwKgFs0ulEPqgWC53aGYxxfpID7w5Jas/jwS1tFufBBydT3ItceA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.0.tgz", + "integrity": "sha512-xGZr9YFTLqLkYDSx7CMRhjW4rIEqE9w2DhJB0CIEslPzUj3OQQcg7fK8uW85exB+UaJoPfk74lnKi0kv7q6rDw==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", diff --git a/interface/package.json b/interface/package.json index f0ca99cfe..57b9388fc 100644 --- a/interface/package.json +++ b/interface/package.json @@ -24,7 +24,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^11.7.0", + "react-dropzone": "^12.0.0", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", diff --git a/interface/src/framework/system/FirmwareFileUpload.tsx b/interface/src/framework/system/FirmwareFileUpload.tsx index 824ed3cdf..79da9fc48 100644 --- a/interface/src/framework/system/FirmwareFileUpload.tsx +++ b/interface/src/framework/system/FirmwareFileUpload.tsx @@ -19,7 +19,8 @@ const FirmwareFileUpload: FC = ({ uploadFirmware }) => { my={2} /> Date: Sun, 6 Feb 2022 15:48:57 +0100 Subject: [PATCH 034/319] tidy up sequence of services, start log and serial console first, catch any board profile errors first --- src/console.cpp | 72 ++++--------------- src/console.h | 8 +-- src/default_settings.h | 2 +- src/emsesp.cpp | 59 ++++++++------- src/emsesp.h | 2 +- src/system.cpp | 128 ++++++++++++++------------------- src/system.h | 9 ++- src/web/WebLogService.cpp | 15 ++-- src/web/WebLogService.h | 1 + src/web/WebSettingsService.cpp | 50 ++++++------- src/web/WebStatusService.cpp | 6 +- 11 files changed, 136 insertions(+), 216 deletions(-) diff --git a/src/console.cpp b/src/console.cpp index 63068352e..9bf0c7048 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -54,10 +54,6 @@ void EMSESPShell::stopped() { logger().log(LogLevel::DEBUG, LogFacility::AUTH, F("su session closed on console %s"), console_name().c_str()); } logger().log(LogLevel::DEBUG, LogFacility::CONSOLE, F("User session closed on console %s"), console_name().c_str()); - - // remove all custom contexts - // commands->remove_all_commands(); - // console_commands_loaded_ = false; // make sure they get reloaded next time a console is opened } // show welcome banner @@ -77,8 +73,6 @@ void EMSESPShell::display_banner() { if (console_hostname_.empty()) { console_hostname_ = "ems-esp"; - // console_hostname_.resize(16, '\0'); - // snprintf(&console_hostname_[0], console_hostname_.capacity() + 1, "ems-esp"); } // load the list of commands @@ -465,31 +459,6 @@ std::string EMSESPShell::hostname_text() { return console_hostname_; } -/* -// remove commands from the current context to save memory before exiting -bool EMSESPShell::exit_context() { - unsigned int current_context = context(); - - if (current_context == ShellContext::MAIN) { - Shell::stop(); - return true; - } - // commands->remove_context_commands(current_context); - // return Shell::exit_context(); - return false; -} - -// enter a custom context (sub-menu) -void Console::enter_custom_context(Shell & shell, unsigned int context) { - // load_standard_commands(context); - - // don't go into the new context if it's already the root (to prevent double loading) - if (context != ShellContext::MAIN) { - shell.enter_context(context); - } -} -*/ - // each custom context has the common commands like log, help, exit, su etc void Console::load_standard_commands(unsigned int context) { #if defined(EMSESP_DEBUG) @@ -771,22 +740,6 @@ void Console::load_system_commands(unsigned int context) { }); } -/* -// prompt, change per context -std::string EMSESPShell::context_text() { - switch (static_cast(context())) { - case ShellContext::MAIN: - return std::string{'/'}; - - case ShellContext::SYSTEM: - return std::string{"/system"}; - - default: - return std::string{}; - } -} -*/ - // when in su (admin) show # as the prompt suffix std::string EMSESPShell::prompt_suffix() { if (has_flags(CommandFlags::ADMIN)) { @@ -848,12 +801,11 @@ std::string EMSESPStreamConsole::console_name() { return name_; } -// Start up telnet and logging -// Log order is off, err, warning, notice, info, debug, trace, all -void Console::start(bool telnet_enabled) { - telnet_enabled_ = telnet_enabled; +// Start serial console +void Console::start_serial() { + Serial.begin(115200); - // Serial Console + // Serial Console - is always active shell = std::make_shared(Serial, true); shell->maximum_log_messages(100); shell->start(); @@ -865,20 +817,20 @@ void Console::start(bool telnet_enabled) { #if defined(EMSESP_STANDALONE) shell->add_flags(CommandFlags::ADMIN); // always start in su/admin mode when running tests #endif +} + +// Start up telnet +void Console::start_telnet() { + telnet_enabled_ = true; // telnet is enabled when calling this function // start the telnet service // default idle is 10 minutes, default write timeout is 0 (automatic) // note, this must be started after the network/wifi for ESP32 otherwise it'll crash #ifndef EMSESP_STANDALONE - if (telnet_enabled) { - telnet_.start(); - telnet_.initial_idle_timeout(3600); // in sec, one hour idle timeout - telnet_.default_write_timeout(1000); // in ms, socket timeout 1 second - } + telnet_.start(); + telnet_.initial_idle_timeout(3600); // in sec, one hour idle timeout + telnet_.default_write_timeout(1000); // in ms, socket timeout 1 second #endif - - // turn watch off in case it was still set in the last session - // EMSESP::watch(EMSESP::WATCH_OFF); } // handles telnet sync and logging to console diff --git a/src/console.h b/src/console.h index bf7253b78..025255944 100644 --- a/src/console.h +++ b/src/console.h @@ -99,8 +99,6 @@ class EMSESPShell : virtual public uuid::console::Shell { std::string prompt_suffix() override; void end_of_transmission() override; - // std::string context_text() override; - // bool exit_context() override; private: void add_console_commands(); @@ -128,16 +126,16 @@ class EMSESPStreamConsole : public uuid::console::StreamConsole, public EMSESPSh class Console { public: void loop(); - void start(bool telnet_enabled = true); + void start_serial(); + void start_telnet(); uuid::log::Level log_level(); - // static void enter_custom_context(Shell & shell, unsigned int context); static void load_standard_commands(unsigned int context); static void load_system_commands(unsigned int context); private: - bool telnet_enabled_; + bool telnet_enabled_ = false; // telnet is default off }; } // namespace emsesp diff --git a/src/default_settings.h b/src/default_settings.h index 702289957..d399f9ace 100644 --- a/src/default_settings.h +++ b/src/default_settings.h @@ -93,7 +93,7 @@ #endif #ifndef EMSESP_DEFAULT_BOARD_PROFILE -#define EMSESP_DEFAULT_BOARD_PROFILE "S32" // Gateway S32 +#define EMSESP_DEFAULT_BOARD_PROFILE "default" #endif // Default GPIO PIN definitions diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 735d6b297..b40c6dd64 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -20,12 +20,6 @@ namespace emsesp { -#if defined(EMSESP_STANDALONE) -uint32_t heap_start = 0; -#else -uint32_t heap_start = ESP.getFreeHeap(); // get initial available heap memory -#endif - AsyncWebServer webServer(80); #if defined(EMSESP_STANDALONE) @@ -233,7 +227,7 @@ void EMSESP::watch_id(uint16_t watch_id) { // resets all counters and bumps the UART // this is called when the tx_mode is persisted in the FS either via Web UI or the console -void EMSESP::init_uart() { +void EMSESP::uart_init() { uint8_t tx_mode; uint8_t rx_gpio; uint8_t tx_gpio; @@ -1369,7 +1363,7 @@ void EMSESP::send_raw_telegram(const char * data) { // start all the core services // the services must be loaded in the correct order void EMSESP::start() { - Serial.begin(115200); + console_.start_serial(); // start the file system #ifndef EMSESP_STANDALONE @@ -1379,38 +1373,41 @@ void EMSESP::start() { } #endif - esp8266React.begin(); // loads core system services settings (network, mqtt, ap, ntp etc) - system_.check_upgrade(); // do any system upgrades - webSettingsService.begin(); // load EMS-ESP Application settings... - system_.get_settings(); // ...and store some of the settings locally for future reference - console_.start(system_.telnet_enabled()); // telnet and serial console, from here we can start logging events - webLogService.start(); // start web log service - webCustomizationService.begin(); // load the customizations - - // welcome message - LOG_INFO(F("Starting EMS-ESP version %s (hostname: %s)"), EMSESP_APP_VERSION, system_.hostname().c_str()); - LOG_INFO(F("Configuring for interface board profile %s"), system_.board_profile().c_str()); - - // start all the EMS-ESP services - mqtt_.start(); // mqtt init - system_.start(heap_start); // starts commands, led, adc, button, network, syslog & uart - shower_.start(); // initialize shower timer and shower alert - dallassensor_.start(); // Dallas external sensors - analogsensor_.start(); // Analog external sensors - webServer.begin(); // start the web server - // emsdevices.reserve(5); // reserve space for initially 5 devices to avoid mem frag issues - + esp8266React.begin(); // loads core system services settings (network, mqtt, ap, ntp etc) + webLogService.begin(); // start web log service. now we can start capturing logs to the web log + LOG_INFO(F("Starting EMS-ESP version %s (hostname: %s)"), EMSESP_APP_VERSION, system_.hostname().c_str()); // welcome message LOG_INFO(F("Last system reset reason Core0: %s, Core1: %s"), system_.reset_reason(0).c_str(), system_.reset_reason(1).c_str()); - // Load our library of known devices into stack mem. Names are stored in Flash memory (takes up about 1kb) + webSettingsService.begin(); // load EMS-ESP Application settings... + system_.reload_settings(); // ... and store some of the settings locally + webCustomizationService.begin(); // load the customizations + + // start telnet service if it's enabled + if (system_.telnet_enabled()) { + console_.start_telnet(); + } + + system_.check_upgrade(); // do any system upgrades + + // start all the EMS-ESP services + mqtt_.start(); // mqtt init + system_.start(); // starts commands, led, adc, button, network, syslog & uart + shower_.start(); // initialize shower timer and shower alert + dallassensor_.start(); // Dallas external sensors + analogsensor_.start(); // Analog external sensors + webLogService.start(); // apply settings to weblog service + + // Load our library of known devices into stack mem. Names are stored in Flash memory device_library_ = { #include "device_library.h" }; - LOG_INFO(F("EMS device library loaded with %d records"), device_library_.size()); + LOG_INFO(F("Loaded EMS device library (%d records)"), device_library_.size()); #if defined(EMSESP_STANDALONE) Mqtt::on_connect(); // simulate an MQTT connection #endif + + webServer.begin(); // start the web server } // main loop calling all services diff --git a/src/emsesp.h b/src/emsesp.h index 31ec98965..f9fc2fc31 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -145,7 +145,7 @@ class EMSESP { static void show_devices(uuid::console::Shell & shell); static void show_ems(uuid::console::Shell & shell); - static void init_uart(); + static void uart_init(); static void incoming_telegram(uint8_t * data, const uint8_t length); diff --git a/src/system.cpp b/src/system.cpp index a21b9a4fc..6b56724a9 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -48,9 +48,8 @@ uuid::syslog::SyslogService System::syslog_; #endif // init statics -uint32_t System::heap_start_ = 1; // avoid using 0 to divide-by-zero later -PButton System::myPButton_; -bool System::restart_requested_ = false; +PButton System::myPButton_; +bool System::restart_requested_ = false; // send on/off to a gpio pin // value: true = HIGH, false = LOW @@ -169,7 +168,7 @@ bool System::command_syslog_level(const char * value, const int8_t id) { return StateUpdateResult::CHANGED; }, "local"); - EMSESP::system_.syslog_start(); + EMSESP::system_.syslog_init(); return true; } return false; @@ -240,7 +239,7 @@ void System::format(uuid::console::Shell & shell) { System::system_restart(); } -void System::syslog_start() { +void System::syslog_init() { bool was_enabled = syslog_enabled_; EMSESP::webSettingsService.read([&](WebSettings & settings) { syslog_enabled_ = settings.syslog_enabled; @@ -287,7 +286,7 @@ void System::syslog_start() { } // read some specific system settings to store locally for faster access -void System::get_settings() { +void System::reload_settings() { EMSESP::webSettingsService.read([&](WebSettings & settings) { pbutton_gpio_ = settings.pbutton_gpio; analog_enabled_ = settings.analog_enabled; @@ -360,20 +359,8 @@ bool System::is_valid_gpio(uint8_t pin) { return true; } -// first call. Sets memory and starts up the UART Serial bridge -void System::start(uint32_t heap_start) { -#if defined(EMSESP_DEBUG) - show_mem("Startup"); -#endif - - // set the inital free mem, only on first boot - if (heap_start_ < 2) { - heap_start_ = heap_start; - } - - // load in all the settings first - get_settings(); - +// Starts up the UART Serial bridge +void System::start() { #ifndef EMSESP_STANDALONE // disable bluetooth module // periph_module_disable(PERIPH_BT_MODULE); @@ -390,9 +377,9 @@ void System::start(uint32_t heap_start) { led_init(false); // init LED button_init(false); // the special button network_init(false); // network - syslog_start(); // start Syslog + syslog_init(); // start Syslog - EMSESP::init_uart(); // start UART + EMSESP::uart_init(); // start UART } // button single click @@ -429,7 +416,7 @@ void System::button_OnVLongPress(PButton & b) { // push button void System::button_init(bool refresh) { if (refresh) { - get_settings(); + reload_settings(); } if (is_valid_gpio(pbutton_gpio_)) { @@ -451,7 +438,7 @@ void System::button_init(bool refresh) { // set the LED to on or off when in normal operating mode void System::led_init(bool refresh) { if (refresh) { - get_settings(); + reload_settings(); } if ((led_gpio_ != 0) && is_valid_gpio(led_gpio_)) { @@ -517,15 +504,6 @@ void System::loop() { #endif } -void System::show_mem(const char * note) { -#ifndef EMSESP_STANDALONE - static uint32_t old_free_heap = 0; - uint32_t free_heap = ESP.getFreeHeap(); - LOG_INFO(F("(%s) Free heap: %lu (~%lu)"), note, free_heap, (uint32_t)Helpers::abs(free_heap - old_free_heap)); - old_free_heap = free_heap; -#endif -} - // create the json for heartbeat bool System::heartbeat_json(JsonObject & output) { uint8_t bus_status = EMSESP::bus_status(); @@ -590,7 +568,7 @@ void System::send_heartbeat() { // initializes network void System::network_init(bool refresh) { if (refresh) { - get_settings(); + reload_settings(); } last_system_check_ = 0; // force the LED to go from fast flash to pulse @@ -785,80 +763,82 @@ void System::show_users(uuid::console::Shell & shell) { } void System::show_system(uuid::console::Shell & shell) { - shell.printfln(F("Uptime: %s"), uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3).c_str()); - + shell.println("System:"); + shell.printfln(F(" Board profile: %s"), board_profile().c_str()); + shell.printfln(F(" Uptime: %s"), uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3).c_str()); #ifndef EMSESP_STANDALONE - shell.printfln(F("SDK version: %s"), ESP.getSdkVersion()); - shell.printfln(F("CPU frequency: %lu MHz"), ESP.getCpuFreqMHz()); - shell.printfln(F("Free heap: %lu bytes"), (uint32_t)ESP.getFreeHeap()); + shell.printfln(F(" SDK version: %s"), ESP.getSdkVersion()); + shell.printfln(F(" CPU frequency: %lu MHz"), ESP.getCpuFreqMHz()); + shell.printfln(F(" Free heap: %lu bytes"), (uint32_t)ESP.getFreeHeap()); shell.println(); + shell.println("Network:"); switch (WiFi.status()) { case WL_IDLE_STATUS: - shell.printfln(F("Network: Idle")); + shell.printfln(F(" Network: Idle")); break; case WL_NO_SSID_AVAIL: - shell.printfln(F("Network: Network not found")); + shell.printfln(F(" Network: Network not found")); break; case WL_SCAN_COMPLETED: - shell.printfln(F("Network: Network scan complete")); + shell.printfln(F(" Network: Network scan complete")); break; case WL_CONNECTED: - shell.printfln(F("Network: connected")); - shell.printfln(F("SSID: %s"), WiFi.SSID().c_str()); - shell.printfln(F("BSSID: %s"), WiFi.BSSIDstr().c_str()); - shell.printfln(F("RSSI: %d dBm (%d %%)"), WiFi.RSSI(), wifi_quality(WiFi.RSSI())); - shell.printfln(F("MAC address: %s"), WiFi.macAddress().c_str()); - shell.printfln(F("Hostname: %s"), WiFi.getHostname()); - shell.printfln(F("IPv4 address: %s/%s"), uuid::printable_to_string(WiFi.localIP()).c_str(), uuid::printable_to_string(WiFi.subnetMask()).c_str()); - shell.printfln(F("IPv4 gateway: %s"), uuid::printable_to_string(WiFi.gatewayIP()).c_str()); - shell.printfln(F("IPv4 nameserver: %s"), uuid::printable_to_string(WiFi.dnsIP()).c_str()); + shell.printfln(F(" Network: connected")); + shell.printfln(F(" SSID: %s"), WiFi.SSID().c_str()); + shell.printfln(F(" BSSID: %s"), WiFi.BSSIDstr().c_str()); + shell.printfln(F(" RSSI: %d dBm (%d %%)"), WiFi.RSSI(), wifi_quality(WiFi.RSSI())); + shell.printfln(F(" MAC address: %s"), WiFi.macAddress().c_str()); + shell.printfln(F(" Hostname: %s"), WiFi.getHostname()); + shell.printfln(F(" IPv4 address: %s/%s"), uuid::printable_to_string(WiFi.localIP()).c_str(), uuid::printable_to_string(WiFi.subnetMask()).c_str()); + shell.printfln(F(" IPv4 gateway: %s"), uuid::printable_to_string(WiFi.gatewayIP()).c_str()); + shell.printfln(F(" IPv4 nameserver: %s"), uuid::printable_to_string(WiFi.dnsIP()).c_str()); if (WiFi.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000") { - shell.printfln(F("IPv6 address: %s"), uuid::printable_to_string(WiFi.localIPv6()).c_str()); + shell.printfln(F(" IPv6 address: %s"), uuid::printable_to_string(WiFi.localIPv6()).c_str()); } break; case WL_CONNECT_FAILED: - shell.printfln(F("WiFi Network: Connection failed")); + shell.printfln(F(" WiFi Network: Connection failed")); break; case WL_CONNECTION_LOST: - shell.printfln(F("WiFi Network: Connection lost")); + shell.printfln(F(" WiFi Network: Connection lost")); break; case WL_DISCONNECTED: - shell.printfln(F("WiFi Network: Disconnected")); + shell.printfln(F(" WiFi Network: Disconnected")); break; case WL_NO_SHIELD: default: - shell.printfln(F("WiFi Network: Unknown")); + shell.printfln(F(" WiFi Network: Unknown")); break; } - shell.println(); - // show Ethernet if connected if (ethernet_connected_) { - shell.printfln(F("Wired Network: connected")); - shell.printfln(F("MAC address: %s"), ETH.macAddress().c_str()); - shell.printfln(F("Hostname: %s"), ETH.getHostname()); - shell.printfln(F("IPv4 address: %s/%s"), uuid::printable_to_string(ETH.localIP()).c_str(), uuid::printable_to_string(ETH.subnetMask()).c_str()); - shell.printfln(F("IPv4 gateway: %s"), uuid::printable_to_string(ETH.gatewayIP()).c_str()); - shell.printfln(F("IPv4 nameserver: %s"), uuid::printable_to_string(ETH.dnsIP()).c_str()); + shell.println(); + shell.printfln(F(" Wired Network: connected")); + shell.printfln(F(" MAC address: %s"), ETH.macAddress().c_str()); + shell.printfln(F(" Hostname: %s"), ETH.getHostname()); + shell.printfln(F(" IPv4 address: %s/%s"), uuid::printable_to_string(ETH.localIP()).c_str(), uuid::printable_to_string(ETH.subnetMask()).c_str()); + shell.printfln(F(" IPv4 gateway: %s"), uuid::printable_to_string(ETH.gatewayIP()).c_str()); + shell.printfln(F(" IPv4 nameserver: %s"), uuid::printable_to_string(ETH.dnsIP()).c_str()); if (ETH.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000") { - shell.printfln(F("IPv6 address: %s"), uuid::printable_to_string(ETH.localIPv6()).c_str()); + shell.printfln(F(" IPv6 address: %s"), uuid::printable_to_string(ETH.localIPv6()).c_str()); } } - shell.println(); + + shell.println("Syslog:"); if (!syslog_enabled_) { - shell.printfln(F("Syslog: disabled")); + shell.printfln(F(" Syslog: disabled")); } else { - shell.printfln(F("Syslog: %s"), syslog_.started() ? "started" : "stopped"); + shell.printfln(F(" Syslog: %s"), syslog_.started() ? "started" : "stopped"); shell.print(F(" ")); shell.printfln(F_(host_fmt), !syslog_host_.isEmpty() ? syslog_host_.c_str() : read_flash_string(F_(unset)).c_str()); shell.printfln(F(" IP: %s"), uuid::printable_to_string(syslog_.ip()).c_str()); @@ -1207,15 +1187,15 @@ bool System::command_test(const char * value, const int8_t id) { #endif // takes a board profile and populates a data array with GPIO configurations -// returns false if profile is not found +// returns false if profile is unknown // // data = led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode // // clock modes: -// ETH_CLOCK_GPIO0_IN = 0 RMII clock input to GPIO0 -// ETH_CLOCK_GPIO0_OUT = 1 RMII clock output from GPIO0 -// ETH_CLOCK_GPIO16_OUT = 2 RMII clock output from GPIO16 -// ETH_CLOCK_GPIO17_OUT = 3 RMII clock output from GPIO17, for 50hz inverted cloc +// 0 = RMII clock input to GPIO0 +// 1 = RMII clock output from GPIO0 +// 2 = RMII clock output from GPIO16 +// 3 = RMII clock output from GPIO17, for 50hz inverted clock bool System::load_board_profile(std::vector & data, const std::string & board_profile) { if (board_profile == "S32") { data = {2, 18, 23, 5, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0}; // BBQKees Gateway S32 @@ -1243,7 +1223,7 @@ bool System::load_board_profile(std::vector & data, const std::string & (int8_t)EMSESP::system_.eth_phy_addr_, (int8_t)EMSESP::system_.eth_clock_mode_}; } else { - // unknown, use defaults + // unknown, use defaults and return false data = { EMSESP_DEFAULT_LED_GPIO, EMSESP_DEFAULT_DALLAS_GPIO, diff --git a/src/system.h b/src/system.h index 3edb2d6a0..d87e6e737 100644 --- a/src/system.h +++ b/src/system.h @@ -45,7 +45,7 @@ enum PHY_type : uint8_t { PHY_TYPE_NONE = 0, PHY_TYPE_LAN8720, PHY_TYPE_TLK110 } class System { public: - void start(uint32_t heap_start); + void start(); void loop(); // commands @@ -72,9 +72,9 @@ class System { void upload_status(bool in_progress); bool upload_status(); void show_mem(const char * note); - void get_settings(); + void reload_settings(); void wifi_tweak(); - void syslog_start(); + void syslog_init(); bool check_upgrade(); bool heartbeat_json(JsonObject & output); void send_heartbeat(); @@ -180,7 +180,6 @@ class System { private: static uuid::log::Logger logger_; - static uint32_t heap_start_; static bool restart_requested_; // button @@ -220,7 +219,7 @@ class System { bool ethernet_connected_ = false; // EMS-ESP settings - // copies from WebSettings class in WebSettingsService.h + // copies from WebSettings class in WebSettingsService.h and loaded with reload_settings() std::string hostname_ = FACTORY_WIFI_HOSTNAME; bool hide_led_; uint8_t led_gpio_; diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 18c25b03e..133986d9d 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -45,7 +45,12 @@ void WebLogService::forbidden(AsyncWebServerRequest * request) { request->send(403); } -// start event source service +// start the log service with INFO level +void WebLogService::begin() { + uuid::log::Logger::register_handler(this, uuid::log::Level::INFO); +} + +// apply the user settings void WebLogService::start() { EMSESP::webSettingsService.read([&](WebSettings & settings) { maximum_log_messages_ = settings.weblog_buffer; @@ -105,14 +110,6 @@ WebLogService::QueuedLogMessage::QueuedLogMessage(unsigned long id, std::shared_ } void WebLogService::operator<<(std::shared_ptr message) { - /* - // special case for trace, show trace and notice messages only - // added by mvdp - if (log_level() == uuid::log::Level::TRACE && message->level != uuid::log::Level::TRACE && message->level != uuid::log::Level::NOTICE) { - return; - } - */ - if (log_messages_.size() >= maximum_log_messages_) { log_messages_.pop_front(); } diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index 0686f6e42..5e3ae234f 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -32,6 +32,7 @@ class WebLogService : public uuid::log::Handler { WebLogService(AsyncWebServer * server, SecurityManager * securityManager); + void begin(); void start(); uuid::log::Level log_level() const; void log_level(uuid::log::Level level); diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index e20cf12be..e2652fecb 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -78,10 +78,12 @@ void WebSettings::read(WebSettings & settings, JsonObject & root) { StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) { // load default GPIO configuration based on board profile std::vector data; // // led, dallas, rx, tx, button, phy_type, eth_power, eth_phy_addr, eth_clock_mode - settings.board_profile = root["board_profile"] | EMSESP_DEFAULT_BOARD_PROFILE; if (!System::load_board_profile(data, settings.board_profile.c_str())) { - settings.board_profile = EMSESP_DEFAULT_BOARD_PROFILE; // invalid board configuration, override the default in case it has been misspelled + settings.board_profile = "CUSTOM"; + EMSESP::logger().info("No board profile found. Re-setting to %s", settings.board_profile.c_str()); + } else { + EMSESP::logger().info("Loading board profile %s", settings.board_profile.c_str()); } uint8_t default_led_gpio = data[0]; @@ -112,15 +114,12 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) prev = settings.syslog_enabled; settings.syslog_enabled = root["syslog_enabled"] | EMSESP_DEFAULT_SYSLOG_ENABLED; check_flag(prev, settings.syslog_enabled, ChangeFlags::SYSLOG); - prev = settings.syslog_level; settings.syslog_level = root["syslog_level"] | EMSESP_DEFAULT_SYSLOG_LEVEL; check_flag(prev, settings.syslog_level, ChangeFlags::SYSLOG); - prev = settings.syslog_mark_interval; settings.syslog_mark_interval = root["syslog_mark_interval"] | EMSESP_DEFAULT_SYSLOG_MARK_INTERVAL; check_flag(prev, settings.syslog_mark_interval, ChangeFlags::SYSLOG); - prev = settings.syslog_port; settings.syslog_port = root["syslog_port"] | EMSESP_DEFAULT_SYSLOG_PORT; check_flag(prev, settings.syslog_port, ChangeFlags::SYSLOG); @@ -167,8 +166,22 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) settings.analog_enabled = root["analog_enabled"] | EMSESP_DEFAULT_ANALOG_ENABLED; check_flag(prev, settings.analog_enabled, ChangeFlags::ADC); + // ethernet + prev = settings.phy_type; + settings.phy_type = root["phy_type"] | default_phy_type; + check_flag(prev, settings.phy_type, ChangeFlags::RESTART); + prev = settings.eth_power; + settings.eth_power = root["eth_power"] | default_eth_power; + check_flag(prev, settings.eth_power, ChangeFlags::RESTART); + prev = settings.eth_phy_addr; + settings.eth_phy_addr = root["eth_phy_addr"] | default_eth_phy_addr; + check_flag(prev, settings.eth_phy_addr, ChangeFlags::RESTART); + prev = settings.eth_clock_mode; + settings.eth_clock_mode = root["eth_clock_mode"] | default_eth_clock_mode; + check_flag(prev, settings.eth_clock_mode, ChangeFlags::RESTART); + // - // these need reboots to be applied... + // these need system restarts first before settings are activated... // prev = settings.telnet_enabled; settings.telnet_enabled = root["telnet_enabled"] | EMSESP_DEFAULT_TELNET_ENABLED; @@ -186,25 +199,9 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) settings.master_thermostat = root["master_thermostat"] | EMSESP_DEFAULT_MASTER_THERMOSTAT; check_flag(prev, settings.master_thermostat, ChangeFlags::RESTART); - // use whatever came from the board profile - prev = settings.phy_type; - settings.phy_type = root["phy_type"] | default_phy_type; - check_flag(prev, settings.phy_type, ChangeFlags::RESTART); - - prev = settings.eth_power; - settings.eth_power = root["eth_power"] | default_eth_power; - check_flag(prev, settings.eth_power, ChangeFlags::RESTART); - - prev = settings.eth_phy_addr; - settings.eth_phy_addr = root["eth_phy_addr"] | default_eth_phy_addr; - check_flag(prev, settings.eth_phy_addr, ChangeFlags::RESTART); - - prev = settings.eth_clock_mode; - settings.eth_clock_mode = root["eth_clock_mode"] | default_eth_clock_mode; - check_flag(prev, settings.eth_clock_mode, ChangeFlags::RESTART); - + // // without checks... - + // settings.trace_raw = root["trace_raw"] | EMSESP_DEFAULT_TRACELOG_RAW; EMSESP::trace_raw(settings.trace_raw); @@ -231,7 +228,6 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) if (flags_ == WebSettings::ChangeFlags::RESTART) { return StateUpdateResult::CHANGED_RESTART; // tell WebUI that a restart is needed } - return StateUpdateResult::CHANGED; } @@ -247,11 +243,11 @@ void WebSettingsService::onUpdate() { } if (WebSettings::has_flags(WebSettings::ChangeFlags::UART)) { - EMSESP::init_uart(); + EMSESP::uart_init(); } if (WebSettings::has_flags(WebSettings::ChangeFlags::SYSLOG)) { - EMSESP::system_.syslog_start(); // re-start (or stop) + EMSESP::system_.syslog_init(); // re-start (or stop) } if (WebSettings::has_flags(WebSettings::ChangeFlags::ADC)) { diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 114fcaa97..34be9a29b 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -45,7 +45,7 @@ void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { if (!networkSettings.enableIPv6) { EMSESP::system_.send_heartbeat(); - EMSESP::system_.syslog_start(); + EMSESP::system_.syslog_init(); } }); mDNS_start(); @@ -73,7 +73,7 @@ void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { if (!networkSettings.enableIPv6) { EMSESP::system_.send_heartbeat(); - EMSESP::system_.syslog_start(); + EMSESP::system_.syslog_init(); } }); EMSESP::system_.ethernet_connected(true); @@ -115,7 +115,7 @@ void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { EMSESP::logger().info(F("WiFi connected with IP=%s, hostname=%s"), WiFi.localIPv6().toString().c_str(), WiFi.getHostname()); } EMSESP::system_.send_heartbeat(); - EMSESP::system_.syslog_start(); + EMSESP::system_.syslog_init(); mDNS_start(); break; #endif From 74eabba641ee5fe1ba6500fb34bc2423774c61f8 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 7 Feb 2022 09:02:17 +0100 Subject: [PATCH 035/319] remove uptime. we show it in 2 places already in the app --- interface/src/framework/ntp/NTPStatusForm.tsx | 12 +----------- lib/framework/NTPStatus.cpp | 3 --- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/interface/src/framework/ntp/NTPStatusForm.tsx b/interface/src/framework/ntp/NTPStatusForm.tsx index 0f0659954..22ce282d4 100644 --- a/interface/src/framework/ntp/NTPStatusForm.tsx +++ b/interface/src/framework/ntp/NTPStatusForm.tsx @@ -23,13 +23,12 @@ import AccessTimeIcon from '@mui/icons-material/AccessTime'; import SwapVerticalCircleIcon from '@mui/icons-material/SwapVerticalCircle'; import UpdateIcon from '@mui/icons-material/Update'; import DnsIcon from '@mui/icons-material/Dns'; -import AvTimerIcon from '@mui/icons-material/AvTimer'; import CancelIcon from '@mui/icons-material/Cancel'; import * as NTPApi from '../../api/ntp'; import { NTPStatus, NTPSyncStatus } from '../../types'; import { ButtonRow, FormLoader, SectionContent } from '../../components'; -import { extractErrorMessage, formatDateTime, formatDuration, formatLocalDateTime, useRest } from '../../utils'; +import { extractErrorMessage, formatDateTime, formatLocalDateTime, useRest } from '../../utils'; import { AuthenticatedContext } from '../../contexts/authentication'; export const isNtpActive = ({ status }: NTPStatus) => status === NTPSyncStatus.NTP_ACTIVE; @@ -175,15 +174,6 @@ const NTPStatusForm: FC = () => { - - - - - - - - - diff --git a/lib/framework/NTPStatus.cpp b/lib/framework/NTPStatus.cpp index 1073572d5..217345d44 100644 --- a/lib/framework/NTPStatus.cpp +++ b/lib/framework/NTPStatus.cpp @@ -46,9 +46,6 @@ void NTPStatus::ntpStatus(AsyncWebServerRequest * request) { // the sntp server name root["server"] = sntp_getservername(0); - // device uptime in seconds - root["uptime"] = millis() / 1000; - response->setLength(); request->send(response); } From 984bbd493d03abcd3eef6fb0fb36f57effe8cca4 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 7 Feb 2022 09:02:48 +0100 Subject: [PATCH 036/319] move common time functions --- interface/src/project/DashboardData.tsx | 26 +++----------- interface/src/project/DashboardStatus.tsx | 25 ++------------ interface/src/utils/time.ts | 41 ++++++++++++++++------- 3 files changed, 35 insertions(+), 57 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 9ef209479..36614e0f0 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -27,8 +27,6 @@ import TableCell, { tableCellClasses } from '@mui/material/TableCell'; import { styled } from '@mui/material/styles'; -import parseMilliseconds from 'parse-ms'; - import { useSnackbar } from 'notistack'; import RefreshIcon from '@mui/icons-material/Refresh'; @@ -44,6 +42,8 @@ import DeviceIcon from './DeviceIcon'; import { IconContext } from 'react-icons'; +import { formatDurationMin, pluralize } from '../utils'; + import { AuthenticatedContext } from '../contexts/authentication'; import { ButtonRow, FormLoader, ValidatedTextField, SectionContent, MessageBox } from '../components'; @@ -152,33 +152,15 @@ const DashboardData: FC = () => { } }; - const pluralize = (count: number, noun: string, suffix = 's') => - ` ${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? suffix : ''} `; - - const formatDuration = (duration_min: number) => { - const { days, hours, minutes } = parseMilliseconds(duration_min * 60000); - let formatted = ''; - if (days) { - formatted += pluralize(days, 'day'); - } - if (hours) { - formatted += pluralize(hours, 'hour'); - } - if (minutes) { - formatted += pluralize(minutes, 'minute'); - } - return formatted; - }; - function formatValue(value: any, uom: number) { if (value === undefined) { return ''; } switch (uom) { case DeviceValueUOM.HOURS: - return value ? formatDuration(value * 60) : '0 hours'; + return value ? formatDurationMin(value * 60) : '0 hours'; case DeviceValueUOM.MINUTES: - return value ? formatDuration(value) : '0 minutes'; + return value ? formatDurationMin(value) : '0 minutes'; case DeviceValueUOM.NONE: if (typeof value === 'number') { return new Intl.NumberFormat().format(value); diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx index 2ed4c980b..6f81074ad 100644 --- a/interface/src/project/DashboardStatus.tsx +++ b/interface/src/project/DashboardStatus.tsx @@ -34,6 +34,8 @@ import { ButtonRow, FormLoader, SectionContent } from '../components'; import { Status, busConnectionStatus } from './types'; +import { formatDurationSec, pluralize } from '../utils'; + import * as EMSESP from './api'; import { extractErrorMessage, useRest } from '../utils'; @@ -66,27 +68,6 @@ const busStatus = ({ status }: Status) => { } }; -const pluralize = (count: number, noun: string) => - `${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? 's' : ''}`; - -const formatDuration = (duration_sec: number) => { - if (duration_sec === 0) { - return ' '; - } - const roundTowardsZero = duration_sec > 0 ? Math.floor : Math.ceil; - return ( - ', ' + - roundTowardsZero(duration_sec / 86400) + - 'd ' + - (roundTowardsZero(duration_sec / 3600) % 24) + - 'h ' + - (roundTowardsZero(duration_sec / 60) % 60) + - 'm ' + - (roundTowardsZero(duration_sec) % 60) + - 's' - ); -}; - const formatRow = (name: string, success: number, fail: number, quality: number) => { if (success === 0 && fail === 0) { return ( @@ -182,7 +163,7 @@ const DashboardStatus: FC = () => { - + diff --git a/interface/src/utils/time.ts b/interface/src/utils/time.ts index ba4a841df..7a7986b52 100644 --- a/interface/src/utils/time.ts +++ b/interface/src/utils/time.ts @@ -18,23 +18,38 @@ export const formatLocalDateTime = (date: Date) => { return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, -1).substr(0, 19); }; -export const formatDuration = (duration: number) => { - const { days, hours, minutes, seconds } = parseMilliseconds(duration * 1000); - var formatted = ''; +export const pluralize = (count: number, noun: string) => + `${Intl.NumberFormat().format(count)} ${noun}${count !== 1 ? 's' : ''}`; + +export const formatDurationMin = (duration_min: number) => { + const { days, hours, minutes } = parseMilliseconds(duration_min * 60000); + let formatted = ''; if (days) { - formatted += pluralize(days, 'day'); + formatted += pluralize(days, 'day') + ' '; } - if (formatted || hours) { - formatted += pluralize(hours, 'hour'); + if (hours) { + formatted += pluralize(hours, 'hour') + ' '; } - if (formatted || minutes) { - formatted += pluralize(minutes, 'minute'); - } - if (formatted || seconds) { - formatted += pluralize(seconds, 'second'); + if (minutes) { + formatted += pluralize(minutes, 'minute') + ' '; } return formatted; }; -const pluralize = (count: number, noun: string, suffix: string = 's') => - ` ${count} ${noun}${count !== 1 ? suffix : ''} `; +export const formatDurationSec = (duration_sec: number) => { + if (duration_sec === 0) { + return ' '; + } + const roundTowardsZero = duration_sec > 0 ? Math.floor : Math.ceil; + return ( + ', ' + + roundTowardsZero(duration_sec / 86400) + + 'd ' + + (roundTowardsZero(duration_sec / 3600) % 24) + + 'h ' + + (roundTowardsZero(duration_sec / 60) % 60) + + 'm ' + + (roundTowardsZero(duration_sec) % 60) + + 's' + ); +}; From 3de769c7e70683435d71b5db551a33a87cb6db35 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 7 Feb 2022 09:02:55 +0100 Subject: [PATCH 037/319] add comment --- lib/framework/NTPSettingsService.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/framework/NTPSettingsService.cpp b/lib/framework/NTPSettingsService.cpp index 8ac57dfaf..e00a84c2b 100644 --- a/lib/framework/NTPSettingsService.cpp +++ b/lib/framework/NTPSettingsService.cpp @@ -44,6 +44,7 @@ void NTPSettingsService::WiFiEvent(WiFiEvent_t event) { } } +// https://werner.rothschopf.net/microcontroller/202103_arduino_esp32_ntp_en.htm void NTPSettingsService::configureNTP() { if (connected_ && _state.enabled) { emsesp::EMSESP::logger().info(F("Starting NTP")); @@ -69,6 +70,7 @@ void NTPSettingsService::configureTime(AsyncWebServerRequest * request, JsonVari return; } } + AsyncWebServerResponse * response = request->beginResponse(400); request->send(response); } From 718f9a4f116ea988b7126a54f16e709f87477125 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 12 Feb 2022 15:03:31 +0100 Subject: [PATCH 038/319] fixes #314 --- src/devices/boiler.cpp | 11 +++++++++-- src/devices/boiler.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index b143e8dbb..6ddebf5d7 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -96,8 +96,15 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &tapwaterActive_, DeviceValueType::BOOL, nullptr, FL_(tapwaterActive), DeviceValueUOM::NONE); register_device_value( DeviceValueTAG::TAG_BOILER_DATA, &selFlowTemp_, DeviceValueType::UINT, nullptr, FL_(selFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flow_temp)); - register_device_value( - DeviceValueTAG::TAG_BOILER_DATA, &selBurnPow_, DeviceValueType::UINT, nullptr, FL_(selBurnPow), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_burn_power)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &selBurnPow_, + DeviceValueType::UINT, + nullptr, + FL_(selBurnPow), + DeviceValueUOM::PERCENT, + MAKE_CF_CB(set_burn_power), + 0, + 130); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatingPumpMod_, DeviceValueType::UINT, nullptr, FL_(heatingPumpMod), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatingPump2Mod_, DeviceValueType::UINT, nullptr, FL_(heatingPump2Mod), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &outdoorTemp_, DeviceValueType::SHORT, FL_(div10), FL_(outdoorTemp), DeviceValueUOM::DEGREES); diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 5b81c69c7..c53d0b3f5 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -93,7 +93,7 @@ class Boiler : public EMSdevice { uint8_t heatingActive_; // Central heating is on/off uint8_t tapwaterActive_; // Hot tap water is on/off uint8_t selFlowTemp_; // Selected flow temperature - uint8_t selBurnPow_; // Burner max power % + uint8_t selBurnPow_; // Burner max power % (can be > 100%) uint8_t heatingPump2Mod_; // heatpump modulation from 0xE3 (heatpumps) uint8_t heatingPumpMod_; // Pump modulation % int16_t outdoorTemp_; // Outside temperature From 1f17eda56f8f01cd601aacba8669d839ac871a50 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 12 Feb 2022 15:03:45 +0100 Subject: [PATCH 039/319] update packages --- interface/package-lock.json | 241 ++++++++++++++++++------------------ interface/package.json | 12 +- 2 files changed, 129 insertions(+), 124 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index f944ce0ce..60c3969f8 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -10,17 +10,17 @@ "dependencies": { "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", - "@msgpack/msgpack": "^2.7.1", - "@mui/icons-material": "^5.3.1", - "@mui/material": "^5.4.0", + "@msgpack/msgpack": "^2.7.2", + "@mui/icons-material": "^5.4.1", + "@mui/material": "^5.4.1", "@types/lodash": "^4.14.178", - "@types/node": "^17.0.15", + "@types/node": "^17.0.17", "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", "axios": "^0.25.0", - "http-proxy-middleware": "^2.0.2", + "http-proxy-middleware": "^2.0.3", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "notistack": "^2.0.3", @@ -28,7 +28,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.0", + "react-dropzone": "^12.0.2", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", @@ -1740,9 +1740,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", - "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", + "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -2699,21 +2699,21 @@ } }, "node_modules/@msgpack/msgpack": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.1.tgz", - "integrity": "sha512-ApwiSL2c9ObewdOE/sqt788P1C5lomBOHyO8nUBCr4ofErBCnYQ003NtJ8lS9OQZc11ximkbmgAZJjB8y6cCdA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", + "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==", "engines": { "node": ">= 10" } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.67", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.67.tgz", - "integrity": "sha512-yK2++NivZUitAVpheMc5QVuwrVCphrTw85L6qjKcvnSpB8wmVYne58CY2vzMCNEuHkuHG2jccq9/JlRZFGAanw==", + "version": "5.0.0-alpha.68", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.68.tgz", + "integrity": "sha512-q+3gX6EHuM/AyOn8fkoANQxSzIHBeuNsrGgb7SPP0y7NuM+4ZHG/b9882+OfHcilaSqPDWUQoLbphcBpw/m/RA==", "dependencies": { - "@babel/runtime": "^7.16.7", + "@babel/runtime": "^7.17.0", "@emotion/is-prop-valid": "^1.1.1", - "@mui/utils": "^5.3.0", + "@mui/utils": "^5.4.1", "@popperjs/core": "^2.4.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -2738,11 +2738,11 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.3.1.tgz", - "integrity": "sha512-8zBWCaE8DHjIGZhGgMod92p6Rm38EhXrS+cZtaV0+jOTMeWh7z+mvswXzb/rVKc0ZYqw6mQYBcn2uEs2yclI9w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.1.tgz", + "integrity": "sha512-koiq9q2GfjXRUWcC5fEi1b+EA4vfJHgIaAdBHlkOrBx2cnmmazQcyib501eodPfaZGx9BikrhivODaNQYQq8hA==", "dependencies": { - "@babel/runtime": "^7.16.7" + "@babel/runtime": "^7.17.0" }, "engines": { "node": ">=12.0.0" @@ -2763,15 +2763,15 @@ } }, "node_modules/@mui/material": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.0.tgz", - "integrity": "sha512-vfBIAMsRNWI/A4p/eP01MjqhSACwxRGYp/2Yi7WAU64PpI/TXR4b9SRl+XJMMJXVC7+abu4E3hTdF3oqwMCSYA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.1.tgz", + "integrity": "sha512-SxAT43UAjFTBBpJrN+oGrv40xP1uCa5Z49NfHt3m93xYeFzbxKOk0V9IKU7zlUjbsaVQ0i+o24yF5GULZmynlA==", "dependencies": { - "@babel/runtime": "^7.16.7", - "@mui/base": "5.0.0-alpha.67", - "@mui/system": "^5.4.0", - "@mui/types": "^7.1.0", - "@mui/utils": "^5.3.0", + "@babel/runtime": "^7.17.0", + "@mui/base": "5.0.0-alpha.68", + "@mui/system": "^5.4.1", + "@mui/types": "^7.1.1", + "@mui/utils": "^5.4.1", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.10", @@ -2807,12 +2807,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.3.0.tgz", - "integrity": "sha512-EBobUEyM9fMnteKrVPp8pTMUh81xXakyfdpkoh7Y19q9JpD2eh7QGAQVJVj0JBFlcUJD60NIE4K8rdokrRmLwg==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.1.tgz", + "integrity": "sha512-Xbc4MXFZxv0A3hoc4TSDBhzjhstppKfc+gQcTMqqBZQP7KjnmxF+wO7rEPQuYRBihjCqQBdrHIGMLsKWrhkZkQ==", "dependencies": { - "@babel/runtime": "^7.16.7", - "@mui/utils": "^5.3.0", + "@babel/runtime": "^7.17.0", + "@mui/utils": "^5.4.1", "prop-types": "^15.7.2" }, "engines": { @@ -2833,11 +2833,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.3.0.tgz", - "integrity": "sha512-I4YemFy9WnCLUdZ5T+6egpzc8e7Jq/uh9AJ3QInZHbyNu/9I2SWvNn7vHjWOT/D8Y8LMzIOhu5WwZbzjez7YRw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.1.tgz", + "integrity": "sha512-CFLNJkopRoAuShkgUZOTBVxdTlKu4w6L4kOwPi4r3QB2XXS6O5kyLHSsg9huUbtOYk5Dv5UZyUSc5pw4J7ezdg==", "dependencies": { - "@babel/runtime": "^7.16.7", + "@babel/runtime": "^7.17.0", "@emotion/cache": "^11.7.1", "prop-types": "^15.7.2" }, @@ -2863,15 +2863,15 @@ } }, "node_modules/@mui/system": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.0.tgz", - "integrity": "sha512-LX7g5gK5yCwiueSUVG73uVNc0yeHjsWUIFLrnPjP3m+J7O38RkPqyao5nZahhaSL1PGNbR9+zfkxljXthO9QqA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.1.tgz", + "integrity": "sha512-07JBYf9iQdxIHZU8cFOLoxBnkQDUPLb7UBhNxo4998yEqpWFJ00WKgEVYBKvPl0X+MRU/20wqFz6yGIuCx4AeA==", "dependencies": { - "@babel/runtime": "^7.16.7", - "@mui/private-theming": "^5.3.0", - "@mui/styled-engine": "^5.3.0", - "@mui/types": "^7.1.0", - "@mui/utils": "^5.3.0", + "@babel/runtime": "^7.17.0", + "@mui/private-theming": "^5.4.1", + "@mui/styled-engine": "^5.4.1", + "@mui/types": "^7.1.1", + "@mui/utils": "^5.4.1", "clsx": "^1.1.1", "csstype": "^3.0.10", "prop-types": "^15.7.2" @@ -2902,9 +2902,9 @@ } }, "node_modules/@mui/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz", - "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.1.tgz", + "integrity": "sha512-33hbHFLCwenTpS+T4m4Cz7cQ/ng5g+IgtINkw1uDBVvi1oM83VNt/IGzWIQNPK8H2pr0WIfkmboD501bVdYsPw==", "peerDependencies": { "@types/react": "*" }, @@ -2915,11 +2915,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.3.0.tgz", - "integrity": "sha512-O/E9IQKPMg0OrN7+gkn7Ga5o5WA2iXQGdyqNBFPNrYzxOvwzsEtM5K7MtTCGGYKFe8mhTRM0ZOjh5OM0dglw+Q==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.1.tgz", + "integrity": "sha512-5HzM+ZjlQqbSp7UTOvLlhAjkWB+o9Z4NzO0W+yhZ1KnxITr+zr/MBzYmmQ3kyvhui8pyhgRDoTcVgwb+02ZUZA==", "dependencies": { - "@babel/runtime": "^7.16.7", + "@babel/runtime": "^7.17.0", "@types/prop-types": "^15.7.4", "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.7.2", @@ -3597,9 +3597,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.15.tgz", - "integrity": "sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA==" + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", + "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -8756,9 +8756,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", - "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", + "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -8771,6 +8771,11 @@ }, "peerDependencies": { "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, "node_modules/https-proxy-agent": { @@ -14227,9 +14232,9 @@ } }, "node_modules/react-dropzone": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.0.tgz", - "integrity": "sha512-xGZr9YFTLqLkYDSx7CMRhjW4rIEqE9w2DhJB0CIEslPzUj3OQQcg7fK8uW85exB+UaJoPfk74lnKi0kv7q6rDw==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.2.tgz", + "integrity": "sha512-wnU3+QZA9H5XqC+UNdEDs5YuB+XgJh5mQ9Bop4PUtN/2nKTGTpBbfkcsm9OVCYylBHak69Ezjzbhx/0Cb6OfjA==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", @@ -18610,9 +18615,9 @@ } }, "@babel/runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", - "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", + "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -19328,18 +19333,18 @@ } }, "@msgpack/msgpack": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.1.tgz", - "integrity": "sha512-ApwiSL2c9ObewdOE/sqt788P1C5lomBOHyO8nUBCr4ofErBCnYQ003NtJ8lS9OQZc11ximkbmgAZJjB8y6cCdA==" + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", + "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.67", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.67.tgz", - "integrity": "sha512-yK2++NivZUitAVpheMc5QVuwrVCphrTw85L6qjKcvnSpB8wmVYne58CY2vzMCNEuHkuHG2jccq9/JlRZFGAanw==", + "version": "5.0.0-alpha.68", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.68.tgz", + "integrity": "sha512-q+3gX6EHuM/AyOn8fkoANQxSzIHBeuNsrGgb7SPP0y7NuM+4ZHG/b9882+OfHcilaSqPDWUQoLbphcBpw/m/RA==", "requires": { - "@babel/runtime": "^7.16.7", + "@babel/runtime": "^7.17.0", "@emotion/is-prop-valid": "^1.1.1", - "@mui/utils": "^5.3.0", + "@mui/utils": "^5.4.1", "@popperjs/core": "^2.4.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -19347,23 +19352,23 @@ } }, "@mui/icons-material": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.3.1.tgz", - "integrity": "sha512-8zBWCaE8DHjIGZhGgMod92p6Rm38EhXrS+cZtaV0+jOTMeWh7z+mvswXzb/rVKc0ZYqw6mQYBcn2uEs2yclI9w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.1.tgz", + "integrity": "sha512-koiq9q2GfjXRUWcC5fEi1b+EA4vfJHgIaAdBHlkOrBx2cnmmazQcyib501eodPfaZGx9BikrhivODaNQYQq8hA==", "requires": { - "@babel/runtime": "^7.16.7" + "@babel/runtime": "^7.17.0" } }, "@mui/material": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.0.tgz", - "integrity": "sha512-vfBIAMsRNWI/A4p/eP01MjqhSACwxRGYp/2Yi7WAU64PpI/TXR4b9SRl+XJMMJXVC7+abu4E3hTdF3oqwMCSYA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.1.tgz", + "integrity": "sha512-SxAT43UAjFTBBpJrN+oGrv40xP1uCa5Z49NfHt3m93xYeFzbxKOk0V9IKU7zlUjbsaVQ0i+o24yF5GULZmynlA==", "requires": { - "@babel/runtime": "^7.16.7", - "@mui/base": "5.0.0-alpha.67", - "@mui/system": "^5.4.0", - "@mui/types": "^7.1.0", - "@mui/utils": "^5.3.0", + "@babel/runtime": "^7.17.0", + "@mui/base": "5.0.0-alpha.68", + "@mui/system": "^5.4.1", + "@mui/types": "^7.1.1", + "@mui/utils": "^5.4.1", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.10", @@ -19374,52 +19379,52 @@ } }, "@mui/private-theming": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.3.0.tgz", - "integrity": "sha512-EBobUEyM9fMnteKrVPp8pTMUh81xXakyfdpkoh7Y19q9JpD2eh7QGAQVJVj0JBFlcUJD60NIE4K8rdokrRmLwg==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.1.tgz", + "integrity": "sha512-Xbc4MXFZxv0A3hoc4TSDBhzjhstppKfc+gQcTMqqBZQP7KjnmxF+wO7rEPQuYRBihjCqQBdrHIGMLsKWrhkZkQ==", "requires": { - "@babel/runtime": "^7.16.7", - "@mui/utils": "^5.3.0", + "@babel/runtime": "^7.17.0", + "@mui/utils": "^5.4.1", "prop-types": "^15.7.2" } }, "@mui/styled-engine": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.3.0.tgz", - "integrity": "sha512-I4YemFy9WnCLUdZ5T+6egpzc8e7Jq/uh9AJ3QInZHbyNu/9I2SWvNn7vHjWOT/D8Y8LMzIOhu5WwZbzjez7YRw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.1.tgz", + "integrity": "sha512-CFLNJkopRoAuShkgUZOTBVxdTlKu4w6L4kOwPi4r3QB2XXS6O5kyLHSsg9huUbtOYk5Dv5UZyUSc5pw4J7ezdg==", "requires": { - "@babel/runtime": "^7.16.7", + "@babel/runtime": "^7.17.0", "@emotion/cache": "^11.7.1", "prop-types": "^15.7.2" } }, "@mui/system": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.0.tgz", - "integrity": "sha512-LX7g5gK5yCwiueSUVG73uVNc0yeHjsWUIFLrnPjP3m+J7O38RkPqyao5nZahhaSL1PGNbR9+zfkxljXthO9QqA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.1.tgz", + "integrity": "sha512-07JBYf9iQdxIHZU8cFOLoxBnkQDUPLb7UBhNxo4998yEqpWFJ00WKgEVYBKvPl0X+MRU/20wqFz6yGIuCx4AeA==", "requires": { - "@babel/runtime": "^7.16.7", - "@mui/private-theming": "^5.3.0", - "@mui/styled-engine": "^5.3.0", - "@mui/types": "^7.1.0", - "@mui/utils": "^5.3.0", + "@babel/runtime": "^7.17.0", + "@mui/private-theming": "^5.4.1", + "@mui/styled-engine": "^5.4.1", + "@mui/types": "^7.1.1", + "@mui/utils": "^5.4.1", "clsx": "^1.1.1", "csstype": "^3.0.10", "prop-types": "^15.7.2" } }, "@mui/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz", - "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.1.tgz", + "integrity": "sha512-33hbHFLCwenTpS+T4m4Cz7cQ/ng5g+IgtINkw1uDBVvi1oM83VNt/IGzWIQNPK8H2pr0WIfkmboD501bVdYsPw==", "requires": {} }, "@mui/utils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.3.0.tgz", - "integrity": "sha512-O/E9IQKPMg0OrN7+gkn7Ga5o5WA2iXQGdyqNBFPNrYzxOvwzsEtM5K7MtTCGGYKFe8mhTRM0ZOjh5OM0dglw+Q==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.1.tgz", + "integrity": "sha512-5HzM+ZjlQqbSp7UTOvLlhAjkWB+o9Z4NzO0W+yhZ1KnxITr+zr/MBzYmmQ3kyvhui8pyhgRDoTcVgwb+02ZUZA==", "requires": { - "@babel/runtime": "^7.16.7", + "@babel/runtime": "^7.17.0", "@types/prop-types": "^15.7.4", "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.7.2", @@ -19902,9 +19907,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.15.tgz", - "integrity": "sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA==" + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", + "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==" }, "@types/parse-json": { "version": "4.0.0", @@ -23737,9 +23742,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", - "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", + "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -27560,9 +27565,9 @@ } }, "react-dropzone": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.0.tgz", - "integrity": "sha512-xGZr9YFTLqLkYDSx7CMRhjW4rIEqE9w2DhJB0CIEslPzUj3OQQcg7fK8uW85exB+UaJoPfk74lnKi0kv7q6rDw==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.2.tgz", + "integrity": "sha512-wnU3+QZA9H5XqC+UNdEDs5YuB+XgJh5mQ9Bop4PUtN/2nKTGTpBbfkcsm9OVCYylBHak69Ezjzbhx/0Cb6OfjA==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", diff --git a/interface/package.json b/interface/package.json index 57b9388fc..5e3d4bfb3 100644 --- a/interface/package.json +++ b/interface/package.json @@ -6,17 +6,17 @@ "dependencies": { "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", - "@msgpack/msgpack": "^2.7.1", - "@mui/icons-material": "^5.3.1", - "@mui/material": "^5.4.0", + "@msgpack/msgpack": "^2.7.2", + "@mui/icons-material": "^5.4.1", + "@mui/material": "^5.4.1", "@types/lodash": "^4.14.178", - "@types/node": "^17.0.15", + "@types/node": "^17.0.17", "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", "axios": "^0.25.0", - "http-proxy-middleware": "^2.0.2", + "http-proxy-middleware": "^2.0.3", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "notistack": "^2.0.3", @@ -24,7 +24,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.0", + "react-dropzone": "^12.0.2", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", From 02e5b6e975d41445fdf9053f9af94c680d0e62b9 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 12 Feb 2022 15:04:06 +0100 Subject: [PATCH 040/319] extend test for nested mqtt --- src/test/test.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/test.cpp b/src/test/test.cpp index f72a53dff..7d5029b1c 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -173,8 +173,6 @@ bool Test::run_test(const char * command, int8_t id) { if (strcmp(command, "thermostat") == 0) { EMSESP::logger().info(F("Adding thermostat...")); - Mqtt::nested_format(1); // use nested - // Mqtt::nested_format(2); // single add_device(0x10, 192); // FW120 @@ -498,17 +496,19 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const if (command == "ha") { shell.printfln(F("Testing HA mqtt discovery")); - Mqtt::ha_enabled(true); - // Mqtt::nested_format(1); - Mqtt::nested_format(2); + // Mqtt::ha_enabled(true); + Mqtt::ha_enabled(false); - run_test("boiler"); + // Mqtt::nested_format(1); // is nested + Mqtt::nested_format(2); // not nested + + // run_test("boiler"); run_test("thermostat"); // run_test("solar"); // run_test("mixer"); shell.invoke_command("call system publish"); - shell.invoke_command("show mqtt"); + // shell.invoke_command("show mqtt"); // shell.invoke_command("call boiler fanwork"); // shell.invoke_command("call thermostat seltemp"); // sensor.thermostat_hc1_selected_room_temperature From d00ac1fa86ba09fac964c24ffaa1f48e975c3b5b Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 12 Feb 2022 15:04:37 +0100 Subject: [PATCH 041/319] formatting --- src/mqtt.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/mqtt.h b/src/mqtt.h index ca180897e..95b461de4 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -183,27 +183,23 @@ class Mqtt { static uint8_t nested_format() { return nested_format_; } - static bool is_nested() { return nested_format_ == 1; } + static void nested_format(uint8_t nested_format) { + nested_format_ = nested_format; + } static bool publish_single() { return publish_single_; } - static void publish_single(bool publish_single) { publish_single_ = publish_single; } - static void nested_format(uint8_t nested_format) { - nested_format_ = nested_format; - } - static bool ha_enabled() { return ha_enabled_; } - static void ha_enabled(bool ha_enabled) { ha_enabled_ = ha_enabled; } @@ -211,7 +207,6 @@ class Mqtt { static bool send_response() { return send_response_; } - static void send_response(bool send_response) { send_response_ = send_response; } From 20b876bdd6fe8a79d2c07fab678f4dcad0cb421d Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 12 Feb 2022 15:05:22 +0100 Subject: [PATCH 042/319] fixes #354 --- src/emsesp.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index b40c6dd64..a4bedf1b2 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -552,11 +552,10 @@ void EMSESP::reset_mqtt_ha() { // this will also create the HA /config topic // generate_values_json is called to build the device value (dv) object array void EMSESP::publish_device_values(uint8_t device_type) { - DynamicJsonDocument doc(EMSESP_JSON_SIZE_XLARGE_DYN); // use max size - JsonObject json = doc.to(); + DynamicJsonDocument doc(EMSESP_JSON_SIZE_XLARGE_DYN); + JsonObject json; bool need_publish = false; - - bool nested = (Mqtt::is_nested()); + bool nested = (Mqtt::is_nested()); // group by device type for (const auto & emsdevice : emsdevices) { @@ -572,10 +571,11 @@ void EMSESP::publish_device_values(uint8_t device_type) { // if its a boiler, generate json for each group and publish it directly. not nested if (device_type == DeviceType::BOILER) { + json = doc.to(); if (emsdevice->generate_values(json, DeviceValueTAG::TAG_BOILER_DATA, false, EMSdevice::OUTPUT_TARGET::MQTT)) { Mqtt::publish(Mqtt::tag_to_topic(device_type, DeviceValueTAG::TAG_BOILER_DATA), json); } - doc.clear(); + json = doc.to(); if (emsdevice->generate_values(json, DeviceValueTAG::TAG_DEVICE_DATA_WW, false, EMSdevice::OUTPUT_TARGET::MQTT)) { Mqtt::publish(Mqtt::tag_to_topic(device_type, DeviceValueTAG::TAG_DEVICE_DATA_WW), json); } @@ -587,39 +587,42 @@ void EMSESP::publish_device_values(uint8_t device_type) { // only publish the single master thermostat if (emsdevice->device_id() == EMSESP::actual_master_thermostat()) { if (nested) { + json = doc.to(); need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } else { + json = doc.to(); if (emsdevice->generate_values(json, DeviceValueTAG::TAG_THERMOSTAT_DATA, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested Mqtt::publish(Mqtt::tag_to_topic(device_type, DeviceValueTAG::TAG_NONE), json); } - doc.clear(); for (uint8_t hc_tag = DeviceValueTAG::TAG_HC1; hc_tag <= DeviceValueTAG::TAG_HC8; hc_tag++) { + json = doc.to(); if (emsdevice->generate_values(json, hc_tag, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested Mqtt::publish(Mqtt::tag_to_topic(device_type, hc_tag), json); } - doc.clear(); } - need_publish = false; } + need_publish = false; } } // Mixer else if (device_type == DeviceType::MIXER) { if (nested) { + json = doc.to(); need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } else { for (uint8_t hc_tag = DeviceValueTAG::TAG_HC1; hc_tag <= DeviceValueTAG::TAG_WWC4; hc_tag++) { + json = doc.to(); if (emsdevice->generate_values(json, hc_tag, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested Mqtt::publish(Mqtt::tag_to_topic(device_type, hc_tag), json); } - doc.clear(); } need_publish = false; } } else { // for all other devices add the values to the json + json = doc.to(); need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } } From 482baef360ffa4c48876e8471e47d984adf9882c Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 12 Feb 2022 15:08:03 +0100 Subject: [PATCH 043/319] update with latest fixes --- CHANGELOG_LATEST.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index e9c0e154f..89d33a09b 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -19,7 +19,7 @@ - Added 8700i Boiler device - Added Cascade CM10 Controller device - Add Olimex ESP32-POE-ISO to board profiles plus settings to customize Ethernet modules [#301](https://github.com/emsesp/EMS-ESP32/issues/301) -- helptext for string commands in WebUI [#320](https://github.com/emsesp/EMS-ESP32/issues/320) +- Help text for string commands in WebUI [#320](https://github.com/emsesp/EMS-ESP32/issues/320) - Germany translations (at compile time) - #entities added to system/info` endpoint [#322](https://github.com/emsesp/EMS-ESP32/issues/322) @@ -36,6 +36,8 @@ - Increased number of Mixers and Heating Circuits [#294](https://github.com/emsesp/EMS-ESP32/issues/294) - Check receive status before removing a telegram fetch [#268](https://github.com/emsesp/EMS-ESP32/issues/268), [#282](https://github.com/emsesp/EMS-ESP32/issues/282) - Fix uploading firmware on OSX [#345](https://github.com/emsesp/EMS-ESP32/issues/345) +- Non-nested MQTT would corrupt the json [#354](https://github.com/emsesp/EMS-ESP32/issues/354) +- Burner selected max power can have a value higher than 100% [#314](https://github.com/emsesp/EMS-ESP32/issues/314) ### Changed From 0b4e9da5d5d5c415af76fb93f1e9b54f5a6ad5fe Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 13 Feb 2022 09:59:20 +0100 Subject: [PATCH 044/319] fix mqtt nested thermostat data --- src/emsesp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index a4bedf1b2..9de7169a6 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -600,8 +600,8 @@ void EMSESP::publish_device_values(uint8_t device_type) { Mqtt::publish(Mqtt::tag_to_topic(device_type, hc_tag), json); } } + need_publish = false; } - need_publish = false; } } From 17bc9c231a063e140ce93f11c1fa2f219072c0c2 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 13 Feb 2022 09:59:39 +0100 Subject: [PATCH 045/319] dropzone minor upgrade --- interface/package-lock.json | 14 +++++++------- interface/package.json | 2 +- src/version.h | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 60c3969f8..19db12896 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -28,7 +28,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.2", + "react-dropzone": "^12.0.3", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", @@ -14232,9 +14232,9 @@ } }, "node_modules/react-dropzone": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.2.tgz", - "integrity": "sha512-wnU3+QZA9H5XqC+UNdEDs5YuB+XgJh5mQ9Bop4PUtN/2nKTGTpBbfkcsm9OVCYylBHak69Ezjzbhx/0Cb6OfjA==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.3.tgz", + "integrity": "sha512-7yIthjpO90A1A6EZxriuuHRz2WDgTjmMoAtf0k9PpFzsVK3zNxmDetUe0xgrxwjNH0HcJjePi8KOewmbdpdQCg==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", @@ -27565,9 +27565,9 @@ } }, "react-dropzone": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.2.tgz", - "integrity": "sha512-wnU3+QZA9H5XqC+UNdEDs5YuB+XgJh5mQ9Bop4PUtN/2nKTGTpBbfkcsm9OVCYylBHak69Ezjzbhx/0Cb6OfjA==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.3.tgz", + "integrity": "sha512-7yIthjpO90A1A6EZxriuuHRz2WDgTjmMoAtf0k9PpFzsVK3zNxmDetUe0xgrxwjNH0HcJjePi8KOewmbdpdQCg==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", diff --git a/interface/package.json b/interface/package.json index 5e3d4bfb3..e8aa8e6bf 100644 --- a/interface/package.json +++ b/interface/package.json @@ -24,7 +24,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.2", + "react-dropzone": "^12.0.3", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", diff --git a/src/version.h b/src/version.h index a8f070baa..79659168a 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b4" +#define EMSESP_APP_VERSION "3.4.0b5" From 7214b5beea7bdf8d87ea4143c093df67307ea712 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 13 Feb 2022 21:44:02 +0100 Subject: [PATCH 046/319] fixes Excluding entities from the Customization page does not remove the MQTT Discovery entry #357 --- src/emsdevice.cpp | 49 ++++++++++++++++++++++------- src/emsdevice.h | 1 + src/emsdevicevalue.cpp | 7 ----- src/emsdevicevalue.h | 6 ++-- src/emsesp.cpp | 8 ++--- src/test/test.cpp | 34 ++++++++++++++++++++ src/test/test.h | 3 +- src/web/WebCustomizationService.cpp | 19 ++++++----- 8 files changed, 92 insertions(+), 35 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 09a58c558..52ed4be07 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -455,7 +455,7 @@ void EMSdevice::register_device_value(uint8_t tag, if ((entityCustomization.product_id == product_id()) && (entityCustomization.device_id == device_id())) { for (uint8_t entity_id : entityCustomization.entity_ids) { if (entity_id == dv_id) { - state = DeviceValueState::DV_DEFAULT; // it's on the list, exclude it by making it not visible + state = DeviceValueState::DV_DEFAULT; // it's on the exclude list, turn off active and visible flags break; } } @@ -757,12 +757,23 @@ void EMSdevice::generate_values_web(JsonObject & output) { } } +// reset all entities to being visible +// this is called before loading in the exclude entities list from the customization service +void EMSdevice::reset_exclude_entities() { + for (auto & dv : devicevalues_) { + dv.add_state(DeviceValueState::DV_VISIBLE); + } +} + // disable/exclude a device entity based on its unique id void EMSdevice::exclude_entity(uint8_t id) { for (auto & dv : devicevalues_) { if (dv.id == id) { +#if defined(EMSESP_USE_SERIAL) + Serial.print("exclude_entity() Removing state for device value: "); + Serial.println(read_flash_string(dv.full_name).c_str()); +#endif dv.remove_state(DeviceValueState::DV_VISIBLE); // this will remove from MQTT payloads and showing in web & console - dv.remove_state(DeviceValueState::DV_ACTIVE); // this will ensure it'll be removed from any HA MQTT /config topics return; } } @@ -1007,7 +1018,7 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 } json["writeable"] = dv.has_cmd; - json["visible"] = dv.has_state(DeviceValue::DeviceValueState::DV_VISIBLE); + json["visible"] = dv.has_state(DeviceValueState::DV_VISIBLE); // if there is no value, mention it if (!json.containsKey(value)) { @@ -1042,6 +1053,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c for (auto & dv : devicevalues_) { // check if it exists, there is a value for the entity. Set the flag to ACTIVE + // not that this will override any previously removed states if (dv.hasValue()) { dv.add_state(DeviceValueState::DV_ACTIVE); } else { @@ -1210,21 +1222,34 @@ void EMSdevice::publish_mqtt_ha_entity_config() { // create the main device config if not already done, per device type bool create_device_config = !ha_config_done(); + // check the state of each of the device values for (auto & dv : devicevalues_) { if (dv.has_state(DeviceValueState::DV_ACTIVE)) { - // add it if not already done and if it's visible (not on the exclusion list) - // don't do this for commands (like reset) - if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.has_state(DeviceValueState::DV_VISIBLE) && dv.type != DeviceValueType::CMD) { - Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); - dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); - if (create_device_config) { - create_device_config = false; + // entity has an active value (it means it contains a valid value) + + if (dv.has_state(DeviceValueState::DV_VISIBLE)) { + // visible + // if the HA config topic hasn't been created it, do it now (unless its a command like reset) + if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.type != DeviceValueType::CMD) { + Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); + dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); + if (create_device_config) { + create_device_config = false; + } + } + } else { + // not visible. It must be on the entity exclusion list defined in the Customizations service + // if a HA config topic was created then remove it. This entity has become 'lost' + if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED)) { + Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), true, create_device_config); // remove /config + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); } } } else { + // entity does not have an active value + // if a HA config topic was created then remove it. This entity has become 'lost' + // https://github.com/emsesp/EMS-ESP32/issues/196 if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED)) { - // if the HA config has already been created and now the value has gone dormant, delete the config - // https://github.com/emsesp/EMS-ESP32/issues/196 Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), true, create_device_config); // remove /config dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); } diff --git a/src/emsdevice.h b/src/emsdevice.h index a88b9df5b..1ae6b8fce 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -184,6 +184,7 @@ class EMSdevice { void show_mqtt_handlers(uuid::console::Shell & shell); void list_device_entries(JsonObject & output); void exclude_entity(uint8_t entity_id); + void reset_exclude_entities(); using process_function_p = std::function)>; diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp index 037829b21..a8a9bfd34 100644 --- a/src/emsdevicevalue.cpp +++ b/src/emsdevicevalue.cpp @@ -171,13 +171,6 @@ bool DeviceValue::hasValue() { break; } -#if defined(EMSESP_DEBUG) - // https://github.com/emsesp/EMS-ESP32/issues/196 - // if (has_state(DeviceValueState::DV_ACTIVE) && !has_value) { - // emsesp::EMSESP::logger().warning(F("[DEBUG] Lost device value %s"), short_name); - // } -#endif - return has_value; } diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 9b7512e7f..a9b4b029c 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -109,9 +109,9 @@ class DeviceValue { // states of a device value enum DeviceValueState : uint8_t { DV_DEFAULT = 0, // 0 - does not yet have a value - DV_ACTIVE = (1 << 0), // 1 - has a valid value - DV_VISIBLE = (1 << 1), // 2 - shown on web and console, otherwise hidden - DV_HA_CONFIG_CREATED = (1 << 2) // 4 - set if the HA config has been created + DV_ACTIVE = (1 << 0), // 1 - has a validated real value + DV_VISIBLE = (1 << 1), // 2 - shown on web, console and on MQTT payload. Otherwise hidden + DV_HA_CONFIG_CREATED = (1 << 2) // 4 - set if the HA config topic has been created }; uint8_t device_type; // EMSdevice::DeviceType diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 9de7169a6..b6ec5f953 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -625,11 +625,11 @@ void EMSESP::publish_device_values(uint8_t device_type) { json = doc.to(); need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } - } - // we want to create the /config topic after the data payload to prevent HA from throwing up a warning - if (Mqtt::ha_enabled()) { - emsdevice->publish_mqtt_ha_entity_config(); + // we want to create the /config topic after the data payload to prevent HA from throwing up a warning + if (Mqtt::ha_enabled()) { + emsdevice->publish_mqtt_ha_entity_config(); + } } } diff --git a/src/test/test.cpp b/src/test/test.cpp index 7d5029b1c..6523a773e 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -595,9 +595,41 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const EMSESP::system_.healthcheck(n); } + if (command == "exclude") { + shell.printfln(F("Testing exclude entities")); + + Mqtt::ha_enabled(true); + Mqtt::send_response(false); + + run_test("boiler"); + + shell.invoke_command("call boiler wwseltemp"); + shell.invoke_command("call system publish"); + + // toggle mode + for (const auto & emsdevice : EMSESP::emsdevices) { + if (emsdevice->unique_id() == 1) { // boiler + uint8_t entity_id = 47; // wwseltemp + emsdevice->exclude_entity(entity_id); + break; + } + } + + shell.invoke_command("call boiler wwseltemp"); + shell.invoke_command("call system publish"); + } + if (command == "dv2") { shell.printfln(F("Testing device value lost")); + Mqtt::ha_enabled(true); + Mqtt::send_response(false); + + run_test("boiler"); + + shell.invoke_command("call boiler wwseltemp"); + shell.invoke_command("call system publish"); + // Boiler -> Me, UBAParameterWW(0x33) // wwseltemp = goes from 52 degrees (0x34) to void (0xFF) // it should delete the HA config topic homeassistant/sensor/ems-esp/boiler_wwseltemp/config @@ -608,6 +640,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const } if (command == "api_values") { +#ifndef EMSESP_DEBUG shell.printfln(F("Testing API getting values")); Mqtt::ha_enabled(false); Mqtt::nested_format(1); @@ -626,6 +659,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const EMSESP::webAPIService.webAPIService_get(&request); request.url("/api/boiler/values"); EMSESP::webAPIService.webAPIService_get(&request); +#endif } if (command == "mqtt_post") { diff --git a/src/test/test.h b/src/test/test.h index 58a2321de..f949b5f3b 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -35,7 +35,8 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "boiler" // #define EMSESP_DEBUG_DEFAULT "mqtt2" // #define EMSESP_DEBUG_DEFAULT "mqtt_nested" -#define EMSESP_DEBUG_DEFAULT "ha" +// #define EMSESP_DEBUG_DEFAULT "ha" +#define EMSESP_DEBUG_DEFAULT "exclude" // #define EMSESP_DEBUG_DEFAULT "board_profile" // #define EMSESP_DEBUG_DEFAULT "shower_alert" // #define EMSESP_DEBUG_DEFAULT "310" diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 0a2498150..a2a0103f0 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -216,13 +216,16 @@ void WebCustomizationService::exclude_entities(AsyncWebServerRequest * request, if (emsdevice) { uint8_t unique_device_id = json["id"]; if (emsdevice->unique_id() == unique_device_id) { - JsonArray entity_ids = json["entity_ids"]; + // first reset all the entity ids + emsdevice->reset_exclude_entities(); - std::vector temp; - for (JsonVariant id : entity_ids) { + // build a list of entities to exclude and then set the flag to non-visible + JsonArray entity_ids_json = json["entity_ids"]; + std::vector entity_ids; + for (JsonVariant id : entity_ids_json) { uint8_t entity_id = id.as(); emsdevice->exclude_entity(entity_id); // this will have immediate affect - temp.push_back(entity_id); + entity_ids.push_back(entity_id); } // Save the list to the customization file @@ -236,8 +239,8 @@ void WebCustomizationService::exclude_entities(AsyncWebServerRequest * request, if ((entityCustomization.product_id == product_id) && (entityCustomization.device_id == device_id)) { // already exists, clear the list and add the new values entityCustomization.entity_ids.clear(); - for (uint8_t i = 0; i < temp.size(); i++) { - entityCustomization.entity_ids.push_back(temp[i]); + for (uint8_t i = 0; i < entity_ids.size(); i++) { + entityCustomization.entity_ids.push_back(entity_ids[i]); } return StateUpdateResult::CHANGED; } @@ -246,8 +249,8 @@ void WebCustomizationService::exclude_entities(AsyncWebServerRequest * request, EntityCustomization new_entry; new_entry.product_id = product_id; new_entry.device_id = device_id; - for (uint8_t i = 0; i < temp.size(); i++) { - new_entry.entity_ids.push_back(temp[i]); + for (uint8_t i = 0; i < entity_ids.size(); i++) { + new_entry.entity_ids.push_back(entity_ids[i]); } settings.entityCustomizations.push_back(new_entry); return StateUpdateResult::CHANGED; From 005b9a88c3abe4cff5db087b698d5698c8b41bff Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 13 Feb 2022 21:44:16 +0100 Subject: [PATCH 047/319] update packages --- interface/package-lock.json | 44 ++++++++++++++++++------------------- interface/package.json | 4 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 19db12896..8cef8dd00 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -19,7 +19,7 @@ "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", - "axios": "^0.25.0", + "axios": "^0.26.0", "http-proxy-middleware": "^2.0.3", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -28,7 +28,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.3", + "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", @@ -4579,11 +4579,11 @@ } }, "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", + "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", "dependencies": { - "follow-redirects": "^1.14.7" + "follow-redirects": "^1.14.8" } }, "node_modules/axobject-query": { @@ -7979,9 +7979,9 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" }, "node_modules/follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "funding": [ { "type": "individual", @@ -14232,9 +14232,9 @@ } }, "node_modules/react-dropzone": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.3.tgz", - "integrity": "sha512-7yIthjpO90A1A6EZxriuuHRz2WDgTjmMoAtf0k9PpFzsVK3zNxmDetUe0xgrxwjNH0HcJjePi8KOewmbdpdQCg==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz", + "integrity": "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", @@ -20659,11 +20659,11 @@ "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==" }, "axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", + "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", "requires": { - "follow-redirects": "^1.14.7" + "follow-redirects": "^1.14.8" } }, "axobject-query": { @@ -23187,9 +23187,9 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "fork-ts-checker-webpack-plugin": { "version": "6.5.0", @@ -27565,9 +27565,9 @@ } }, "react-dropzone": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.3.tgz", - "integrity": "sha512-7yIthjpO90A1A6EZxriuuHRz2WDgTjmMoAtf0k9PpFzsVK3zNxmDetUe0xgrxwjNH0HcJjePi8KOewmbdpdQCg==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz", + "integrity": "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", diff --git a/interface/package.json b/interface/package.json index e8aa8e6bf..e702cb016 100644 --- a/interface/package.json +++ b/interface/package.json @@ -15,7 +15,7 @@ "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", - "axios": "^0.25.0", + "axios": "^0.26.0", "http-proxy-middleware": "^2.0.3", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -24,7 +24,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.1.11", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.3", + "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", From 70803b1a6dba3678ae7f84285c730d856858a2ab Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 13 Feb 2022 21:44:25 +0100 Subject: [PATCH 048/319] text change --- src/dallassensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index ee34789ba..d1eb9215f 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -407,7 +407,7 @@ void DallasSensor::remove_ha_topic(const std::string & id_str) { return; } #ifdef EMSESP_DEBUG - LOG_DEBUG(F("Removing HA config for sensor ID %s"), id_str.c_str()); + LOG_DEBUG(F("Removing HA config for temperature sensor ID %s"), id_str.c_str()); #endif // use '_' as HA doesn't like '-' in the topic name std::string sensorid = id_str; From a7c1a75996f52050856e26f19471156335858050 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 13 Feb 2022 21:44:36 +0100 Subject: [PATCH 049/319] added serial debug flag --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 826655d97..13f4a2ee1 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ CXX_STANDARD := -std=c++11 #---------------------------------------------------------------------- # Defined Symbols #---------------------------------------------------------------------- -DEFINES += -DFACTORY_WIFI_HOSTNAME=\"ems-esp\" -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_PROGMEM=1 -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0 -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_DEFAULT_BOARD_PROFILE=\"LOLIN\" +DEFINES += -DFACTORY_WIFI_HOSTNAME=\"ems-esp\" -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_PROGMEM=1 -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0 -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_USE_SERIAL -DEMSESP_DEFAULT_BOARD_PROFILE=\"LOLIN\" #---------------------------------------------------------------------- # Sources & Files From 7f21bea8a62ff6a1be59d9d9d9de5c4be88b8569 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 15:41:12 +0100 Subject: [PATCH 050/319] Thermostat: RC20 temperatures, RC300 roominflfactor, fetch monitor --- src/devices/thermostat.cpp | 127 +++++++++++++++++++++++++++++++++++-- src/devices/thermostat.h | 10 +++ src/locale_EN.h | 5 ++ 3 files changed, 136 insertions(+), 6 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 0c6e14ea1..279ead77c 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -80,10 +80,14 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i } else if (model == EMSdevice::EMS_DEVICE_FLAG_RC20) { monitor_typeids = {0x91}; set_typeids = {0xA8}; + curve_typeids = {0x90}; + timer_typeids = {0x8F}; if (actual_master_thermostat == device_id) { for (uint8_t i = 0; i < monitor_typeids.size(); i++) { register_telegram_type(monitor_typeids[i], F("RC20Monitor"), false, MAKE_PF_CB(process_RC20Monitor)); register_telegram_type(set_typeids[i], F("RC20Set"), false, MAKE_PF_CB(process_RC20Set)); + register_telegram_type(curve_typeids[i], F("RC20Temp"), false, MAKE_PF_CB(process_RC20Temp)); + register_telegram_type(timer_typeids[i], F("RC20Timer"), false, MAKE_PF_CB(process_RC20Timer)); } } // remote thermostat uses only 0xAF, register it also for master (in case of early detect) @@ -345,6 +349,9 @@ std::shared_ptr Thermostat::heating_circuit(std::sha } // set the flag saying we want its data during the next auto fetch + // monitor is broadcasted, but not frequently in some thermostats (IVT, #356) + toggle_fetch(monitor_typeids[hc_num - 1], toggle_); + if (set_typeids.size()) { toggle_fetch(set_typeids[hc_num - 1], toggle_); } @@ -384,7 +391,7 @@ void Thermostat::publish_ha_config_hc(std::shared_ptrroomTemp); - if (Mqtt::nested_format() == 1) { + if (Mqtt::is_nested()) { // nested format snprintf(hc_mode_s, sizeof(hc_mode_s), "value_json.hc%d.mode", hc_num); snprintf(seltemp_s, sizeof(seltemp_s), "{{value_json.hc%d.seltemp}}", hc_num); @@ -727,6 +734,48 @@ void Thermostat::process_RC20Set(std::shared_ptr telegram) { has_update(telegram, hc->manualtemp, 29); } +// 0x90 - for reading curve temperature from the RC20 thermostat (0x17) +// +void Thermostat::process_RC20Temp(std::shared_ptr telegram) { + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } + has_update(telegram, hc->nighttemp, 3); // 0:off, 1:manual, 2:auto + has_update(telegram, hc->daylowtemp, 4); + has_update(telegram, hc->daymidtemp, 5); + has_update(telegram, hc->daytemp, 6); +} + +// 0x8F - for reading timer from the RC20 thermostat (0x17) +// data: 04 5D 01 78 24 5D 21 6E 43 5D 41 78 64 5D 61 78 84 5D 81 78 E7 90 E7 90 E7 90 E7 +// data: 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 (offset 27) +// data: E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 90 E7 (offset 54) +// data: 90 E7 90 01 00 00 01 01 00 01 01 00 01 01 00 01 01 00 00 (offset 81) +void Thermostat::process_RC20Timer(std::shared_ptr telegram) { + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } + if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1)) + || (!telegram->offset && telegram->message_length > 1 && !strlen(hc->switchtime1))) { + char data[sizeof(hc->switchtime1)]; + uint8_t no = telegram->offset / 2; + uint8_t day = telegram->message_data[0] >> 5; + uint8_t temp = telegram->message_data[0] & 1; + uint8_t time = telegram->message_data[1]; + + std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + if (day == 7) { + snprintf(data, sizeof(data), "%02d not_set", no); + } else { + snprintf(data, sizeof(data), "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), temp); + } + strlcpy(hc->switchtime1, data, sizeof(hc->switchtime1)); + has_update(hc->switchtime1); // always publish + } +} + // type 0xAE - data from the RC20 thermostat (0x17) - not for RC20's // 17 00 AE 00 80 12 2E 00 D0 00 00 64 (#data=8) // https://github.com/emsesp/EMS-ESP/issues/361 @@ -1022,6 +1071,7 @@ void Thermostat::process_RC300Summer(std::shared_ptr telegram) { } has_update(telegram, hc->roominfluence, 0); + has_update(telegram, hc->roominfl_factor, 1); // is * 10 has_update(telegram, hc->offsettemp, 2); if (!is_fetch(summer2_typeids[hc->hc()])) { has_update(telegram, hc->summertemp, 6); @@ -1911,6 +1961,23 @@ bool Thermostat::set_datetime(const char * value, const int8_t id) { return true; } +// set RC300 roominfluence factor +bool Thermostat::set_roominfl_factor(const char * value, const int8_t id) { + uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; + std::shared_ptr hc = heating_circuit(hc_num); + if (hc == nullptr) { + return false; + } + float val = 0; + if (!Helpers::value2float(value, val)) { + return false; + } + + write_command(summer_typeids[hc->hc()], 1, (uint8_t)(val * 10)); + + return true; +} + // sets the thermostat working mode, where mode is a string // converts string mode to HeatingCircuit::Mode bool Thermostat::set_mode(const char * value, const int8_t id) { @@ -2302,14 +2369,25 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char data[1] = time; } - if (no > 41 || time > 0x90 || (on > 1 && on != 7)) { - LOG_WARNING(F("Setting switchtime: Invalid data: %s"), value); + uint8_t max_on = 3; + if ((model() == EMS_DEVICE_FLAG_RC35) || (model() == EMS_DEVICE_FLAG_RC30_N)) { + max_on = 1; + } + if (no > 41 || time > 0x90 || (on > max_on && on != 7)) { + // LOG_WARNING(F("Setting switchtime: Invalid data: %s"), value); // LOG_WARNING(F("Setting switchtime: Invalid data: %02d.%1d.0x%02X.%1d"), no, day, time, on); return false; } if (data[0] != 0xE7) { std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); - snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); + if ((model() == EMS_DEVICE_FLAG_RC35) || (model() == EMS_DEVICE_FLAG_RC30_N)) { + snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); + } else if (model() == EMS_DEVICE_FLAG_RC20) { + snprintf(out, len, "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on); + } else { + std::string son = read_flash_string(FL_(enum_switchmode)[on]); + snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), son.c_str()); + } } else { snprintf(out, len, "%02d not_set", no); } @@ -2449,6 +2527,26 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co } } else if (model == EMS_DEVICE_FLAG_RC20) { switch (mode) { + case HeatingCircuit::Mode::NIGHT: + offset = 3; + set_typeid = curve_typeids[hc->hc()]; + validate_typeid = set_typeid; + break; + case HeatingCircuit::Mode::DAYLOW: + offset = 4; + set_typeid = curve_typeids[hc->hc()]; + validate_typeid = set_typeid; + break; + case HeatingCircuit::Mode::DAYMID: + offset = 5; + set_typeid = curve_typeids[hc->hc()]; + validate_typeid = set_typeid; + break; + case HeatingCircuit::Mode::DAY: + offset = 6; + set_typeid = curve_typeids[hc->hc()]; + validate_typeid = set_typeid; + break; case HeatingCircuit::Mode::MANUAL: offset = EMS_OFFSET_RC20Set_temp_manual; break; @@ -2482,7 +2580,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = 0x0A; // manual offset break; case HeatingCircuit::Mode::TEMPAUTO: - offset = 0x08; // manual offset + offset = 0x08; // auto offset if (temperature == -1) { factor = 1; // to write 0xFF } @@ -2758,6 +2856,14 @@ bool Thermostat::set_daytemp(const char * value, const int8_t id) { return set_temperature_value(value, id, HeatingCircuit::Mode::DAY); } +bool Thermostat::set_daylowtemp(const char * value, const int8_t id) { + return set_temperature_value(value, id, HeatingCircuit::Mode::DAYLOW); +} + +bool Thermostat::set_daymidtemp(const char * value, const int8_t id) { + return set_temperature_value(value, id, HeatingCircuit::Mode::DAYMID); +} + bool Thermostat::set_comforttemp(const char * value, const int8_t id) { return set_temperature_value(value, id, HeatingCircuit::Mode::COMFORT); } @@ -3101,7 +3207,9 @@ void Thermostat::register_device_values() { FL_(div10), FL_(ibaCalIntTemperature), DeviceValueUOM::DEGREES_R, - MAKE_CF_CB(set_calinttemp)); + MAKE_CF_CB(set_calinttemp), + -5, + 5); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, @@ -3269,6 +3377,8 @@ void Thermostat::register_device_values_hc(std::shared_ptrminflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, nullptr, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence)); + register_device_value( + tag, &hc->roominfl_factor, DeviceValueType::UINT, FL_(div10), FL_(roominfl_factor), DeviceValueUOM::NONE, MAKE_CF_CB(set_roominfl_factor)); register_device_value(tag, &hc->curroominfl, DeviceValueType::SHORT, FL_(div10), FL_(curroominfl), DeviceValueUOM::DEGREES_R); register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, nullptr, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, nullptr, FL_(targetflowtemp), DeviceValueUOM::DEGREES); @@ -3292,6 +3402,11 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &hc->manualtemp, DeviceValueType::UINT, FL_(div2), FL_(manualtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_manualtemp)); + register_device_value(tag, &hc->daylowtemp, DeviceValueType::UINT, FL_(div2), FL_(daylowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daylowtemp)); + register_device_value(tag, &hc->daymidtemp, DeviceValueType::UINT, FL_(div2), FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); + register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); + register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value(tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime), FL_(switchtime), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); break; case EMS_DEVICE_FLAG_RC20_N: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 9b38069b9..dc2d20771 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -43,6 +43,8 @@ class Thermostat : public EMSdevice { uint8_t summermode; uint8_t holidaymode; uint8_t daytemp; + uint8_t daylowtemp; + uint8_t daymidtemp; uint8_t nighttemp; uint8_t holidaytemp; uint8_t heatingtype; // type of heating: 1 radiator, 2 convectors, 3 floors, 4 room supply @@ -54,6 +56,7 @@ class Thermostat : public EMSdevice { uint8_t manualtemp; uint8_t summer_setmode; uint8_t roominfluence; + uint8_t roominfl_factor; int16_t curroominfl; uint8_t flowtempoffset; uint8_t minflowtemp; @@ -125,6 +128,8 @@ class Thermostat : public EMSdevice { TEMPAUTO, NOREDUCE, ON, + DAYLOW, + DAYMID, UNKNOWN }; @@ -313,6 +318,8 @@ class Thermostat : public EMSdevice { void process_RC30Set(std::shared_ptr telegram); void process_RC20Monitor(std::shared_ptr telegram); void process_RC20Set(std::shared_ptr telegram); + void process_RC20Temp(std::shared_ptr telegram); + void process_RC20Timer(std::shared_ptr telegram); void process_RC20Remote(std::shared_ptr telegram); void process_RC20Monitor_2(std::shared_ptr telegram); void process_RC20Set_2(std::shared_ptr telegram); @@ -358,6 +365,8 @@ class Thermostat : public EMSdevice { bool set_temp(const char * value, const int8_t id); bool set_nighttemp(const char * value, const int8_t id); bool set_daytemp(const char * value, const int8_t id); + bool set_daylowtemp(const char * value, const int8_t id); + bool set_daymidtemp(const char * value, const int8_t id); bool set_comforttemp(const char * value, const int8_t id); bool set_nofrosttemp(const char * value, const int8_t id); bool set_ecotemp(const char * value, const int8_t id); @@ -371,6 +380,7 @@ class Thermostat : public EMSdevice { bool set_noreducetemp(const char * value, const int8_t id); bool set_remotetemp(const char * value, const int8_t id); bool set_roominfluence(const char * value, const int8_t id); + bool set_roominfl_factor(const char * value, const int8_t id); bool set_flowtempoffset(const char * value, const int8_t id); bool set_minflowtemp(const char * value, const int8_t id); bool set_maxflowtemp(const char * value, const int8_t id); diff --git a/src/locale_EN.h b/src/locale_EN.h index e1356b759..0afdb0b1b 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -545,6 +545,7 @@ MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("maximum temperature")) MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("one time key function")) // mqtt values / commands +MAKE_PSTR_LIST(switchtime, F("switchtime"), F("program switchtime")) MAKE_PSTR_LIST(switchtime1, F("switchtime1"), F("own1 program switchtime")) MAKE_PSTR_LIST(switchtime2, F("switchtime2"), F("own2 program switchtime")) MAKE_PSTR_LIST(wwswitchtime, F("wwswitchtime"), F("program switchtime")) @@ -585,6 +586,9 @@ MAKE_PSTR_LIST(mode, F("mode"), F("mode")) MAKE_PSTR_LIST(modetype, F("modetype"), F("mode type")) MAKE_PSTR_LIST(fastheatup, F("fastheatup"), F("fast heatup")) MAKE_PSTR_LIST(daytemp, F("daytemp"), F("day temperature")) +MAKE_PSTR_LIST(daylowtemp, F("daytemp2"), F("day temperature T2")) +MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("day temperature T3")) +MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("day temperature T4")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco temperature")) @@ -597,6 +601,7 @@ MAKE_PSTR_LIST(offsettemp, F("offsettemp"), F("offset temperature")) MAKE_PSTR_LIST(minflowtemp, F("minflowtemp"), F("min flow temperature")) MAKE_PSTR_LIST(maxflowtemp, F("maxflowtemp"), F("max flow temperature")) MAKE_PSTR_LIST(roominfluence, F("roominfluence"), F("room influence")) +MAKE_PSTR_LIST(roominfl_factor, F("roominflfactor"), F("room influence factor")) MAKE_PSTR_LIST(curroominfl, F("curroominfl"), F("current room influence")) MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("nofrost temperature")) MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("target flow temperature")) From 7bb6f551538696b413f92daadaed287ece0c6600 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 17:02:54 +0100 Subject: [PATCH 051/319] solar fix SM10 energy, remove unknowns --- src/devices/solar.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index 0eeeb2a22..68650deaa 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -155,10 +155,6 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c FL_(solarPumpTurnoffDiff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_TurnoffDiff)); - register_device_value( - DeviceValueTAG::TAG_NONE, &setting3_, DeviceValueType::UINT, nullptr, FL_(setting3), DeviceValueUOM::NONE, MAKE_CF_CB(set_CollectorMaxTemp)); - register_device_value( - DeviceValueTAG::TAG_NONE, &setting4_, DeviceValueType::UINT, nullptr, FL_(setting4), DeviceValueUOM::NONE, MAKE_CF_CB(set_CollectorMinTemp)); register_device_value(DeviceValueTAG::TAG_NONE, &solarPower_, DeviceValueType::SHORT, nullptr, FL_(solarPower), DeviceValueUOM::W); register_device_value(DeviceValueTAG::TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); register_device_value(DeviceValueTAG::TAG_NONE, &maxFlow_, DeviceValueType::UINT, FL_(div10), FL_(maxFlow), DeviceValueUOM::LMIN, MAKE_CF_CB(set_SM10MaxFlow)); @@ -177,10 +173,16 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c DeviceValueUOM::NONE, MAKE_CF_CB(set_solarEnabled)); + /* unknown values for testing and logging. Used by MichaelDvP + register_device_value( + DeviceValueTAG::TAG_NONE, &setting3_, DeviceValueType::UINT, nullptr, FL_(setting3), DeviceValueUOM::NONE, MAKE_CF_CB(set_CollectorMaxTemp)); + register_device_value( + DeviceValueTAG::TAG_NONE, &setting4_, DeviceValueType::UINT, nullptr, FL_(setting4), DeviceValueUOM::NONE, MAKE_CF_CB(set_CollectorMinTemp)); register_device_value(DeviceValueTAG::TAG_NONE, &data11_, DeviceValueType::UINT, nullptr, FL_(data11), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_NONE, &data12_, DeviceValueType::UINT, nullptr, FL_(data12), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_NONE, &data1_, DeviceValueType::UINT, nullptr, FL_(data1), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_NONE, &data0_, DeviceValueType::UINT, nullptr, FL_(data0), DeviceValueUOM::NONE); + */ } if (flags == EMSdevice::EMS_DEVICE_FLAG_ISM) { register_device_value(DeviceValueTAG::TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); @@ -400,6 +402,7 @@ void Solar::process_SM10Config(std::shared_ptr telegram) { } // SM10Monitor - type 0x97 +// Solar(0x30) -> All(0x00), SM10Monitor(0x97), data: 00 00 00 22 00 00 D2 01 00 F6 2A 00 00 void Solar::process_SM10Monitor(std::shared_ptr telegram) { uint8_t solarpumpmod = solarPumpMod_; @@ -436,11 +439,11 @@ void Solar::process_SM10Monitor(std::shared_ptr telegram) { energy.pop_front(); } energy.push_back(solarPower_); - uint32_t sum = 0; + int32_t sum = 0; for (auto e : energy) { sum += e; } - energyLastHour_ = sum / 6; // counts in 0.1 Wh + energyLastHour_ = sum > 0 ? sum / 6 : 0; // counts in 0.1 Wh has_update(&solarPower_); has_update(&energyLastHour_); } From 7f5e0f7244c3bc76726aa0fe2b946d35094bc7a4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 17:59:53 +0100 Subject: [PATCH 052/319] Mqtt: remove all HA if not active, timeout QoS, option single2cmd --- .../src/framework/mqtt/MqttSettingsForm.tsx | 56 +++++--- interface/src/types/mqtt.ts | 1 + lib/framework/MqttSettingsService.cpp | 16 ++- lib/framework/MqttSettingsService.h | 1 + src/dallassensor.cpp | 6 +- src/default_settings.h | 8 +- src/emsdevice.cpp | 18 ++- src/mqtt.cpp | 122 ++++++++++++------ src/mqtt.h | 39 +++--- src/web/WebDataService.cpp | 2 +- 10 files changed, 169 insertions(+), 100 deletions(-) diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index 1d609ff33..e251bbcf9 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -183,29 +183,43 @@ const MqttSettingsForm: FC = () => { control={} label="Publish command output to a 'response' topic" /> - } - label="Publish single value topics on change" - /> - - } - label="Enable MQTT Discovery (for Home Assistant, Domoticz)" - /> - - {data.ha_enabled && ( - - + + } + label="Publish single value topics on change" /> - )} + {data.publish_single && ( + + } + label="publish to command topics (ioBroker)" + /> + + )} + + + + } + label="Enable MQTT Discovery (for Home Assistant, Domoticz)" + /> + + {data.ha_enabled && ( + + + + )} + Publish Intervals (in seconds, 0=automatic) diff --git a/interface/src/types/mqtt.ts b/interface/src/types/mqtt.ts index a372f217f..1e2b50a00 100644 --- a/interface/src/types/mqtt.ts +++ b/interface/src/types/mqtt.ts @@ -40,5 +40,6 @@ export interface MqttSettings { nested_format: number; send_response: boolean; publish_single: boolean; + publish_single2cmd: boolean; discovery_prefix: string; } diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp index df9866958..561d7926d 100644 --- a/lib/framework/MqttSettingsService.cpp +++ b/lib/framework/MqttSettingsService.cpp @@ -176,6 +176,7 @@ void MqttSettings::read(MqttSettings & settings, JsonObject & root) { root["nested_format"] = settings.nested_format; root["discovery_prefix"] = settings.discovery_prefix; root["publish_single"] = settings.publish_single; + root["publish_single2cmd"] = settings.publish_single2cmd; root["send_response"] = settings.send_response; } @@ -203,11 +204,12 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting newSettings.publish_time_other = root["publish_time_other"] | EMSESP_DEFAULT_PUBLISH_TIME; newSettings.publish_time_sensor = root["publish_time_sensor"] | EMSESP_DEFAULT_PUBLISH_TIME; - newSettings.ha_enabled = root["ha_enabled"] | EMSESP_DEFAULT_HA_ENABLED; - newSettings.nested_format = root["nested_format"] | EMSESP_DEFAULT_NESTED_FORMAT; - newSettings.discovery_prefix = root["discovery_prefix"] | EMSESP_DEFAULT_DISCOVERY_PREFIX; - newSettings.publish_single = root["publish_single"] | EMSESP_DEFAULT_PUBLISH_SINGLE; - newSettings.send_response = root["send_response"] | EMSESP_DEFAULT_SEND_RESPONSE; + newSettings.ha_enabled = root["ha_enabled"] | EMSESP_DEFAULT_HA_ENABLED; + newSettings.nested_format = root["nested_format"] | EMSESP_DEFAULT_NESTED_FORMAT; + newSettings.discovery_prefix = root["discovery_prefix"] | EMSESP_DEFAULT_DISCOVERY_PREFIX; + newSettings.publish_single = root["publish_single"] | EMSESP_DEFAULT_PUBLISH_SINGLE; + newSettings.publish_single2cmd = root["publish_single2cmd"] | EMSESP_DEFAULT_PUBLISH_SINGLE2CMD; + newSettings.send_response = root["send_response"] | EMSESP_DEFAULT_SEND_RESPONSE; if (newSettings.enabled != settings.enabled) { changed = true; @@ -230,6 +232,10 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting changed = true; } + if (newSettings.publish_single2cmd != settings.publish_single2cmd) { + changed = true; + } + if (newSettings.send_response != settings.send_response) { changed = true; } diff --git a/lib/framework/MqttSettingsService.h b/lib/framework/MqttSettingsService.h index f51efb6a8..560e29c96 100644 --- a/lib/framework/MqttSettingsService.h +++ b/lib/framework/MqttSettingsService.h @@ -90,6 +90,7 @@ class MqttSettings { uint8_t nested_format; String discovery_prefix; bool publish_single; + bool publish_single2cmd; bool send_response; static void read(MqttSettings & settings, JsonObject & root); diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index d1eb9215f..fe7846a5b 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -395,7 +395,11 @@ bool DallasSensor::get_value_info(JsonObject & output, const char * cmd, const i void DallasSensor::publish_sensor(const Sensor & sensor) { if (Mqtt::publish_single()) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "%s/%s", read_flash_string(F_(dallassensor)).c_str(), sensor.name().c_str()); + if (Mqtt::publish_single2cmd()) { + snprintf(topic, sizeof(topic), "%s/%s", read_flash_string(F_(dallassensor)).c_str(), sensor.name().c_str()); + } else { + snprintf(topic, sizeof(topic), "%s%s/%s", read_flash_string(F_(dallassensor)).c_str(), "_data", sensor.name().c_str()); + } char payload[10]; Mqtt::publish(topic, Helpers::render_value(payload, sensor.temperature_c, 10, EMSESP::system_.fahrenheit() ? 2 : 0)); } diff --git a/src/default_settings.h b/src/default_settings.h index d399f9ace..b70fef920 100644 --- a/src/default_settings.h +++ b/src/default_settings.h @@ -128,10 +128,6 @@ #define EMSESP_DEFAULT_BOOL_FORMAT 1 // on/off #endif -#ifndef EMSESP_DEFAULT_HA_CLIMATE_FORMAT -#define EMSESP_DEFAULT_HA_CLIMATE_FORMAT 1 // current temp -#endif - #ifndef EMSESP_DEFAULT_MQTT_QOS #define EMSESP_DEFAULT_MQTT_QOS 0 #endif @@ -160,6 +156,10 @@ #define EMSESP_DEFAULT_PUBLISH_SINGLE false #endif +#ifndef EMSESP_DEFAULT_PUBLISH_SINGLE2CMD +#define EMSESP_DEFAULT_PUBLISH_SINGLE2CMD false +#endif + #ifndef EMSESP_DEFAULT_SEND_RESPONSE #define EMSESP_DEFAULT_SEND_RESPONSE false #endif diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 52ed4be07..0306e4b10 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -533,16 +533,26 @@ void EMSdevice::publish_value(void * value_p) { for (auto & dv : devicevalues_) { if (dv.value_p == value_p && dv.has_state(DeviceValueState::DV_VISIBLE)) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - if ((dv.tag >= DeviceValueTAG::TAG_HC1 && dv.tag <= DeviceValueTAG::TAG_HC8) - || (dv.tag >= DeviceValueTAG::TAG_WWC1 && dv.tag <= DeviceValueTAG::TAG_WWC4)) { + if (Mqtt::publish_single2cmd()) { + if ((dv.tag >= DeviceValueTAG::TAG_HC1 && dv.tag <= DeviceValueTAG::TAG_WWC4)) { + snprintf(topic, + sizeof(topic), + "%s/%s/%s", + device_type_2_device_name(device_type_).c_str(), + tag_to_mqtt(dv.tag).c_str(), + read_flash_string(dv.short_name).c_str()); + } else { + snprintf(topic, sizeof(topic), "%s/%s", device_type_2_device_name(device_type_).c_str(), read_flash_string(dv.short_name).c_str()); + } + } else if (Mqtt::is_nested() && dv.tag >= DeviceValueTAG::TAG_HC1) { snprintf(topic, sizeof(topic), "%s/%s/%s", - device_type_2_device_name(device_type_).c_str(), + Mqtt::tag_to_topic(device_type_, dv.tag).c_str(), tag_to_mqtt(dv.tag).c_str(), read_flash_string(dv.short_name).c_str()); } else { - snprintf(topic, sizeof(topic), "%s/%s", device_type_2_device_name(device_type_).c_str(), read_flash_string(dv.short_name).c_str()); + snprintf(topic, sizeof(topic), "%s/%s", Mqtt::tag_to_topic(device_type_, dv.tag).c_str(), read_flash_string(dv.short_name).c_str()); } int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 5158a3643..ddd6d1b69 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -41,6 +41,7 @@ uint8_t Mqtt::nested_format_; std::string Mqtt::discovery_prefix_; bool Mqtt::send_response_; bool Mqtt::publish_single_; +bool Mqtt::publish_single2cmd_; std::deque Mqtt::mqtt_messages_; std::vector Mqtt::mqtt_subfunctions_; @@ -264,6 +265,14 @@ void Mqtt::on_message(const char * topic, const char * payload, size_t len) { LOG_DEBUG(F("Received topic `%s`"), topic); } #endif + // remove HA topics if we don't use discovery + if (strncmp(topic, discovery_prefix().c_str(), discovery_prefix().size()) == 0) { + if (!ha_enabled_ && len) { // don't ping pong the empty message + queue_publish_message(topic, "", true); + LOG_DEBUG(F("Remove topic %s"), topic); + } + return; + } // check first againts any of our subscribed topics for (const auto & mf : mqtt_subfunctions_) { @@ -290,7 +299,7 @@ void Mqtt::on_message(const char * topic, const char * payload, size_t len) { // convert payload into a json doc // if the payload doesn't not contain the key 'value' or 'data', treat the whole payload as the 'value' if (len != 0) { - DeserializationError error = deserializeJson(input_doc, message); + DeserializationError error = deserializeJson(input_doc, (const char *)message); if ((!input_doc.containsKey("value") && !input_doc.containsKey("data")) || error) { input_doc.clear(); input_doc["value"] = (const char *)message; // always a string @@ -387,15 +396,16 @@ void Mqtt::reset_mqtt() { void Mqtt::load_settings() { EMSESP::esp8266React.getMqttSettingsService()->read([&](MqttSettings & mqttSettings) { - mqtt_base_ = mqttSettings.base.c_str(); // Convert String to std::string - mqtt_qos_ = mqttSettings.mqtt_qos; - mqtt_retain_ = mqttSettings.mqtt_retain; - mqtt_enabled_ = mqttSettings.enabled; - ha_enabled_ = mqttSettings.ha_enabled; - nested_format_ = mqttSettings.nested_format; - publish_single_ = mqttSettings.publish_single; - send_response_ = mqttSettings.send_response; - discovery_prefix_ = mqttSettings.discovery_prefix.c_str(); + mqtt_base_ = mqttSettings.base.c_str(); // Convert String to std::string + mqtt_qos_ = mqttSettings.mqtt_qos; + mqtt_retain_ = mqttSettings.mqtt_retain; + mqtt_enabled_ = mqttSettings.enabled; + ha_enabled_ = mqttSettings.ha_enabled; + nested_format_ = mqttSettings.nested_format; + publish_single_ = mqttSettings.publish_single; + publish_single2cmd_ = mqttSettings.publish_single2cmd; + send_response_ = mqttSettings.send_response; + discovery_prefix_ = mqttSettings.discovery_prefix.c_str(); // convert to milliseconds publish_time_boiler_ = mqttSettings.publish_time_boiler * 1000; @@ -444,14 +454,6 @@ void Mqtt::start() { if (reason == AsyncMqttClientDisconnectReason::MQTT_NOT_AUTHORIZED) { LOG_INFO(F("MQTT disconnected: Not authorized")); } - // remove message with pending ack - if (!mqtt_messages_.empty()) { - auto mqtt_message = mqtt_messages_.front(); - if (mqtt_message.packet_id_ != 0) { - mqtt_messages_.pop_front(); - } - } - // mqtt_messages_.clear(); }); // create will_topic with the base prefixed. It has to be static because asyncmqttclient destroys the reference @@ -570,9 +572,23 @@ void Mqtt::on_connect() { #endif publish(F_(info), doc.as()); // topic called "info" - // create the EMS-ESP device in HA, which is MQTT retained - if (ha_enabled()) { - ha_status(); + if (ha_enabled_) { + queue_unsubscribe_message(discovery_prefix_ + "/climate/" + mqtt_base_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/sensor/" + mqtt_base_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/binary_sensor/" + mqtt_base_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/number/" + mqtt_base_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/select/" + mqtt_base_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/switch/" + mqtt_base_ + "/#"); + EMSESP::reset_mqtt_ha(); // re-create all HA devices if there are any + ha_status(); // create the EMS-ESP device in HA, which is MQTT retained + } else { + queue_subscribe_message(discovery_prefix_ + "/climate/" + mqtt_base_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/sensor/" + mqtt_base_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/binary_sensor/" + mqtt_base_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/number/" + mqtt_base_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/select/" + mqtt_base_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/switch/" + mqtt_base_ + "/#"); + LOG_INFO(F("start removing topics %s/+/%s/#"), discovery_prefix_.c_str(), mqtt_base_.c_str()); } // send initial MQTT messages for some of our services @@ -582,8 +598,6 @@ void Mqtt::on_connect() { // re-subscribe to all custom registered MQTT topics resubscribe(); - EMSESP::reset_mqtt_ha(); // re-create all HA devices if there are any - publish_retain(F("status"), "online", true); // say we're alive to the Last Will topic, with retain on mqtt_publish_fails_ = 0; // reset fail count to 0 @@ -669,6 +683,7 @@ std::shared_ptr Mqtt::queue_message(const uint8_t operation, if (mqtt_messages_.size() >= MAX_MQTT_MESSAGES) { mqtt_messages_.pop_front(); LOG_WARNING(F("Queue overflow, removing one message")); + mqtt_publish_fails_++; } mqtt_messages_.emplace_back(mqtt_message_id_++, std::move(message)); @@ -688,6 +703,11 @@ std::shared_ptr Mqtt::queue_subscribe_message(const std::stri return queue_message(Operation::SUBSCRIBE, topic, "", false); // no payload } +// add MQTT unsubscribe message to queue +std::shared_ptr Mqtt::queue_unsubscribe_message(const std::string & topic) { + return queue_message(Operation::UNSUBSCRIBE, topic, "", false); // no payload +} + // MQTT Publish, using a user's retain flag void Mqtt::publish(const std::string & topic, const std::string & payload) { queue_publish_message(topic, payload, mqtt_retain_); @@ -712,11 +732,6 @@ void Mqtt::publish(const std::string & topic, const JsonObject & payload) { publish_retain(topic, payload, mqtt_retain_); } -// no payload -void Mqtt::publish(const std::string & topic) { - queue_publish_message(topic, "", false); -} - // MQTT Publish, using a specific retain flag, topic is a flash string, forcing retain flag void Mqtt::publish_retain(const __FlashStringHelper * topic, const std::string & payload, bool retain) { queue_publish_message(read_flash_string(topic), payload, retain); @@ -750,7 +765,7 @@ void Mqtt::publish_ha(const std::string & topic) { LOG_DEBUG(F("[DEBUG] Publishing empty HA topic=%s"), fulltopic.c_str()); #endif - publish(fulltopic); + queue_publish_message(fulltopic, "", true); // publish with retain to remove from broker } // publish a Home Assistant config topic and payload, with retain flag off. @@ -792,12 +807,29 @@ void Mqtt::process_queue() { snprintf(topic, MQTT_TOPIC_MAX_SIZE, "%s/%s", mqtt_base_.c_str(), message->topic.c_str()); } + // if this has already been published and we're waiting for an ACK, don't publish again + // it will have a real packet ID + if (mqtt_message.packet_id_ > 0) { +#if defined(EMSESP_DEBUG) + LOG_DEBUG(F("[DEBUG] Waiting for QOS-ACK")); +#endif + // if we don't get the ack within 10 minutes, republish with new packet_id + if (uuid::get_uptime_sec() - last_publish_queue_ < 600) { + return; + } + } + last_publish_queue_ = uuid::get_uptime_sec(); + // if we're subscribing... if (message->operation == Operation::SUBSCRIBE) { LOG_DEBUG(F("Subscribing to topic '%s'"), topic); uint16_t packet_id = mqttClient_->subscribe(topic, mqtt_qos_); if (!packet_id) { + if (++mqtt_messages_.front().retry_count_ < MQTT_PUBLISH_MAX_RETRY) { + return; + } LOG_ERROR(F("Error subscribing to topic '%s'"), topic); + mqtt_publish_fails_++; // increment failure counter } mqtt_messages_.pop_front(); // remove the message from the queue @@ -805,12 +837,20 @@ void Mqtt::process_queue() { return; } - // if this has already been published and we're waiting for an ACK, don't publish again - // it will have a real packet ID - if (mqtt_message.packet_id_ > 0) { -#if defined(EMSESP_DEBUG) - LOG_DEBUG(F("[DEBUG] Waiting for QOS-ACK")); -#endif + // if we're unsubscribing... + if (message->operation == Operation::UNSUBSCRIBE) { + LOG_DEBUG(F("Subscribing to topic '%s'"), topic); + uint16_t packet_id = mqttClient_->unsubscribe(topic); + if (!packet_id) { + if (++mqtt_messages_.front().retry_count_ < MQTT_PUBLISH_MAX_RETRY) { + return; + } + LOG_ERROR(F("Error unsubscribing to topic '%s'"), topic); + mqtt_publish_fails_++; // increment failure counter + } + + mqtt_messages_.pop_front(); // remove the message from the queue + return; } @@ -992,8 +1032,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, return; } - bool have_tag = !EMSdevice::tag_to_string(tag).empty(); - bool is_nested = (nested_format_ == 1); // nested_format is 1 if nested, otherwise 2 for single topics + bool have_tag = !EMSdevice::tag_to_string(tag).empty(); // build the payload DynamicJsonDocument doc(EMSESP_JSON_SIZE_HA_CONFIG); @@ -1069,7 +1108,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // value template // if its nested mqtt format then use the appended entity name, otherwise take the original char val_tpl[75]; - if (is_nested) { + if (is_nested()) { snprintf(val_tpl, sizeof(val_tpl), "{{value_json.%s}}", new_entity); } else { snprintf(val_tpl, sizeof(val_tpl), "{{value_json.%s}}", read_flash_string(entity).c_str()); @@ -1193,10 +1232,11 @@ const std::string Mqtt::tag_to_topic(uint8_t device_type, uint8_t tag) { } // if there is a tag add it - if ((EMSdevice::tag_to_mqtt(tag).empty()) || ((nested_format_ == 1) && (device_type != EMSdevice::DeviceType::BOILER))) { - return EMSdevice::device_type_2_device_name(device_type) + "_data"; - } else { + if (!EMSdevice::tag_to_mqtt(tag).empty() + && ((device_type == EMSdevice::DeviceType::BOILER && tag == DeviceValueTAG::TAG_DEVICE_DATA_WW) || (!is_nested() && tag >= DeviceValueTAG::TAG_HC1))) { return EMSdevice::device_type_2_device_name(device_type) + "_data_" + EMSdevice::tag_to_mqtt(tag); + } else { + return EMSdevice::device_type_2_device_name(device_type) + "_data"; } } diff --git a/src/mqtt.h b/src/mqtt.h index 95b461de4..8fed88ec0 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -29,9 +29,6 @@ using uuid::console::Shell; -// time between HA publishes -#define MQTT_HA_PUBLISH_DELAY 50 - // size of queue #define MAX_MQTT_MESSAGES 300 @@ -70,16 +67,10 @@ class Mqtt { void set_publish_time_sensor(uint16_t publish_time); bool get_publish_onchange(uint8_t device_type); - enum Operation { PUBLISH, SUBSCRIBE }; + enum Operation : uint8_t { PUBLISH, SUBSCRIBE, UNSUBSCRIBE }; + enum NestedFormat : uint8_t { NESTED = 1, SINGLE }; - enum HA_Climate_Format : uint8_t { - CURRENT = 1, // 1 - SETPOINT, // 2 - ZERO // 3 - - }; - - static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = 128; // note this should really match the user setting in mqttSettings.maxTopicLength + static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = FACTORY_MQTT_MAX_TOPIC_LENGTH; // fixed, not a user setting anymore static void on_connect(); @@ -92,7 +83,6 @@ class Mqtt { static void publish(const std::string & topic, const JsonObject & payload); static void publish(const __FlashStringHelper * topic, const JsonObject & payload); static void publish(const __FlashStringHelper * topic, const std::string & payload); - static void publish(const std::string & topic); static void publish_retain(const std::string & topic, const JsonObject & payload, bool retain); static void publish_retain(const __FlashStringHelper * topic, const std::string & payload, bool retain); static void publish_retain(const __FlashStringHelper * topic, const JsonObject & payload, bool retain); @@ -125,10 +115,6 @@ class Mqtt { static void ha_status(); - void disconnect() { - mqttClient_->disconnect(); - } - #if defined(EMSESP_DEBUG) void incoming(const char * topic, const char * payload = ""); // for testing only #endif @@ -179,13 +165,10 @@ class Mqtt { static void reset_mqtt(); - // nested_format is 1 if nested, otherwise 2 for single topics - static uint8_t nested_format() { - return nested_format_; - } static bool is_nested() { - return nested_format_ == 1; + return nested_format_ == NestedFormat::NESTED; } + static void nested_format(uint8_t nested_format) { nested_format_ = nested_format; } @@ -193,6 +176,11 @@ class Mqtt { static bool publish_single() { return publish_single_; } + + static bool publish_single2cmd() { + return publish_single2cmd_; + } + static void publish_single(bool publish_single) { publish_single_ = publish_single; } @@ -200,6 +188,7 @@ class Mqtt { static bool ha_enabled() { return ha_enabled_; } + static void ha_enabled(bool ha_enabled) { ha_enabled_ = ha_enabled; } @@ -207,6 +196,7 @@ class Mqtt { static bool send_response() { return send_response_; } + static void send_response(bool send_response) { send_response_ = send_response; } @@ -232,7 +222,7 @@ class Mqtt { uint16_t packet_id_; ~QueuedMqttMessage() = default; - QueuedMqttMessage(uint16_t id, std::shared_ptr && content) + QueuedMqttMessage(uint32_t id, std::shared_ptr && content) : id_(id) , content_(std::move(content)) { retry_count_ = 0; @@ -254,6 +244,7 @@ class Mqtt { static std::shared_ptr queue_message(const uint8_t operation, const std::string & topic, const std::string & payload, bool retain); static std::shared_ptr queue_publish_message(const std::string & topic, const std::string & payload, bool retain); static std::shared_ptr queue_subscribe_message(const std::string & topic); + static std::shared_ptr queue_unsubscribe_message(const std::string & topic); void on_publish(uint16_t packetId); void on_message(const char * topic, const char * payload, size_t len); @@ -281,6 +272,7 @@ class Mqtt { uint32_t last_publish_mixer_ = 0; uint32_t last_publish_other_ = 0; uint32_t last_publish_sensor_ = 0; + uint32_t last_publish_queue_ = 0; static bool connecting_; static bool initialized_; @@ -303,6 +295,7 @@ class Mqtt { static uint8_t nested_format_; static std::string discovery_prefix_; static bool publish_single_; + static bool publish_single2cmd_; static bool send_response_; }; diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index c2efaffef..a012c2d35 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -144,7 +144,7 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) { obj["t"] = sensor.type(); if (sensor.type() != AnalogSensor::AnalogType::NOTUSED) { - obj["v"] = Helpers::round2(sensor.value(), 1); // is optional and is a float + obj["v"] = Helpers::round2(sensor.value(), 0); // is optional and is a float } } } From 073493cba23001dcaf53359d6a60f78a4f8ec537 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 18:35:25 +0100 Subject: [PATCH 053/319] analogsensors, outputs PWM, DAC, digital --- interface/src/project/DashboardData.tsx | 119 ++++++++++-- interface/src/project/types.ts | 34 +++- src/analogsensor.cpp | 233 +++++++++++++++++++----- src/analogsensor.h | 37 ++-- src/emsdevicevalue.h | 4 +- src/helpers.cpp | 4 + src/locale_DE.h | 12 +- src/locale_EN.h | 6 +- src/system.cpp | 103 +++++++---- src/web/WebCustomizationService.h | 2 +- src/web/WebDataService.cpp | 2 +- 11 files changed, 433 insertions(+), 123 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 36614e0f0..19047073c 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -59,7 +59,8 @@ import { DeviceValue, DeviceValueUOM, DeviceValueUOM_s, - AnalogTypes, + AnalogType, + AnalogTypeNames, Sensor, Analog } from './types'; @@ -715,7 +716,7 @@ const DashboardData: FC = () => { ))} - {analog.t === 3 && ( + {analog.t >= AnalogType.COUNTER && analog.t <= AnalogType.RATE && ( <> @@ -726,22 +727,37 @@ const DashboardData: FC = () => { ))} - - - mV - }} - /> - + {analog.t === AnalogType.ADC && ( + + mV + }} + /> + + )} + {analog.t === AnalogType.COUNTER && ( + + + + )} { )} + {analog.t === AnalogType.DIGITAL_OUT && (analog.i === 25 || analog.i === 26) && ( + <> + + + + + )} + {analog.t === AnalogType.DIGITAL_OUT && analog.i !== 25 && analog.i !== 26 && ( + <> + + + + + )} + {analog.t >= AnalogType.PWM_0 && ( + <> + + Hz + }} + /> + + + % + }} + + /> + + + )} Warning: be careful when assigning a GPIO! diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 1c0871691..b5f3a9497 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -176,7 +176,9 @@ export enum DeviceValueUOM { DBM, FAHRENHEIT, MV, - SQM + SQM, + M3, + L } export const DeviceValueUOM_s = [ @@ -199,10 +201,36 @@ export const DeviceValueUOM_s = [ '°F', 'mV', 'sqm', - "o'clock" + "m3", + "l" +]; + +export enum AnalogType { + NOTUSED = 0, + DIGITAL_IN, + COUNTER, + ADC, + TIMER, + RATE, + DIGITAL_OUT, + PWM_0, + PWM_1, + PWM_2 +} + +export const AnalogTypeNames = [ + '(disabled)', + 'Digital in', + 'Counter', + 'ADC', + 'Timer', + 'Rate', + 'Digital out', + 'PWM 0', + 'PWM 1', + 'PWM 2' ]; -export const AnalogTypes = ['(disabled)', 'Digital in', 'Counter', 'ADC']; type BoardProfiles = { [name: string]: string; diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 734b9e441..5ea7dffac 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -27,7 +27,7 @@ void AnalogSensor::start() { reload(); // fetch the list of sensors from our customization service if (analog_enabled_) { - analogSetAttenuation(ADC_2_5db); // for all channels + analogSetAttenuation(ADC_2_5db); // for all channels 1.5V } LOG_INFO(F("Starting Analog sensor service")); @@ -40,10 +40,15 @@ void AnalogSensor::start() { F_(info_cmd)); Command::add( EMSdevice::DeviceType::ANALOGSENSOR, - F_(counter), - [&](const char * value, const int8_t id) { return command_counter(value, id); }, - F("set counter value"), + F_(setvalue), + [&](const char * value, const int8_t id) { return command_setvalue(value, id); }, + F("set io value"), CommandFlag::ADMIN_ONLY); + Command::add( + EMSdevice::DeviceType::ANALOGSENSOR, + F_(commands), + [&](const char * value, const int8_t id, JsonObject & output) { return command_commands(value, id, output); }, + F_(commands_cmd)); } // load settings from the customization file, sorts them and initializes the GPIOs @@ -58,11 +63,47 @@ void AnalogSensor::reload() { // and store them locally and then activate them EMSESP::webCustomizationService.read([&](WebCustomization & settings) { auto sensors = settings.analogCustomizations; - sensors_.clear(); // start with an empty list - if (sensors.size() != 0) { - for (auto & sensor : sensors) { + auto it = sensors_.begin(); + for (auto & sensor_ : sensors_) { + // update existing sensors + bool found = false; + for (auto & sensor : sensors) { //search customlist + if (sensor_.id() == sensor.id) { + // for output sensors set value to new start-value + if ((sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) + && (sensor_.type() != sensor.type || sensor_.offset() != sensor.offset || sensor_.factor() != sensor.factor)) { + sensor_.set_value(sensor.offset); + } + sensor_.set_name(sensor.name); + sensor_.set_type(sensor.type); + sensor_.set_offset(sensor.offset); + sensor_.set_factor(sensor.factor); + sensor_.set_uom(sensor.uom); + sensor_.ha_registered = false; + found = true; + } + } + if (!found) { + sensors_.erase(it); + } + it++; + } + // add new sensors from list + for (auto & sensor : sensors) { + bool found = false; + for (auto & sensor_ : sensors_) { + if (sensor_.id() == sensor.id) { + found = true; + } + } + if (!found) { sensors_.emplace_back(sensor.id, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type); sensors_.back().ha_registered = false; // this will trigger recrate of the HA config + if (sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) { + sensors_.back().set_value(sensor.offset); + } else { + sensors_.back().set_value(0); // reset value only for new sensors + } } } return true; @@ -82,11 +123,21 @@ void AnalogSensor::reload() { } else if (sensor.type() == AnalogType::COUNTER) { LOG_DEBUG(F("Adding analog I/O Counter sensor on GPIO%d"), sensor.id()); pinMode(sensor.id(), INPUT_PULLUP); - sensor.set_value(0); // reset count - sensor.set_uom(0); // no uom, just for safe measures + if (sensor.id() == 25 || sensor.id() == 26) { + dacWrite(sensor.id(), 255); + } sensor.polltime_ = 0; sensor.poll_ = digitalRead(sensor.id()); publish_sensor(sensor); + } else if (sensor.type() == AnalogType::TIMER || sensor.type() == AnalogType::RATE) { + LOG_DEBUG(F("Adding analog Timer/Rate sensor on GPIO%d"), sensor.id()); + pinMode(sensor.id(), INPUT_PULLUP); + sensor.polltime_ = uuid::get_uptime(); + sensor.last_polltime_ = uuid::get_uptime(); + sensor.poll_ = digitalRead(sensor.id()); + sensor.set_offset(0); + sensor.set_value(0); + publish_sensor(sensor); } else if (sensor.type() == AnalogType::DIGITAL_IN) { LOG_DEBUG(F("Adding analog Read sensor on GPIO%d"), sensor.id()); pinMode(sensor.id(), INPUT_PULLUP); @@ -95,18 +146,49 @@ void AnalogSensor::reload() { sensor.polltime_ = 0; sensor.poll_ = digitalRead(sensor.id()); publish_sensor(sensor); + } else if (sensor.type() == AnalogType::DIGITAL_OUT) { + LOG_DEBUG(F("Adding analog Write sensor on GPIO%d"), sensor.id()); + pinMode(sensor.id(), OUTPUT); + if (sensor.id() == 25 || sensor.id() == 26) { + if (sensor.offset() > 255) { + sensor.set_offset(255); + } else if (sensor.offset() < 0) { + sensor.set_offset(0); + } + dacWrite(sensor.id(), sensor.offset()); + sensor.set_value(sensor.offset()); + } else { + digitalWrite(sensor.id(), sensor.offset() > 0 ? 1 : 0); + sensor.set_value(digitalRead(sensor.id())); + } + sensor.set_uom(0); // no uom, just for safe measures + publish_sensor(sensor); + } else if (sensor.type() >= AnalogType::PWM_0) { + LOG_DEBUG(F("Adding PWM output sensor on GPIO%d"), sensor.id()); + uint channel = sensor.type() - AnalogType::PWM_0; + ledcSetup(channel, sensor.factor(), 13); + ledcAttachPin(sensor.id(), channel); + if (sensor.offset() > 100) { + sensor.set_offset(100); + } else if (sensor.offset() < 0) { + sensor.set_offset(0); + } + ledcWrite(channel, (uint32_t)(sensor.offset() * 8191 / 100)); + sensor.set_value(sensor.offset()); + sensor.set_uom(DeviceValueUOM::PERCENT); + publish_sensor(sensor); } } } -// measure and moving average adc +// measure input sensors and moving average adc void AnalogSensor::measure() { static uint32_t measure_last_ = 0; - // measure interval 500ms for analog sensors + // measure interval 500ms for adc sensors if (!measure_last_ || (uuid::get_uptime() - measure_last_) >= MEASURE_ANALOG_INTERVAL) { measure_last_ = uuid::get_uptime(); - // go through the list of ADC sensors + // go through the list of adc sensors for (auto & sensor : sensors_) { if (sensor.type() == AnalogType::ADC) { uint16_t a = analogReadMilliVolts(sensor.id()); // e.g. ADC1_CHANNEL_0_GPIO_NUM @@ -128,34 +210,38 @@ void AnalogSensor::measure() { } } } - // poll digital io every time + // poll digital io every time with debounce // go through the list of digital sensors for (auto & sensor : sensors_) { - if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::COUNTER) { + if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::COUNTER || sensor.type() == AnalogType::TIMER + || sensor.type() == AnalogType::RATE) { auto old_value = sensor.value(); // remember current value before reading auto current_reading = digitalRead(sensor.id()); - if (sensor.poll_ != current_reading) { // check for pinchange - sensor.polltime_ = uuid::get_uptime(); + if (sensor.poll_ != current_reading) { // check for pinchange + sensor.polltime_ = uuid::get_uptime(); // remember time of pinchange sensor.poll_ = current_reading; } - if (uuid::get_uptime() - sensor.polltime_ >= 15) { // debounce + // debounce and check for real pinchange + if (uuid::get_uptime() - sensor.polltime_ >= 15 && sensor.poll_ != sensor.last_reading_) { + sensor.last_reading_ = sensor.poll_; if (sensor.type() == AnalogType::DIGITAL_IN) { sensor.set_value(sensor.poll_); - } else if (sensor.type() == AnalogType::COUNTER) { - // capture reading and compare with the last one to see if there is high/low change - if (sensor.poll_ != sensor.last_reading_) { - sensor.last_reading_ = sensor.poll_; - if (!sensor.poll_) { - sensor.set_value(old_value + 1); - } + } else if (!sensor.poll_) { // falling edge + if (sensor.type() == AnalogType::COUNTER) { + sensor.set_value(old_value + sensor.factor()); + } else if (sensor.type() == AnalogType::RATE) { // dafault uom: Hz (1/sec) with factor 1 + sensor.set_value(sensor.factor() * 1000 / (sensor.polltime_ - sensor.last_polltime_)); + } else if (sensor.type() == AnalogType::TIMER) { // default seconds with factor 1 + sensor.set_value(sensor.factor() * (sensor.polltime_ - sensor.last_polltime_) / 1000); } + sensor.last_polltime_ = sensor.polltime_; } - // see if there is a change and increment # reads - if (old_value != sensor.value()) { - sensorreads_++; - changed_ = true; - publish_sensor(sensor); - } + } + // see if there is a change and increment # reads + if (old_value != sensor.value()) { + sensorreads_++; + changed_ = true; + publish_sensor(sensor); } } } @@ -170,7 +256,7 @@ void AnalogSensor::loop() { } // update analog information name and offset -bool AnalogSensor::update(uint8_t id, const std::string & name, uint16_t offset, float factor, uint8_t uom, int8_t type) { +bool AnalogSensor::update(uint8_t id, const std::string & name, float offset, float factor, uint8_t uom, int8_t type) { boolean found_sensor = false; // see if we can find the sensor in our customization list EMSESP::webCustomizationService.update( @@ -240,7 +326,11 @@ bool AnalogSensor::updated_values() { void AnalogSensor::publish_sensor(const Sensor & sensor) { if (Mqtt::publish_single()) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "%s/%s", read_flash_string(F_(analogsensor)).c_str(), sensor.name().c_str()); + if (Mqtt::publish_single2cmd()) { + snprintf(topic, sizeof(topic), "%s/%s", read_flash_string(F_(analogsensor)).c_str(), sensor.name().c_str()); + } else { + snprintf(topic, sizeof(topic), "%s%s/%s", read_flash_string(F_(analogsensor)).c_str(), "_data", sensor.name().c_str()); + } char payload[10]; Mqtt::publish(topic, Helpers::render_value(payload, sensor.value(), 2)); // always publish as floats } @@ -285,12 +375,16 @@ void AnalogSensor::publish_values(const bool force) { dataSensor["name"] = sensor.name(); switch (sensor.type()) { case AnalogType::COUNTER: - dataSensor["value"] = (uint16_t)sensor.value(); // convert to integer - break; + case AnalogType::TIMER: + case AnalogType::RATE: case AnalogType::ADC: + case AnalogType::PWM_0: + case AnalogType::PWM_1: + case AnalogType::PWM_2: dataSensor["value"] = (float)sensor.value(); // float break; case AnalogType::DIGITAL_IN: + case AnalogType::DIGITAL_OUT: default: dataSensor["value"] = (uint8_t)sensor.value(); // convert to char for 1 or 0 break; @@ -373,6 +467,15 @@ bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject dataSensor["uom"] = EMSdevice::uom_to_string(sensor.uom()); dataSensor["offset"] = sensor.offset(); dataSensor["factor"] = sensor.factor(); + } else if (sensor.type() == AnalogType::COUNTER) { + dataSensor["uom"] = EMSdevice::uom_to_string(sensor.uom()); + dataSensor["start_value"] = sensor.offset(); + dataSensor["factor"] = sensor.factor(); + } else if (sensor.type() == AnalogType::TIMER || sensor.type() == AnalogType::RATE) { + dataSensor["factor"] = sensor.factor(); + } else if (sensor.type() >= AnalogType::PWM_0) { + dataSensor["uom"] = EMSdevice::uom_to_string(sensor.uom()); + dataSensor["frequency"] = sensor.factor(); } dataSensor["value"] = sensor.value(); } else { @@ -384,7 +487,7 @@ bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject } // this creates the sensor, initializing everything -AnalogSensor::Sensor::Sensor(const uint8_t id, const std::string & name, const uint16_t offset, const float factor, const uint8_t uom, const int8_t type) +AnalogSensor::Sensor::Sensor(const uint8_t id, const std::string & name, const float offset, const float factor, const uint8_t uom, const int8_t type) : id_(id) , name_(name) , offset_(offset) @@ -405,28 +508,70 @@ std::string AnalogSensor::Sensor::name() const { } // set the counter value, id is gpio-no -bool AnalogSensor::command_counter(const char * value, const int8_t id) { - int val; - if (!Helpers::value2number(value, val)) { +bool AnalogSensor::command_setvalue(const char * value, const int8_t id) { + float val; + if (!Helpers::value2float(value, val)) { return false; } for (auto & sensor : sensors_) { - if (sensor.type() == AnalogType::COUNTER && sensor.id() == id) { - if (val < 0) { // negative values corrects - sensor.set_value(sensor.value() + val); - } else { // positive values are set + if (sensor.id() == id) { + if (sensor.type() == AnalogType::COUNTER) { + if (val < 0 || value[0] == '+') { // sign corrects values + sensor.set_offset(sensor.value() + val); + sensor.set_value(sensor.value() + val); + } else { // positive values are set + sensor.set_offset(val); + sensor.set_value(val); + } + publish_sensor(sensor); + return true; + } else if (sensor.type() == AnalogType::ADC) { + sensor.set_offset(val); + return true; + } else if (sensor.type() == AnalogType::DIGITAL_OUT) { + uint8_t v = val; + if ((sensor.id() == 25 || sensor.id() == 26) && v <= 255) { + sensor.set_offset(v); + sensor.set_value(v); + pinMode(sensor.id(), OUTPUT); + dacWrite(sensor.id(), sensor.offset()); + publish_sensor(sensor); + return true; + } else if (v == 0 || v == 1) { + sensor.set_offset(v); + sensor.set_value(v); + pinMode(sensor.id(), OUTPUT); + digitalWrite(sensor.id(), sensor.offset() > 0 ? 1 : 0); + publish_sensor(sensor); + return true; + } + } else if (sensor.type() >= AnalogType::PWM_0) { + uint8_t channel = sensor.type() - AnalogType::PWM_0; + if (val > 100) { + val = 100; + } else if (val < 0) { + val = 0; + } + sensor.set_offset(val); sensor.set_value(val); + ledcWrite(channel, (uint32_t)(val * 8191 / 100)); + publish_sensor(sensor); + return true; } - return true; } } return false; } +// list commands +bool AnalogSensor::command_commands(const char * value, const int8_t id, JsonObject & output) { + return Command::list(EMSdevice::DeviceType::ANALOGSENSOR, output); +} + // hard coded tests #ifdef EMSESP_DEBUG void AnalogSensor::test() { - // Sensor(const uint8_t id, const std::string & name, const uint16_t offset, const float factor, const uint8_t uom, const int8_t type); + // Sensor(const uint8_t id, const std::string & name, const float offset, const float factor, const uint8_t uom, const int8_t type); sensors_.emplace_back(36, "test12", 0, 0.1, 17, AnalogType::ADC); sensors_.back().set_value(12.4); diff --git a/src/analogsensor.h b/src/analogsensor.h index 70e94fd95..e48acd7e9 100644 --- a/src/analogsensor.h +++ b/src/analogsensor.h @@ -36,10 +36,10 @@ class AnalogSensor { public: class Sensor { public: - Sensor(const uint8_t id, const std::string & name, const uint16_t offset, const float factor, const uint8_t uom, const int8_t type); + Sensor(const uint8_t id, const std::string & name, const float offset, const float factor, const uint8_t uom, const int8_t type); ~Sensor() = default; - void set_offset(const uint16_t offset) { + void set_offset(const float offset) { offset_ = offset; } @@ -68,7 +68,7 @@ class AnalogSensor { factor_ = factor; } - uint16_t offset() const { + float offset() const { return offset_; } @@ -90,16 +90,18 @@ class AnalogSensor { bool ha_registered = false; - uint16_t analog_ = 0; // ADC - average value - uint32_t sum_ = 0; // ADC - rolling sum - uint16_t last_reading_ = 0; // IO COUNTER & ADC - last reading - uint32_t polltime_ = 0; // digital IO & COUNTER debounce time - int poll_ = 0; + uint16_t analog_ = 0; // ADC - average value + uint32_t sum_ = 0; // ADC - rolling sum + uint16_t last_reading_ = 0; // IO COUNTER & ADC - last reading + uint16_t count_ = 0; // counter raw counts + uint32_t polltime_ = 0; // digital IO & COUNTER debounce time + int poll_ = 0; + uint32_t last_polltime_ = 0; // for timer private: uint8_t id_; std::string name_; - uint16_t offset_; + float offset_; float factor_; uint8_t uom_; float value_; // float because of the factor is a float @@ -112,9 +114,15 @@ class AnalogSensor { enum AnalogType : int8_t { MARK_DELETED = -1, // mark for deletion NOTUSED, // 0 - disabled - DIGITAL_IN, // 1 - COUNTER, // 2 - ADC // 3 + DIGITAL_IN, + COUNTER, + ADC, + TIMER, + RATE, + DIGITAL_OUT, + PWM_0, + PWM_1, + PWM_2 }; void start(); @@ -149,7 +157,7 @@ class AnalogSensor { return sensors_.size(); } - bool update(uint8_t id, const std::string & name, uint16_t offset, float factor, uint8_t uom, int8_t type); + bool update(uint8_t id, const std::string & name, float offset, float factor, uint8_t uom, int8_t type); bool get_value_info(JsonObject & output, const char * cmd, const int8_t id); #ifdef EMSESP_DEBUG @@ -163,9 +171,10 @@ class AnalogSensor { static uuid::log::Logger logger_; void remove_ha_topic(const uint8_t id); - bool command_counter(const char * value, const int8_t id); + bool command_setvalue(const char * value, const int8_t id); void measure(); bool command_info(const char * value, const int8_t id, JsonObject & output); + bool command_commands(const char * value, const int8_t id, JsonObject & output); std::vector sensors_; // our list of sensors diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index a9b4b029c..c6bf629b6 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -66,7 +66,9 @@ class DeviceValue { DBM, // 15 FAHRENHEIT, // 16 MV, // 17 - SQM // 18 + SQM, // 18 squaremeter + M3, // 19 cubic meter + L // 20 }; // TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp diff --git a/src/helpers.cpp b/src/helpers.cpp index 343b5a01a..0f9b339f3 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -526,6 +526,10 @@ bool Helpers::value2float(const char * v, float & value) { value = atof((char *)v); return true; } + if (v[0] == '+' && (v[1] == '.' || (v[1] >= '0' && v[1] <= '9'))) { + value = atof((char *)(v + 1)); + return true; + } return false; } diff --git a/src/locale_DE.h b/src/locale_DE.h index 82345d198..c57701bfd 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -70,7 +70,7 @@ MAKE_PSTR_WORD(pin) MAKE_PSTR_WORD(publish) MAKE_PSTR_WORD(timeout) MAKE_PSTR_WORD(board_profile) -MAKE_PSTR_WORD(counter) +MAKE_PSTR_WORD(setvalue) // for commands MAKE_PSTR_WORD(call) @@ -121,7 +121,7 @@ MAKE_STR(productid_fmt, "%s EMS ProductID") MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F_(error), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all")) MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) -MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc")) +MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc"), F("timer"), F("rate"), F("digital out"), F("pwm 0"), F("pwm 1"), F("pwm 2")) // strings MAKE_PSTR(EMSESP, "EMS-ESP") @@ -196,6 +196,8 @@ MAKE_PSTR(dbm, "dBm") MAKE_PSTR(fahrenheit, "°F") MAKE_PSTR(mv, "mV") MAKE_PSTR(sqm, "sqm") +MAKE_PSTR(m3, "m3") +MAKE_PSTR(l, "l") // MAKE_PSTR(times, "mal") // MAKE_PSTR(oclock, "Uhr") @@ -585,6 +587,9 @@ MAKE_PSTR_LIST(mode, F("mode"), F("modus")) MAKE_PSTR_LIST(modetype, F("modetype"), F("modus Typ")) MAKE_PSTR_LIST(fastheatup, F("fastheatup"), F("fast heatup")) MAKE_PSTR_LIST(daytemp, F("daytemp"), F("Tagestemperatur")) +MAKE_PSTR_LIST(daylowtemp, F("daytemp2"), F("Tagestemperatur T2")) +MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("Tagestemperatur T3")) +MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("Tagestemperatur T4")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("Heizen Temperatur")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("Nachttemperatur")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco Temperatur")) @@ -597,7 +602,8 @@ MAKE_PSTR_LIST(offsettemp, F("offsettemp"), F("Temperaturanhebung")) MAKE_PSTR_LIST(minflowtemp, F("minflowtemp"), F("min Flusstemperatur")) MAKE_PSTR_LIST(maxflowtemp, F("maxflowtemp"), F("max Flusstemperatur")) MAKE_PSTR_LIST(roominfluence, F("roominfluence"), F("Raumeinfluss")) -MAKE_PSTR_LIST(curroominfl, F("curroominfl"), F("current room influence")) +MAKE_PSTR_LIST(roominfl_factor, F("roominflfactor"), F("Raumeinfluss Factor")) +MAKE_PSTR_LIST(curroominfl, F("curroominfl"), F("aktueller Raumeinfluss")) MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("Frostschutztemperatur")) MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("berechnete Flusstemperatur")) MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("Heizungstyp")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 0afdb0b1b..e6908a12c 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -70,7 +70,7 @@ MAKE_PSTR_WORD(pin) MAKE_PSTR_WORD(publish) MAKE_PSTR_WORD(timeout) MAKE_PSTR_WORD(board_profile) -MAKE_PSTR_WORD(counter) +MAKE_PSTR_WORD(setvalue) // for commands MAKE_PSTR_WORD(call) @@ -121,7 +121,7 @@ MAKE_STR(productid_fmt, "%s EMS ProductID") MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F_(error), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all")) MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) -MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc")) +MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc"), F("timer"), F("rate"), F("digital out"), F("pwm 0"), F("pwm 1"), F("pwm 2")) // strings MAKE_PSTR(EMSESP, "EMS-ESP") @@ -196,6 +196,8 @@ MAKE_PSTR(dbm, "dBm") MAKE_PSTR(fahrenheit, "°F") MAKE_PSTR(mv, "mV") MAKE_PSTR(sqm, "sqm") +MAKE_PSTR(m3, "m3") +MAKE_PSTR(l, "l") // MAKE_PSTR(times, "times") // MAKE_PSTR(oclock, "o'clock") diff --git a/src/system.cpp b/src/system.cpp index 6b56724a9..d05dffb29 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -73,18 +73,18 @@ bool System::command_pin(const char * value, const int8_t id) { } else if (Helpers::value2bool(value, v)) { pinMode(id, OUTPUT); digitalWrite(id, v); - LOG_INFO(F("GPIO %d set to %s"), id, v ? "HIGH" : "LOW"); + // LOG_INFO(F("GPIO %d set to %s"), id, v ? "HIGH" : "LOW"); return true; } else if (Helpers::value2string(value, v1)) { if (v1 == "input" || v1 == "in" || v1 == "-1") { pinMode(id, INPUT); v = digitalRead(id); - LOG_INFO(F("GPIO %d set input, state %s"), id, v ? "HIGH" : "LOW"); + // LOG_INFO(F("GPIO %d set input, state %s"), id, v ? "HIGH" : "LOW"); return true; } } - LOG_INFO(F("GPIO %d: invalid value"), id); + // LOG_INFO(F("GPIO %d: invalid value"), id); #endif return false; @@ -162,13 +162,19 @@ bool System::command_publish(const char * value, const int8_t id) { bool System::command_syslog_level(const char * value, const int8_t id) { uint8_t s = 0xff; if (Helpers::value2enum(value, s, FL_(enum_syslog_level))) { + bool changed = false; EMSESP::webSettingsService.update( [&](WebSettings & settings) { - settings.syslog_level = (int8_t)s - 1; + if (settings.syslog_level != (int8_t)s - 1) { + settings.syslog_level = (int8_t)s - 1; + changed = true; + } return StateUpdateResult::CHANGED; }, "local"); - EMSESP::system_.syslog_init(); + if (changed) { + EMSESP::system_.syslog_init(); + } return true; } return false; @@ -176,29 +182,35 @@ bool System::command_syslog_level(const char * value, const int8_t id) { // watch bool System::command_watch(const char * value, const int8_t id) { - uint8_t w = 0xff; + uint8_t w = 0xff; + uint16_t i = Helpers::hextoint(value); if (Helpers::value2enum(value, w, FL_(enum_watch))) { if (w == 0 || EMSESP::watch() == EMSESP::Watch::WATCH_OFF) { EMSESP::watch_id(0); } - EMSESP::watch(w); - if (Mqtt::publish_single()) { - Mqtt::publish(F("system/watch"), read_flash_string(FL_(enum_watch)[w]).c_str()); + if (Mqtt::publish_single() && w != EMSESP::watch()) { + if (Mqtt::publish_single2cmd()) { + Mqtt::publish(F("system/watch"), + EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(w) : read_flash_string(FL_(enum_watch)[w]).c_str()); + } else { + Mqtt::publish(F("system_data/watch"), + EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(w) : read_flash_string(FL_(enum_watch)[w]).c_str()); + } } + EMSESP::watch(w); return true; - } - uint16_t i = Helpers::hextoint(value); - if (i) { + } else if (i) { + if (Mqtt::publish_single() && i != EMSESP::watch_id()) { + if (Mqtt::publish_single2cmd()) { + Mqtt::publish(F("system/watch"), Helpers::hextoa(i)); + } else { + Mqtt::publish(F("system_data/watch"), Helpers::hextoa(i)); + } + } EMSESP::watch_id(i); if (EMSESP::watch() == EMSESP::Watch::WATCH_OFF) { EMSESP::watch(EMSESP::Watch::WATCH_ON); } - if (Mqtt::publish_single()) { - char s[10]; - snprintf(s, sizeof(s), "0x%04X", i); - Mqtt::publish(F("system/watch"), s); - // Mqtt::publish(F("system/watch"), read_flash_string(FL_(enum_watch)[EMSESP::watch()]).c_str()); - } return true; } return false; @@ -273,13 +285,25 @@ void System::syslog_init() { } if (Mqtt::publish_single()) { - Mqtt::publish(F("system/syslog"), syslog_enabled_ ? read_flash_string(FL_(enum_syslog_level)[syslog_level_ + 1]).c_str() : "off"); - if (EMSESP::watch_id() == 0 || EMSESP::watch() == 0) { - Mqtt::publish(F("system/watch"), read_flash_string(FL_(enum_watch)[EMSESP::watch()]).c_str()); + if (Mqtt::publish_single2cmd()) { + Mqtt::publish(F("system/syslog"), syslog_enabled_ ? read_flash_string(FL_(enum_syslog_level)[syslog_level_ + 1]).c_str() : "off"); + if (EMSESP::watch_id() == 0 || EMSESP::watch() == 0) { + Mqtt::publish(F("system/watch"), + EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(EMSESP::watch()) + : read_flash_string(FL_(enum_watch)[EMSESP::watch()]).c_str()); + } else { + Mqtt::publish(F("system/watch"), Helpers::hextoa(EMSESP::watch_id())); + } + } else { - char s[10]; - snprintf(s, sizeof(s), "0x%04X", EMSESP::watch_id()); - Mqtt::publish(F("system/watch"), s); + Mqtt::publish(F("system_data/syslog"), syslog_enabled_ ? read_flash_string(FL_(enum_syslog_level)[syslog_level_ + 1]).c_str() : "off"); + if (EMSESP::watch_id() == 0 || EMSESP::watch() == 0) { + Mqtt::publish(F("system_data/watch"), + EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(EMSESP::watch()) + : read_flash_string(FL_(enum_watch)[EMSESP::watch()]).c_str()); + } else { + Mqtt::publish(F("system_data/watch"), Helpers::hextoa(EMSESP::watch_id())); + } } } #endif @@ -524,7 +548,7 @@ bool System::heartbeat_json(JsonObject & output) { output["txfails"] = EMSESP::txservice_.telegram_read_fail_count() + EMSESP::txservice_.telegram_write_fail_count(); if (Mqtt::enabled()) { - output["mqttfails"] = Mqtt::publish_fails(); + output["mqttcount"] = Mqtt::publish_count(); output["mqttfails"] = Mqtt::publish_fails(); } output["apicalls"] = WebAPIService::api_count(); // + WebAPIService::api_fails(); @@ -636,16 +660,12 @@ void System::system_check() { // commands - takes static function pointers void System::commands_init() { - Command::add(EMSdevice::DeviceType::SYSTEM, - F_(pin), - System::command_pin, - F("set a GPIO on/off"), - CommandFlag::MQTT_SUB_FLAG_NOSUB | CommandFlag::ADMIN_ONLY); // dont create a MQTT topic for this - + // Command::add(EMSdevice::DeviceType::SYSTEM, F_(pin), System::command_pin, F("set a GPIO on/off"), CommandFlag::ADMIN_ONLY); Command::add(EMSdevice::DeviceType::SYSTEM, F_(send), System::command_send, F("send a telegram"), CommandFlag::ADMIN_ONLY); Command::add(EMSdevice::DeviceType::SYSTEM, F_(fetch), System::command_fetch, F("refresh all EMS values"), CommandFlag::ADMIN_ONLY); Command::add(EMSdevice::DeviceType::SYSTEM, F_(restart), System::command_restart, F("restart EMS-ESP"), CommandFlag::ADMIN_ONLY); Command::add(EMSdevice::DeviceType::SYSTEM, F_(watch), System::command_watch, F("watch incoming telegrams")); + // register syslog command in syslog init // Command::add(EMSdevice::DeviceType::SYSTEM, F_(syslog), System::command_syslog_level, F("set syslog level"), CommandFlag::ADMIN_ONLY); if (Mqtt::enabled()) { @@ -822,7 +842,7 @@ void System::show_system(uuid::console::Shell & shell) { // show Ethernet if connected if (ethernet_connected_) { shell.println(); - shell.printfln(F(" Wired Network: connected")); + shell.printfln(F(" Ethernet Network: connected")); shell.printfln(F(" MAC address: %s"), ETH.macAddress().c_str()); shell.printfln(F(" Hostname: %s"), ETH.getHostname()); shell.printfln(F(" IPv4 address: %s/%s"), uuid::printable_to_string(ETH.localIP()).c_str(), uuid::printable_to_string(ETH.subnetMask()).c_str()); @@ -1021,6 +1041,13 @@ bool System::command_customizations(const char * value, const int8_t id, JsonObj sensorJson["offset"] = sensor.offset; sensorJson["factor"] = sensor.factor; sensorJson["uom"] = EMSdevice::uom_to_string(sensor.uom); + } else if (sensor.type == AnalogSensor::AnalogType::COUNTER || sensor.type == AnalogSensor::AnalogType::TIMER + || sensor.type == AnalogSensor::AnalogType::RATE) { + sensorJson["factor"] = sensor.factor; + sensorJson["uom"] = EMSdevice::uom_to_string(sensor.uom); + } else if (sensor.type >= AnalogSensor::AnalogType::PWM_0) { + sensorJson["frequency"] = sensor.factor; + sensorJson["factor"] = sensor.factor; } } @@ -1154,10 +1181,14 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp for (const auto & device_class : EMSFactory::device_handlers()) { for (const auto & emsdevice : EMSESP::emsdevices) { if ((emsdevice) && (emsdevice->device_type() == device_class.first)) { - JsonObject obj = devices.createNestedObject(); - obj["type"] = emsdevice->device_type_name(); - obj["name"] = emsdevice->to_string(); - obj["entities"] = emsdevice->count_entities(); + JsonObject obj = devices.createNestedObject(); + obj["type"] = emsdevice->device_type_name(); + // obj["name"] = emsdevice->to_string(); + obj["name"] = emsdevice->name(); + obj["device id"] = Helpers::hextoa(emsdevice->device_id()); + obj["product id"] = emsdevice->product_id(); + obj["version"] = emsdevice->version(); + obj["entities"] = emsdevice->count_entities(); char result[200]; (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::RECEIVED); if (result[0] != '\0') { diff --git a/src/web/WebCustomizationService.h b/src/web/WebCustomizationService.h index 5371e74bb..b2bd869da 100644 --- a/src/web/WebCustomizationService.h +++ b/src/web/WebCustomizationService.h @@ -44,7 +44,7 @@ class AnalogCustomization { public: uint8_t id; std::string name; - uint16_t offset; + float offset; float factor; uint8_t uom; // 0 is none int8_t type; // -1 is for deletion diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index a012c2d35..85989b9c7 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -275,7 +275,7 @@ void WebDataService::write_analog(AsyncWebServerRequest * request, JsonVariant & uint8_t id = analog["id"]; // this is the unique key std::string name = analog["name"]; float factor = analog["factor"]; - int16_t offset = analog["offset"]; + float offset = analog["offset"]; uint8_t uom = analog["uom"]; int8_t type = analog["type"]; ok = EMSESP::analogsensor_.update(id, name, offset, factor, uom, type); From 6b164b5487a2d8e5fcb0a55f148c617eef9a5c08 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 18:57:43 +0100 Subject: [PATCH 054/319] burner up to 130% --- src/devices/boiler.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 6ddebf5d7..b562e64ad 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -150,8 +150,15 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_burn_period)); register_device_value( DeviceValueTAG::TAG_BOILER_DATA, &burnMinPower_, DeviceValueType::UINT, nullptr, FL_(burnMinPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_power)); - register_device_value( - DeviceValueTAG::TAG_BOILER_DATA, &burnMaxPower_, DeviceValueType::UINT, nullptr, FL_(burnMaxPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_power)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &burnMaxPower_, + DeviceValueType::UINT, + nullptr, + FL_(burnMaxPower), + DeviceValueUOM::PERCENT, + MAKE_CF_CB(set_max_power), + 0, + 130); register_device_value( DeviceValueTAG::TAG_BOILER_DATA, &boilHystOn_, DeviceValueType::INT, nullptr, FL_(boilHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_hyst_on)); register_device_value( @@ -318,7 +325,9 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const nullptr, FL_(wwMaxPower), DeviceValueUOM::PERCENT, - MAKE_CF_CB(set_ww_maxpower)); + MAKE_CF_CB(set_ww_maxpower), + 0, + 130); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCircPump_, DeviceValueType::BOOL, From 9ccb04489b740613a89f0363031c97f8c43f9354 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 18:58:15 +0100 Subject: [PATCH 055/319] log detection of devcies without values --- src/emsesp.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index b6ec5f953..fe60f9825 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -1136,6 +1136,9 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const fetch_device_values(device_id); // go and fetch its data + // Print to LOG showing we've added a new device + LOG_INFO(F("Recognized new %s with deviceID 0x%02X"), EMSdevice::device_type_2_device_name(device_type).c_str(), device_id); + // add command commands for all devices, except for connect, controller and gateway if ((device_type == DeviceType::CONNECT) || (device_type == DeviceType::CONTROLLER) || (device_type == DeviceType::GATEWAY)) { return true; @@ -1170,9 +1173,6 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const // MQTT subscribe to the device e.g. "ems-esp/boiler/#" Mqtt::subscribe(device_type, EMSdevice::device_type_2_device_name(device_type) + "/#", nullptr); - // Print to LOG showing we've added a new device - LOG_INFO(F("Recognized new %s with deviceID 0x%02X"), EMSdevice::device_type_2_device_name(device_type).c_str(), device_id); - return true; } From b2eaca27ded38e03c851cc157435c850cbfd3289 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 18:58:45 +0100 Subject: [PATCH 056/319] remove unused flag --- src/command.cpp | 3 +-- src/command.h | 7 +++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 6164134ed..0efece5cd 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -317,14 +317,13 @@ void Command::add(const uint8_t device_type, const __FlashStringHelper * cmd, co } // add a command to the list, which does return a json object as output -// flag is fixed to MqttSubFlag::MQTT_SUB_FLAG_NOSUB so there will be no topic subscribed to this void Command::add(const uint8_t device_type, const __FlashStringHelper * cmd, const cmd_json_function_p cb, const __FlashStringHelper * description, uint8_t flags) { // if the command already exists for that device type don't add it if (find_command(device_type, read_flash_string(cmd).c_str()) != nullptr) { return; } - cmdfunctions_.emplace_back(device_type, (CommandFlag::MQTT_SUB_FLAG_NOSUB | flags), cmd, nullptr, cb, description); // callback for json is included + cmdfunctions_.emplace_back(device_type, flags, cmd, nullptr, cb, description); // callback for json is included } // see if a command exists for that device type diff --git a/src/command.h b/src/command.h index 6889be6c5..bc1bf7e7c 100644 --- a/src/command.h +++ b/src/command.h @@ -32,10 +32,9 @@ enum CommandFlag : uint8_t { MQTT_SUB_FLAG_DEFAULT = 0, // 0 no flags set, always subscribe to MQTT MQTT_SUB_FLAG_HC = (1 << 0), // 1 TAG_HC1 - TAG_HC8 MQTT_SUB_FLAG_WWC = (1 << 1), // 2 TAG_WWC1 - TAG_WWC4 - MQTT_SUB_FLAG_NOSUB = (1 << 2), // 4 - MQTT_SUB_FLAG_WW = (1 << 3), // 8 TAG_DEVICE_DATA_WW - HIDDEN = (1 << 4), // 16 do not show in API or Web - ADMIN_ONLY = (1 << 5) // 32 requires authentication + MQTT_SUB_FLAG_WW = (1 << 2), // 4 TAG_DEVICE_DATA_WW + HIDDEN = (1 << 3), // 8 do not show in API or Web + ADMIN_ONLY = (1 << 4) // 16 requires authentication }; From 3b41d6fff6d69ff187eed1d1ad9925e89910c76a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 18:59:22 +0100 Subject: [PATCH 057/319] fahrenheit uom --- src/analogsensor.cpp | 4 ++-- src/dallassensor.cpp | 20 ++++++++------------ src/emsdevice.cpp | 11 +++++------ 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 5ea7dffac..147440e82 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -89,7 +89,7 @@ void AnalogSensor::reload() { it++; } // add new sensors from list - for (auto & sensor : sensors) { + for (auto & sensor : sensors) { bool found = false; for (auto & sensor_ : sensors_) { if (sensor_.id() == sensor.id) { @@ -229,7 +229,7 @@ void AnalogSensor::measure() { } else if (!sensor.poll_) { // falling edge if (sensor.type() == AnalogType::COUNTER) { sensor.set_value(old_value + sensor.factor()); - } else if (sensor.type() == AnalogType::RATE) { // dafault uom: Hz (1/sec) with factor 1 + } else if (sensor.type() == AnalogType::RATE) { // dafault uom: Hz (1/sec) with factor 1 sensor.set_value(sensor.factor() * 1000 / (sensor.polltime_ - sensor.last_polltime_)); } else if (sensor.type() == AnalogType::TIMER) { // default seconds with factor 1 sensor.set_value(sensor.factor() * (sensor.polltime_ - sensor.last_polltime_) / 1000); diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index fe7846a5b..d8e9722ba 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -361,10 +361,10 @@ bool DallasSensor::command_info(const char * value, const int8_t id, JsonObject JsonObject dataSensor = output.createNestedObject(sensor.name()); dataSensor["id_str"] = sensor.id_str(); if (Helpers::hasValue(sensor.temperature_c)) { - dataSensor["temp"] = (float)(sensor.temperature_c) / 10; + dataSensor["temp"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } } else if (Helpers::hasValue(sensor.temperature_c)) { - output[sensor.name()] = (float)(sensor.temperature_c) / 10; + output[sensor.name()] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } } @@ -378,11 +378,11 @@ bool DallasSensor::get_value_info(JsonObject & output, const char * cmd, const i output["id_str"] = sensor.id_str(); output["name"] = sensor.name(); if (Helpers::hasValue(sensor.temperature_c)) { - output["value"] = (float)(sensor.temperature_c) / 10; + output["value"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } output["type"] = F_(number); - output["min"] = -55; - output["max"] = 125; + output["min"] = Helpers::round2(-55, 0, EMSESP::system_.fahrenheit() ? 2 : 0); + output["max"] = Helpers::round2(125, 0, EMSESP::system_.fahrenheit() ? 2 : 0); output["unit"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); output["writeable"] = false; return true; @@ -444,10 +444,10 @@ void DallasSensor::publish_values(const bool force) { JsonObject dataSensor = doc.createNestedObject(sensor.id_str()); dataSensor["name"] = sensor.name(); if (has_value) { - dataSensor["temp"] = (float)(sensor.temperature_c) / 10; + dataSensor["temp"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } } else if (has_value) { - doc[sensor.name()] = (float)(sensor.temperature_c) / 10; + doc[sensor.name()] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } // create the HA MQTT config @@ -463,11 +463,7 @@ void DallasSensor::publish_values(const bool force) { snprintf(stat_t, sizeof(stat_t), "%s/dallassensor_data", Mqtt::base().c_str()); config["stat_t"] = stat_t; - if (EMSESP::system_.fahrenheit()) { - config["unit_of_meas"] = FJSON("°F"); - } else { - config["unit_of_meas"] = FJSON("°C"); - } + config["unit_of_meas"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); char str[50]; snprintf(str, sizeof(str), "{{value_json['%s'].temp}}", sensor.id_str().c_str()); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 0306e4b10..17a0f4434 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -52,6 +52,9 @@ const std::string EMSdevice::tag_to_mqtt(uint8_t tag) { } const std::string EMSdevice::uom_to_string(uint8_t uom) { + if (EMSESP::system_.fahrenheit() && (uom == DeviceValueUOM::DEGREES || uom == DeviceValueUOM::DEGREES_R)) { + return read_flash_string(DeviceValue::DeviceValueUOM_s[DeviceValueUOM::FAHRENHEIT]); + } return read_flash_string(DeviceValue::DeviceValueUOM_s[uom]); } @@ -306,11 +309,7 @@ void EMSdevice::list_device_entries(JsonObject & output) { // add uom if (!uom_to_string(dv.uom).empty() && uom_to_string(dv.uom) != " ") { - if (EMSESP::system_.fahrenheit() && (dv.uom == DeviceValueUOM::DEGREES || dv.uom == DeviceValueUOM::DEGREES_R)) { - details.add(EMSdevice::uom_to_string(DeviceValueUOM::FAHRENHEIT)); - } else { - details.add(EMSdevice::uom_to_string(dv.uom)); - } + details.add(EMSdevice::uom_to_string(dv.uom)); } } } @@ -1024,7 +1023,7 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 // add uom if it's not a " " (single space) if (!uom_to_string(dv.uom).empty() && uom_to_string(dv.uom) != " ") { - json["uom"] = fahrenheit ? "°F" : uom_to_string(dv.uom); + json["uom"] = uom_to_string(dv.uom); } json["writeable"] = dv.has_cmd; From 4219842088bf04ae5ffc45ed29c3627c78052bda Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 19:36:17 +0100 Subject: [PATCH 058/319] fetch devices one by one --- src/emsesp.cpp | 27 +++++++++++++++++++++++---- src/emsesp.h | 1 + src/telegram.h | 4 ++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index fe60f9825..9a9c53ddd 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -1413,6 +1413,28 @@ void EMSESP::start() { webServer.begin(); // start the web server } +// fetch devices one by one +void EMSESP::scheduled_fetch_values() { + static uint8_t no = 0; + if (no || (uuid::get_uptime() - last_fetch_ > EMS_FETCH_FREQUENCY)) { + if (!no) { + last_fetch_ = uuid::get_uptime(); + no = 1; + } + if (txservice_.tx_queue_empty()) { + uint8_t i = 0; + for (const auto & emsdevice : emsdevices) { + if (emsdevice && ++i >= no) { + emsdevice->fetch_values(); + no++; + return; + } + } + no = 0; + } + } +} + // main loop calling all services void EMSESP::loop() { esp8266React.loop(); // web services @@ -1429,10 +1451,7 @@ void EMSESP::loop() { mqtt_.loop(); // sends out anything in the MQTT queue // force a query on the EMS devices to fetch latest data at a set interval (1 min) - if ((uuid::get_uptime() - last_fetch_ > EMS_FETCH_FREQUENCY)) { - last_fetch_ = uuid::get_uptime(); - fetch_device_values(); - } + scheduled_fetch_values(); } console_.loop(); // telnet/serial console diff --git a/src/emsesp.h b/src/emsesp.h index f9fc2fc31..3395824d5 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -206,6 +206,7 @@ class EMSESP { static void fetch_device_values(const uint8_t device_id = 0); static void fetch_device_values_type(const uint8_t device_type); static bool valid_device(const uint8_t device_id); + static void scheduled_fetch_values(); static bool add_device(const uint8_t device_id, const uint8_t product_id, const char * version, const uint8_t brand); static void scan_devices(); diff --git a/src/telegram.h b/src/telegram.h index 5ce46c5ad..e75f53008 100644 --- a/src/telegram.h +++ b/src/telegram.h @@ -399,6 +399,10 @@ class TxService : public EMSbus { return tx_telegrams_; } + bool tx_queue_empty() { + return tx_telegrams_.size() == 0; + } + #if defined(EMSESP_DEBUG) static constexpr uint8_t MAXIMUM_TX_RETRIES = 0; // when compiled with EMSESP_DEBUG don't retry #else From 9046a6578aed16cc857d431875b197a95179db9a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 19:37:14 +0100 Subject: [PATCH 059/319] telegram read length depends on ems/ems+ --- src/telegram.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/telegram.cpp b/src/telegram.cpp index 0fa1b531e..59c0921b8 100644 --- a/src/telegram.cpp +++ b/src/telegram.cpp @@ -536,13 +536,13 @@ void TxService::add(uint8_t operation, const uint8_t * data, const uint8_t lengt void TxService::read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset, const uint8_t length) { LOG_DEBUG(F("Tx read request to device 0x%02X for type ID 0x%02X"), dest, type_id); - uint8_t message_data[1] = {EMS_MAX_TELEGRAM_LENGTH}; // request all data, 32 bytes + uint8_t message_data = (type_id > 0xFF) ? (EMS_MAX_TELEGRAM_MESSAGE_LENGTH - 2) : EMS_MAX_TELEGRAM_MESSAGE_LENGTH; // if length set, publish result and set telegram to front if (length) { - message_data[0] = length; + message_data = length; EMSESP::set_read_id(type_id); } - add(Telegram::Operation::TX_READ, dest, type_id, offset, message_data, 1, 0, length != 0); + add(Telegram::Operation::TX_READ, dest, type_id, offset, &message_data, 1, 0, length != 0); } // Send a raw telegram to the bus, telegram is a text string of hex values @@ -663,9 +663,10 @@ uint16_t TxService::post_send_query() { if (post_typeid) { uint8_t dest = (this->telegram_last_->dest & 0x7F); // when set a value with large offset before and validate on same type, we have to add offset 0, 26, 52, ... - uint8_t offset = (this->telegram_last_->type_id == post_typeid) ? ((this->telegram_last_->offset / 26) * 26) : 0; - uint8_t message_data[1] = {EMS_MAX_TELEGRAM_LENGTH}; // request all data, 32 bytes - this->add(Telegram::Operation::TX_READ, dest, post_typeid, offset, message_data, 1, 0, true); // add to top/front of queue + uint8_t offset = (this->telegram_last_->type_id == post_typeid) ? ((this->telegram_last_->offset / 26) * 26) : 0; + uint8_t message_data = + (this->telegram_last_->type_id > 0xFF) ? (EMS_MAX_TELEGRAM_MESSAGE_LENGTH - 2) : EMS_MAX_TELEGRAM_MESSAGE_LENGTH; // request all data, 32 bytes + this->add(Telegram::Operation::TX_READ, dest, post_typeid, offset, &message_data, 1, 0, true); // add to top/front of queue // read_request(telegram_last_post_send_query_, dest, 0); // no offset LOG_DEBUG(F("Sending post validate read, type ID 0x%02X to dest 0x%02X"), post_typeid, dest); set_post_send_query(0); // reset From 18651bdaf40220003749d6cecc8e7d3d17d8a617 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 16 Feb 2022 19:37:23 +0100 Subject: [PATCH 060/319] changelog, typo --- CHANGELOG_LATEST.md | 7 +++++++ interface/src/project/DashboardData.tsx | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 89d33a09b..74ecb6350 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -22,6 +22,10 @@ - Help text for string commands in WebUI [#320](https://github.com/emsesp/EMS-ESP32/issues/320) - Germany translations (at compile time) - #entities added to system/info` endpoint [#322](https://github.com/emsesp/EMS-ESP32/issues/322) +- analog outputs digital/pwm/dac +- remove MQTT retained configs if discovery is disabled +- timeout 10 min for MQTT-QoS wait +- Moduline 300 auto-temperatures T1-T4, RC300 romminfluencefactor ### Fixed @@ -38,6 +42,7 @@ - Fix uploading firmware on OSX [#345](https://github.com/emsesp/EMS-ESP32/issues/345) - Non-nested MQTT would corrupt the json [#354](https://github.com/emsesp/EMS-ESP32/issues/354) - Burner selected max power can have a value higher than 100% [#314](https://github.com/emsesp/EMS-ESP32/issues/314) +- some missing fahrenheit calculations ### Changed @@ -51,6 +56,8 @@ - Show ems tx reads and writes separatly - Show ems device handlers separated for received, fetched and pending handlers. - Wired renamed to Ethernet +- removed system/pin command, new commands in analogsensors +- system/info device-info split to name/version/brand ## **BREAKING CHANGES:** diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 19047073c..fab64a359 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -614,7 +614,7 @@ const DashboardData: FC = () => { {analog_data.i} {analog_data.n} - {AnalogTypes[analog_data.t]} + {AnalogTypeNames[analog_data.t]} {formatValue(analog_data.v, analog_data.u)} ))} @@ -709,7 +709,7 @@ const DashboardData: FC = () => { - {AnalogTypes.map((val, i) => ( + {AnalogTypeNames.map((val, i) => ( {val} From b7d8447f737fb8891974ec266a2313a9f22855dc Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 17 Feb 2022 09:17:17 +0100 Subject: [PATCH 061/319] version 3.4.0b6 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 79659168a..ead90ccd1 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b5" +#define EMSESP_APP_VERSION "3.4.0b6" From e0e90e3cab4db5d82279d46d19d5dea14f390315 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 17 Feb 2022 10:38:22 +0100 Subject: [PATCH 062/319] Fahrenheit for HA-climate min/max --- src/devices/thermostat.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 279ead77c..db80f594f 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -386,6 +386,8 @@ void Thermostat::publish_ha_config_hc(std::shared_ptr Date: Thu, 17 Feb 2022 10:44:56 +0100 Subject: [PATCH 063/319] update packages to fix build --- interface/package-lock.json | 168 ++++++++++++++++++------------------ interface/package.json | 8 +- mock-api/package-lock.json | 166 +++++++++++++++++------------------ mock-api/package.json | 6 +- 4 files changed, 174 insertions(+), 174 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 8cef8dd00..7a3848553 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -11,10 +11,10 @@ "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.4.1", - "@mui/material": "^5.4.1", + "@mui/icons-material": "^5.4.2", + "@mui/material": "^5.4.2", "@types/lodash": "^4.14.178", - "@types/node": "^17.0.17", + "@types/node": "^17.0.18", "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", @@ -26,7 +26,7 @@ "notistack": "^2.0.3", "parse-ms": "^3.0.0", "react": "^17.0.2", - "react-app-rewired": "^2.1.11", + "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", @@ -2707,13 +2707,13 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.68", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.68.tgz", - "integrity": "sha512-q+3gX6EHuM/AyOn8fkoANQxSzIHBeuNsrGgb7SPP0y7NuM+4ZHG/b9882+OfHcilaSqPDWUQoLbphcBpw/m/RA==", + "version": "5.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.69.tgz", + "integrity": "sha512-IxUUj/lkilCTNBIybQxyQGW/zpxFp490G0QBQJgRp9TJkW2PWSTLvAH7gcH0YHd0L2TAf1TRgfdemoRseMzqQA==", "dependencies": { "@babel/runtime": "^7.17.0", "@emotion/is-prop-valid": "^1.1.1", - "@mui/utils": "^5.4.1", + "@mui/utils": "^5.4.2", "@popperjs/core": "^2.4.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -2738,9 +2738,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.1.tgz", - "integrity": "sha512-koiq9q2GfjXRUWcC5fEi1b+EA4vfJHgIaAdBHlkOrBx2cnmmazQcyib501eodPfaZGx9BikrhivODaNQYQq8hA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.2.tgz", + "integrity": "sha512-7c+G3jBT+e+pN0a9DJ0Bd8Kr1Vy6os5Q1yd2aXcwuhlRI3uzJBLJ8sX6FSWoh5DSEBchb7Bsk1uHz6U0YN9l+Q==", "dependencies": { "@babel/runtime": "^7.17.0" }, @@ -2763,15 +2763,15 @@ } }, "node_modules/@mui/material": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.1.tgz", - "integrity": "sha512-SxAT43UAjFTBBpJrN+oGrv40xP1uCa5Z49NfHt3m93xYeFzbxKOk0V9IKU7zlUjbsaVQ0i+o24yF5GULZmynlA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.2.tgz", + "integrity": "sha512-jmeLWEO6AA6g7HErhI3MXVGaMZtqDZjDwcHCg24WY954wO38Xn0zJ53VfpFc44ZTJLV9Ejd7ci9fLlG/HmJCeg==", "dependencies": { "@babel/runtime": "^7.17.0", - "@mui/base": "5.0.0-alpha.68", - "@mui/system": "^5.4.1", - "@mui/types": "^7.1.1", - "@mui/utils": "^5.4.1", + "@mui/base": "5.0.0-alpha.69", + "@mui/system": "^5.4.2", + "@mui/types": "^7.1.2", + "@mui/utils": "^5.4.2", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.10", @@ -2807,12 +2807,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.1.tgz", - "integrity": "sha512-Xbc4MXFZxv0A3hoc4TSDBhzjhstppKfc+gQcTMqqBZQP7KjnmxF+wO7rEPQuYRBihjCqQBdrHIGMLsKWrhkZkQ==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.2.tgz", + "integrity": "sha512-mlPDYYko4wIcwXjCPEmOWbNTT4DZ6h9YHdnRtQPnWM28+TRUHEo7SbydnnmVDQLRXUfaH4Y6XtEHIfBNPE/SLg==", "dependencies": { "@babel/runtime": "^7.17.0", - "@mui/utils": "^5.4.1", + "@mui/utils": "^5.4.2", "prop-types": "^15.7.2" }, "engines": { @@ -2833,9 +2833,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.1.tgz", - "integrity": "sha512-CFLNJkopRoAuShkgUZOTBVxdTlKu4w6L4kOwPi4r3QB2XXS6O5kyLHSsg9huUbtOYk5Dv5UZyUSc5pw4J7ezdg==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.2.tgz", + "integrity": "sha512-tz9p3aRtzXHKAg7x3BgP0hVQEoGKaxNCFxsJ+d/iqEHYvywWFSs6oxqYAvDHIRpvMlUZyPNoTrkcNnbdMmH/ng==", "dependencies": { "@babel/runtime": "^7.17.0", "@emotion/cache": "^11.7.1", @@ -2863,15 +2863,15 @@ } }, "node_modules/@mui/system": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.1.tgz", - "integrity": "sha512-07JBYf9iQdxIHZU8cFOLoxBnkQDUPLb7UBhNxo4998yEqpWFJ00WKgEVYBKvPl0X+MRU/20wqFz6yGIuCx4AeA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.2.tgz", + "integrity": "sha512-QegBVu6fxUNov1X9bWc1MZUTeV3A5g9PIpli7d0kzkGfq6JzrJWuPlhSPZ+6hlWmWky+bbAXhU65Qz8atWxDGw==", "dependencies": { "@babel/runtime": "^7.17.0", - "@mui/private-theming": "^5.4.1", - "@mui/styled-engine": "^5.4.1", - "@mui/types": "^7.1.1", - "@mui/utils": "^5.4.1", + "@mui/private-theming": "^5.4.2", + "@mui/styled-engine": "^5.4.2", + "@mui/types": "^7.1.2", + "@mui/utils": "^5.4.2", "clsx": "^1.1.1", "csstype": "^3.0.10", "prop-types": "^15.7.2" @@ -2902,9 +2902,9 @@ } }, "node_modules/@mui/types": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.1.tgz", - "integrity": "sha512-33hbHFLCwenTpS+T4m4Cz7cQ/ng5g+IgtINkw1uDBVvi1oM83VNt/IGzWIQNPK8H2pr0WIfkmboD501bVdYsPw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.2.tgz", + "integrity": "sha512-SD7O1nVzqG+ckQpFjDhXPZjRceB8HQFHEvdLLrPhlJy4lLbwEBbxK74Tj4t6Jgk0fTvLJisuwOutrtYe9P/xBQ==", "peerDependencies": { "@types/react": "*" }, @@ -2915,9 +2915,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.1.tgz", - "integrity": "sha512-5HzM+ZjlQqbSp7UTOvLlhAjkWB+o9Z4NzO0W+yhZ1KnxITr+zr/MBzYmmQ3kyvhui8pyhgRDoTcVgwb+02ZUZA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.2.tgz", + "integrity": "sha512-646dBCC57MXTo/Gf3AnZSHRHznaTETQq5x7AWp5FRQ4jPeyT4WSs18cpJVwkV01cAHKh06pNQTIufIALIWCL5g==", "dependencies": { "@babel/runtime": "^7.17.0", "@types/prop-types": "^15.7.4", @@ -3597,9 +3597,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", - "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==" + "version": "17.0.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz", + "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -14037,9 +14037,9 @@ } }, "node_modules/react-app-rewired": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.11.tgz", - "integrity": "sha512-zRIqJUPsCoPnfYtea3xgPbKR42vx0NoH5oo8R8FELXqzkjJHa39V6zD8CAdkLJoYL8V3JScWHAfKMZOzi1Ydmw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.2.1.tgz", + "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==", "dependencies": { "semver": "^5.6.0" }, @@ -19338,13 +19338,13 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.68", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.68.tgz", - "integrity": "sha512-q+3gX6EHuM/AyOn8fkoANQxSzIHBeuNsrGgb7SPP0y7NuM+4ZHG/b9882+OfHcilaSqPDWUQoLbphcBpw/m/RA==", + "version": "5.0.0-alpha.69", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.69.tgz", + "integrity": "sha512-IxUUj/lkilCTNBIybQxyQGW/zpxFp490G0QBQJgRp9TJkW2PWSTLvAH7gcH0YHd0L2TAf1TRgfdemoRseMzqQA==", "requires": { "@babel/runtime": "^7.17.0", "@emotion/is-prop-valid": "^1.1.1", - "@mui/utils": "^5.4.1", + "@mui/utils": "^5.4.2", "@popperjs/core": "^2.4.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -19352,23 +19352,23 @@ } }, "@mui/icons-material": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.1.tgz", - "integrity": "sha512-koiq9q2GfjXRUWcC5fEi1b+EA4vfJHgIaAdBHlkOrBx2cnmmazQcyib501eodPfaZGx9BikrhivODaNQYQq8hA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.2.tgz", + "integrity": "sha512-7c+G3jBT+e+pN0a9DJ0Bd8Kr1Vy6os5Q1yd2aXcwuhlRI3uzJBLJ8sX6FSWoh5DSEBchb7Bsk1uHz6U0YN9l+Q==", "requires": { "@babel/runtime": "^7.17.0" } }, "@mui/material": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.1.tgz", - "integrity": "sha512-SxAT43UAjFTBBpJrN+oGrv40xP1uCa5Z49NfHt3m93xYeFzbxKOk0V9IKU7zlUjbsaVQ0i+o24yF5GULZmynlA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.2.tgz", + "integrity": "sha512-jmeLWEO6AA6g7HErhI3MXVGaMZtqDZjDwcHCg24WY954wO38Xn0zJ53VfpFc44ZTJLV9Ejd7ci9fLlG/HmJCeg==", "requires": { "@babel/runtime": "^7.17.0", - "@mui/base": "5.0.0-alpha.68", - "@mui/system": "^5.4.1", - "@mui/types": "^7.1.1", - "@mui/utils": "^5.4.1", + "@mui/base": "5.0.0-alpha.69", + "@mui/system": "^5.4.2", + "@mui/types": "^7.1.2", + "@mui/utils": "^5.4.2", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.10", @@ -19379,19 +19379,19 @@ } }, "@mui/private-theming": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.1.tgz", - "integrity": "sha512-Xbc4MXFZxv0A3hoc4TSDBhzjhstppKfc+gQcTMqqBZQP7KjnmxF+wO7rEPQuYRBihjCqQBdrHIGMLsKWrhkZkQ==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.2.tgz", + "integrity": "sha512-mlPDYYko4wIcwXjCPEmOWbNTT4DZ6h9YHdnRtQPnWM28+TRUHEo7SbydnnmVDQLRXUfaH4Y6XtEHIfBNPE/SLg==", "requires": { "@babel/runtime": "^7.17.0", - "@mui/utils": "^5.4.1", + "@mui/utils": "^5.4.2", "prop-types": "^15.7.2" } }, "@mui/styled-engine": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.1.tgz", - "integrity": "sha512-CFLNJkopRoAuShkgUZOTBVxdTlKu4w6L4kOwPi4r3QB2XXS6O5kyLHSsg9huUbtOYk5Dv5UZyUSc5pw4J7ezdg==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.2.tgz", + "integrity": "sha512-tz9p3aRtzXHKAg7x3BgP0hVQEoGKaxNCFxsJ+d/iqEHYvywWFSs6oxqYAvDHIRpvMlUZyPNoTrkcNnbdMmH/ng==", "requires": { "@babel/runtime": "^7.17.0", "@emotion/cache": "^11.7.1", @@ -19399,30 +19399,30 @@ } }, "@mui/system": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.1.tgz", - "integrity": "sha512-07JBYf9iQdxIHZU8cFOLoxBnkQDUPLb7UBhNxo4998yEqpWFJ00WKgEVYBKvPl0X+MRU/20wqFz6yGIuCx4AeA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.2.tgz", + "integrity": "sha512-QegBVu6fxUNov1X9bWc1MZUTeV3A5g9PIpli7d0kzkGfq6JzrJWuPlhSPZ+6hlWmWky+bbAXhU65Qz8atWxDGw==", "requires": { "@babel/runtime": "^7.17.0", - "@mui/private-theming": "^5.4.1", - "@mui/styled-engine": "^5.4.1", - "@mui/types": "^7.1.1", - "@mui/utils": "^5.4.1", + "@mui/private-theming": "^5.4.2", + "@mui/styled-engine": "^5.4.2", + "@mui/types": "^7.1.2", + "@mui/utils": "^5.4.2", "clsx": "^1.1.1", "csstype": "^3.0.10", "prop-types": "^15.7.2" } }, "@mui/types": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.1.tgz", - "integrity": "sha512-33hbHFLCwenTpS+T4m4Cz7cQ/ng5g+IgtINkw1uDBVvi1oM83VNt/IGzWIQNPK8H2pr0WIfkmboD501bVdYsPw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.2.tgz", + "integrity": "sha512-SD7O1nVzqG+ckQpFjDhXPZjRceB8HQFHEvdLLrPhlJy4lLbwEBbxK74Tj4t6Jgk0fTvLJisuwOutrtYe9P/xBQ==", "requires": {} }, "@mui/utils": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.1.tgz", - "integrity": "sha512-5HzM+ZjlQqbSp7UTOvLlhAjkWB+o9Z4NzO0W+yhZ1KnxITr+zr/MBzYmmQ3kyvhui8pyhgRDoTcVgwb+02ZUZA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.2.tgz", + "integrity": "sha512-646dBCC57MXTo/Gf3AnZSHRHznaTETQq5x7AWp5FRQ4jPeyT4WSs18cpJVwkV01cAHKh06pNQTIufIALIWCL5g==", "requires": { "@babel/runtime": "^7.17.0", "@types/prop-types": "^15.7.4", @@ -19907,9 +19907,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", - "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==" + "version": "17.0.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz", + "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==" }, "@types/parse-json": { "version": "4.0.0", @@ -27423,9 +27423,9 @@ } }, "react-app-rewired": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.1.11.tgz", - "integrity": "sha512-zRIqJUPsCoPnfYtea3xgPbKR42vx0NoH5oo8R8FELXqzkjJHa39V6zD8CAdkLJoYL8V3JScWHAfKMZOzi1Ydmw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.2.1.tgz", + "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==", "requires": { "semver": "^5.6.0" }, diff --git a/interface/package.json b/interface/package.json index e702cb016..289c93418 100644 --- a/interface/package.json +++ b/interface/package.json @@ -7,10 +7,10 @@ "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.4.1", - "@mui/material": "^5.4.1", + "@mui/icons-material": "^5.4.2", + "@mui/material": "^5.4.2", "@types/lodash": "^4.14.178", - "@types/node": "^17.0.17", + "@types/node": "^17.0.18", "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", @@ -22,7 +22,7 @@ "notistack": "^2.0.3", "parse-ms": "^3.0.0", "react": "^17.0.2", - "react-app-rewired": "^2.1.11", + "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", diff --git a/mock-api/package-lock.json b/mock-api/package-lock.json index e427b3f77..b9c537f6f 100644 --- a/mock-api/package-lock.json +++ b/mock-api/package-lock.json @@ -9,18 +9,18 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@msgpack/msgpack": "^2.7.1", + "@msgpack/msgpack": "^2.7.2", "compression": "^1.7.4", - "express": "^4.17.2", + "express": "^4.17.3", "express-sse": "^0.5.3", "nodemon": "^2.0.15", - "ws": "^8.4.2" + "ws": "^8.5.0" } }, "node_modules/@msgpack/msgpack": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.1.tgz", - "integrity": "sha512-ApwiSL2c9ObewdOE/sqt788P1C5lomBOHyO8nUBCr4ofErBCnYQ003NtJ8lS9OQZc11ximkbmgAZJjB8y6cCdA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", + "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==", "engines": { "node": ">= 10" } @@ -50,12 +50,12 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -122,19 +122,19 @@ } }, "node_modules/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", + "qs": "6.9.7", + "raw-body": "2.4.3", "type-is": "~1.6.18" }, "engines": { @@ -183,9 +183,9 @@ } }, "node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -430,9 +430,9 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { "node": ">= 0.6" } @@ -559,16 +559,16 @@ } }, "node_modules/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.19.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -583,7 +583,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.9.7", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.17.2", @@ -1085,9 +1085,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -1290,9 +1290,9 @@ } }, "node_modules/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "engines": { "node": ">=0.6" }, @@ -1309,11 +1309,11 @@ } }, "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" @@ -1727,9 +1727,9 @@ } }, "node_modules/ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "engines": { "node": ">=10.0.0" }, @@ -1762,9 +1762,9 @@ }, "dependencies": { "@msgpack/msgpack": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.1.tgz", - "integrity": "sha512-ApwiSL2c9ObewdOE/sqt788P1C5lomBOHyO8nUBCr4ofErBCnYQ003NtJ8lS9OQZc11ximkbmgAZJjB8y6cCdA==" + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", + "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@sindresorhus/is": { "version": "0.14.0", @@ -1785,12 +1785,12 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "ansi-align": { @@ -1839,19 +1839,19 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", + "qs": "6.9.7", + "raw-body": "2.4.3", "type-is": "~1.6.18" } }, @@ -1888,9 +1888,9 @@ } }, "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cacheable-request": { "version": "6.1.0", @@ -2064,9 +2064,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.0.6", @@ -2166,16 +2166,16 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.19.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -2190,7 +2190,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.9.7", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.17.2", @@ -2543,9 +2543,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "nodemon": { "version": "2.0.15", @@ -2693,9 +2693,9 @@ } }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" }, "range-parser": { "version": "1.2.1", @@ -2703,11 +2703,11 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" @@ -3027,9 +3027,9 @@ } }, "ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "requires": {} }, "xdg-basedir": { diff --git a/mock-api/package.json b/mock-api/package.json index 34fcea305..e0613c14a 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -11,11 +11,11 @@ "author": "proddy", "license": "ISC", "dependencies": { - "@msgpack/msgpack": "^2.7.1", + "@msgpack/msgpack": "^2.7.2", "compression": "^1.7.4", - "express": "^4.17.2", + "express": "^4.17.3", "express-sse": "^0.5.3", "nodemon": "^2.0.15", - "ws": "^8.4.2" + "ws": "^8.5.0" } } From d11a67527faa1b22c69fa6691395eabe2db087be Mon Sep 17 00:00:00 2001 From: proddy Date: Thu, 17 Feb 2022 10:45:29 +0100 Subject: [PATCH 064/319] make standalone build compile again --- lib_standalone/Arduino.cpp | 13 ++++++++----- lib_standalone/Arduino.h | 8 ++++++-- lib_standalone/ESP8266React.h | 33 +++++++++++++++++---------------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/lib_standalone/Arduino.cpp b/lib_standalone/Arduino.cpp index ea3cea100..25dd6ba3a 100644 --- a/lib_standalone/Arduino.cpp +++ b/lib_standalone/Arduino.cpp @@ -125,8 +125,11 @@ uint32_t analogReadMilliVolts(uint8_t pin) { return 0; } -void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation) { -} - -void analogSetAttenuation(adc_attenuation_t attenuation) { -} +void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation){}; +void analogSetAttenuation(adc_attenuation_t attenuation){}; +void dacWrite(uint8_t pin, uint8_t value){}; +double ledcSetup(uint8_t chan, double freq, uint8_t bit_num) { + return 0; +}; +void ledcAttachPin(uint8_t pin, uint8_t chan){}; +void ledcWrite(uint8_t chan, uint32_t duty){}; diff --git a/lib_standalone/Arduino.h b/lib_standalone/Arduino.h index 896d862a3..85a750400 100644 --- a/lib_standalone/Arduino.h +++ b/lib_standalone/Arduino.h @@ -59,8 +59,12 @@ int digitalRead(uint8_t pin); uint32_t analogReadMilliVolts(uint8_t pin); typedef enum { ADC_0db, ADC_2_5db, ADC_6db, ADC_11db } adc_attenuation_t; -void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation); -void analogSetAttenuation(adc_attenuation_t attenuation); +void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation); +void analogSetAttenuation(adc_attenuation_t attenuation); +void dacWrite(uint8_t pin, uint8_t value); +double ledcSetup(uint8_t chan, double freq, uint8_t bit_num); +void ledcAttachPin(uint8_t pin, uint8_t chan); +void ledcWrite(uint8_t chan, uint32_t duty); #define PROGMEM #define PGM_P const char * diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index 2bed076cf..600a1c74a 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -54,22 +54,23 @@ class DummySettings { uint8_t solar_maxflow = 30; // MQTT - uint16_t publish_time = 10; - uint8_t mqtt_qos = 0; - bool mqtt_retain = false; - bool enabled = true; - uint8_t nested_format = 1; // 1=nested 2=single - String discovery_prefix = "homeassistant"; - bool ha_enabled = true; - String base = "ems-esp"; - bool publish_single = false; - bool send_response = true; - String host = "192.168.1.4"; - uint16_t port = 1883; - String clientId = "ems-esp"; - String username = ""; - uint16_t keepAlive = 60; - bool cleanSession = false; + uint16_t publish_time = 10; + uint8_t mqtt_qos = 0; + bool mqtt_retain = false; + bool enabled = true; + uint8_t nested_format = 1; // 1=nested 2=single + String discovery_prefix = "homeassistant"; + bool ha_enabled = true; + String base = "ems-esp"; + bool publish_single = false; + bool publish_single2cmd = false; + bool send_response = true; + String host = "192.168.1.4"; + uint16_t port = 1883; + String clientId = "ems-esp"; + String username = ""; + uint16_t keepAlive = 60; + bool cleanSession = false; uint16_t publish_time_boiler = 10; uint16_t publish_time_thermostat = 10; From ca04ebccd295ad8c6096f7bd5044563bd81cae11 Mon Sep 17 00:00:00 2001 From: proddy Date: Thu, 17 Feb 2022 10:45:44 +0100 Subject: [PATCH 065/319] formatting warning --- interface/src/project/types.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index b5f3a9497..2da66b4a3 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -201,8 +201,8 @@ export const DeviceValueUOM_s = [ '°F', 'mV', 'sqm', - "m3", - "l" + 'm3', + 'l' ]; export enum AnalogType { @@ -231,7 +231,6 @@ export const AnalogTypeNames = [ 'PWM 2' ]; - type BoardProfiles = { [name: string]: string; }; From d8f32d6adec0f9b9785dfd90e353229260548628 Mon Sep 17 00:00:00 2001 From: proddy Date: Thu, 17 Feb 2022 10:46:02 +0100 Subject: [PATCH 066/319] hard code 128 as topic length to prevent compiler warnings --- src/mqtt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqtt.h b/src/mqtt.h index 8fed88ec0..3295e4f6f 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -70,7 +70,7 @@ class Mqtt { enum Operation : uint8_t { PUBLISH, SUBSCRIBE, UNSUBSCRIBE }; enum NestedFormat : uint8_t { NESTED = 1, SINGLE }; - static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = FACTORY_MQTT_MAX_TOPIC_LENGTH; // fixed, not a user setting anymore + static constexpr uint8_t MQTT_TOPIC_MAX_SIZE = 128; // fixed, not a user setting anymore static void on_connect(); From f1f089baa0434d7cf47d447a0130e76e53189ea4 Mon Sep 17 00:00:00 2001 From: proddy Date: Thu, 17 Feb 2022 10:46:21 +0100 Subject: [PATCH 067/319] v is always <= 255 --- src/analogsensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 147440e82..e798df498 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -530,7 +530,7 @@ bool AnalogSensor::command_setvalue(const char * value, const int8_t id) { return true; } else if (sensor.type() == AnalogType::DIGITAL_OUT) { uint8_t v = val; - if ((sensor.id() == 25 || sensor.id() == 26) && v <= 255) { + if ((sensor.id() == 25 || sensor.id() == 26)) { sensor.set_offset(v); sensor.set_value(v); pinMode(sensor.id(), OUTPUT); From fb05558ab947cbbce3d17af66f915ca709029bbb Mon Sep 17 00:00:00 2001 From: proddy Date: Fri, 18 Feb 2022 20:28:15 +0100 Subject: [PATCH 068/319] fix static analysis warnings --- Makefile | 2 +- src/dallassensor.h | 19 +++++++++---------- src/devices/boiler.h | 1 - src/helpers.cpp | 2 +- src/mqtt.cpp | 10 +++++----- src/system.cpp | 2 ++ 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 13f4a2ee1..88cac6bc0 100644 --- a/Makefile +++ b/Makefile @@ -73,8 +73,8 @@ CPPFLAGS += -Os CFLAGS += $(CPPFLAGS) CFLAGS += -Wall -CFLAGS += -Wno-unused -Wno-restrict CFLAGS += -Wextra +CFLAGS += -Wno-unused-parameter CXXFLAGS += $(CFLAGS) -MMD diff --git a/src/dallassensor.h b/src/dallassensor.h index abb4745bf..f6add0adf 100644 --- a/src/dallassensor.h +++ b/src/dallassensor.h @@ -147,10 +147,6 @@ class DallasSensor { static uuid::log::Logger logger_; -#ifndef EMSESP_STANDALONE - OneWire bus_; -#endif - bool temperature_convert_complete(); int16_t get_temperature_c(const uint8_t addr[]); uint64_t get_id(const uint8_t addr[]); @@ -159,19 +155,22 @@ class DallasSensor { bool command_info(const char * value, const int8_t id, JsonObject & output); bool command_commands(const char * value, const int8_t id, JsonObject & output); - uint32_t last_activity_ = uuid::get_uptime(); - State state_ = State::IDLE; - std::vector sensors_; // our list of active sensors - int8_t scancnt_ = SCAN_START; - uint8_t firstscan_ = 0; +#ifndef EMSESP_STANDALONE + OneWire bus_; + uint32_t last_activity_ = uuid::get_uptime(); + State state_ = State::IDLE; + int8_t scancnt_ = SCAN_START; + uint8_t firstscan_ = 0; + int8_t scanretry_ = 0; +#endif + uint8_t dallas_gpio_ = 0; bool parasite_ = false; bool changed_ = false; uint32_t sensorfails_ = 0; uint32_t sensorreads_ = 0; - int8_t scanretry_ = 0; }; } // namespace emsesp diff --git a/src/devices/boiler.h b/src/devices/boiler.h index c53d0b3f5..d83973260 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -177,7 +177,6 @@ class Boiler : public EMSdevice { uint8_t hpCoolingOn_; uint8_t hpWwOn_; uint8_t hpPoolOn_; - uint8_t hpHeatingOn; int16_t hpTc0_; int16_t hpTc1_; int16_t hpTc3_; diff --git a/src/helpers.cpp b/src/helpers.cpp index 0f9b339f3..108b5783f 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -200,7 +200,7 @@ char * Helpers::render_value(char * result, const char * value, const int8_t for // format: 255(0xFF)=boolean, 0=no formatting, otherwise divide by format char * Helpers::render_value(char * result, uint8_t value, int8_t format, const uint8_t fahrenheit) { // special check if its a boolean - if (format == EMS_VALUE_BOOL) { + if ((uint8_t)format == EMS_VALUE_BOOL) { if (value == EMS_VALUE_BOOL_OFF) { render_boolean(result, false); } else if (value == EMS_VALUE_BOOL_NOTSET) { diff --git a/src/mqtt.cpp b/src/mqtt.cpp index ddd6d1b69..a69254977 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -62,11 +62,11 @@ MAKE_PSTR(iconpercent, "mdi:percent-outline") // DeviceValueUOM::PERCENT MAKE_PSTR(icontime, "mdi:clock-outline") // DeviceValueUOM::SECONDS MINUTES & HOURS MAKE_PSTR(iconkb, "mdi:memory") // DeviceValueUOM::KB MAKE_PSTR(iconlmin, "mdi:water-boiler") // DeviceValueUOM::LMIN -MAKE_PSTR(iconkwh, "mdi:transmission-tower") // DeviceValueUOM::KWH & WH +// MAKE_PSTR(iconkwh, "mdi:transmission-tower") // DeviceValueUOM::KWH & WH MAKE_PSTR(iconua, "mdi:lightning-bolt-circle") // DeviceValueUOM::UA -MAKE_PSTR(iconbar, "mdi:gauge") // DeviceValueUOM::BAR -MAKE_PSTR(iconkw, "mdi:omega") // DeviceValueUOM::KW & W -MAKE_PSTR(icondbm, "mdi:wifi-strength-2") // DeviceValueUOM::DBM +// MAKE_PSTR(iconbar, "mdi:gauge") // DeviceValueUOM::BAR +// MAKE_PSTR(iconkw, "mdi:omega") // DeviceValueUOM::KW & W +// MAKE_PSTR(icondbm, "mdi:wifi-strength-2") // DeviceValueUOM::DBM MAKE_PSTR(iconnum, "mdi:counter") // DeviceValueUOM::NONE MAKE_PSTR(icondevice, "mdi:home-automation") // for devices in HA @@ -253,7 +253,7 @@ void Mqtt::incoming(const char * topic, const char * payload) { void Mqtt::on_message(const char * topic, const char * payload, size_t len) { // sometimes the payload is not terminated correctly, so make a copy // convert payload to a null-terminated char string - char message[len + 2] = {'\0'}; + char message[len + 2]; if (payload != nullptr) { strlcpy(message, payload, len + 1); } diff --git a/src/system.cpp b/src/system.cpp index d05dffb29..80a66086b 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -252,7 +252,9 @@ void System::format(uuid::console::Shell & shell) { } void System::syslog_init() { +#ifndef EMSESP_STANDALONE bool was_enabled = syslog_enabled_; +#endif EMSESP::webSettingsService.read([&](WebSettings & settings) { syslog_enabled_ = settings.syslog_enabled; syslog_level_ = settings.syslog_level; From a67913d660d4b1c5679c00007bddc2d5ca8807a6 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 19 Feb 2022 10:54:27 +0100 Subject: [PATCH 069/319] publish all mixers to one json --- src/emsesp.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 9a9c53ddd..5d99037c0 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -553,7 +553,7 @@ void EMSESP::reset_mqtt_ha() { // generate_values_json is called to build the device value (dv) object array void EMSESP::publish_device_values(uint8_t device_type) { DynamicJsonDocument doc(EMSESP_JSON_SIZE_XLARGE_DYN); - JsonObject json; + JsonObject json = doc.to(); bool need_publish = false; bool nested = (Mqtt::is_nested()); @@ -608,7 +608,6 @@ void EMSESP::publish_device_values(uint8_t device_type) { // Mixer else if (device_type == DeviceType::MIXER) { if (nested) { - json = doc.to(); need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } else { for (uint8_t hc_tag = DeviceValueTAG::TAG_HC1; hc_tag <= DeviceValueTAG::TAG_WWC4; hc_tag++) { From 5f6939552208e511b1bd011988d9870727102b8b Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 19 Feb 2022 12:25:01 +0100 Subject: [PATCH 070/319] add missing subscriptions to dallas/analog --- src/analogsensor.cpp | 2 ++ src/dallassensor.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index e798df498..0fb66a6e8 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -49,6 +49,8 @@ void AnalogSensor::start() { F_(commands), [&](const char * value, const int8_t id, JsonObject & output) { return command_commands(value, id, output); }, F_(commands_cmd)); + + Mqtt::subscribe(EMSdevice::DeviceType::ANALOGSENSOR, "analogsensor/#", nullptr); // use empty function callback } // load settings from the customization file, sorts them and initializes the GPIOs diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index d8e9722ba..0a69b6f17 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -55,6 +55,8 @@ void DallasSensor::start() { F_(commands), [&](const char * value, const int8_t id, JsonObject & output) { return command_commands(value, id, output); }, F_(commands_cmd)); + + Mqtt::subscribe(EMSdevice::DeviceType::DALLASSENSOR, "dallasssensor/#", nullptr); // use empty function callback } // load settings From 1badaa725e051d544fcf82ed427c02e094471bd3 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 20 Feb 2022 13:38:18 +0100 Subject: [PATCH 071/319] update test for ha --- src/test/test.cpp | 16 ++++++++-------- src/test/test.h | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/test.cpp b/src/test/test.cpp index 5ff31d816..70d32ce92 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -496,19 +496,19 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const if (command == "ha") { shell.printfln(F("Testing HA mqtt discovery")); - // Mqtt::ha_enabled(true); - Mqtt::ha_enabled(false); + Mqtt::ha_enabled(true); + // Mqtt::ha_enabled(false); - // Mqtt::nested_format(1); // is nested - Mqtt::nested_format(2); // not nested + Mqtt::nested_format(1); // is nested + // Mqtt::nested_format(2); // not nested - // run_test("boiler"); + run_test("boiler"); run_test("thermostat"); - // run_test("solar"); - // run_test("mixer"); + run_test("solar"); + run_test("mixer"); shell.invoke_command("call system publish"); - // shell.invoke_command("show mqtt"); + shell.invoke_command("show mqtt"); // shell.invoke_command("call boiler fanwork"); // shell.invoke_command("call thermostat seltemp"); // sensor.thermostat_hc1_selected_room_temperature diff --git a/src/test/test.h b/src/test/test.h index f949b5f3b..9ca31dd36 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -35,8 +35,8 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "boiler" // #define EMSESP_DEBUG_DEFAULT "mqtt2" // #define EMSESP_DEBUG_DEFAULT "mqtt_nested" -// #define EMSESP_DEBUG_DEFAULT "ha" -#define EMSESP_DEBUG_DEFAULT "exclude" +#define EMSESP_DEBUG_DEFAULT "ha" +// #define EMSESP_DEBUG_DEFAULT "exclude" // #define EMSESP_DEBUG_DEFAULT "board_profile" // #define EMSESP_DEBUG_DEFAULT "shower_alert" // #define EMSESP_DEBUG_DEFAULT "310" From fcab3b1d4688a091b7a50361e7e1d9a62032e4f3 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 20 Feb 2022 13:38:28 +0100 Subject: [PATCH 072/319] update packages --- interface/package-lock.json | 70 +++++++++++++++++++------------------ interface/package.json | 4 +-- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 7a3848553..104a0b285 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -8,8 +8,8 @@ "name": "EMS-ESP", "version": "3.4.0", "dependencies": { - "@emotion/react": "^11.7.1", - "@emotion/styled": "^11.6.0", + "@emotion/react": "^11.8.1", + "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.4.2", "@mui/material": "^5.4.2", @@ -1857,9 +1857,9 @@ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz", - "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz", + "integrity": "sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==", "dependencies": { "@emotion/memoize": "^0.7.4" } @@ -1870,15 +1870,16 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "node_modules/@emotion/react": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz", - "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.1.tgz", + "integrity": "sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==", "dependencies": { "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", "@emotion/serialize": "^1.0.2", "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", + "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" }, @@ -1913,15 +1914,15 @@ "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" }, "node_modules/@emotion/styled": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz", - "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.8.1.tgz", + "integrity": "sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==", "dependencies": { "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.3.0", - "@emotion/is-prop-valid": "^1.1.1", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/is-prop-valid": "^1.1.2", "@emotion/serialize": "^1.0.2", - "@emotion/utils": "^1.0.0" + "@emotion/utils": "^1.1.0" }, "peerDependencies": { "@babel/core": "^7.0.0", @@ -1943,9 +1944,9 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@emotion/utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", - "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" }, "node_modules/@emotion/weak-memoize": { "version": "0.2.5", @@ -18714,9 +18715,9 @@ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@emotion/is-prop-valid": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz", - "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz", + "integrity": "sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==", "requires": { "@emotion/memoize": "^0.7.4" } @@ -18727,15 +18728,16 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "@emotion/react": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz", - "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.1.tgz", + "integrity": "sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==", "requires": { "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", "@emotion/serialize": "^1.0.2", "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", + "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" } @@ -18758,15 +18760,15 @@ "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" }, "@emotion/styled": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz", - "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.8.1.tgz", + "integrity": "sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==", "requires": { "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.3.0", - "@emotion/is-prop-valid": "^1.1.1", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/is-prop-valid": "^1.1.2", "@emotion/serialize": "^1.0.2", - "@emotion/utils": "^1.0.0" + "@emotion/utils": "^1.1.0" } }, "@emotion/unitless": { @@ -18775,9 +18777,9 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "@emotion/utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", - "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" }, "@emotion/weak-memoize": { "version": "0.2.5", diff --git a/interface/package.json b/interface/package.json index 289c93418..eb29d0402 100644 --- a/interface/package.json +++ b/interface/package.json @@ -4,8 +4,8 @@ "private": true, "proxy": "http://localhost:3080", "dependencies": { - "@emotion/react": "^11.7.1", - "@emotion/styled": "^11.6.0", + "@emotion/react": "^11.8.1", + "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.4.2", "@mui/material": "^5.4.2", From cffc44b47135148e73d2ede1eeb7d69026ece674 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 20 Feb 2022 13:38:42 +0100 Subject: [PATCH 073/319] formatting --- interface/src/framework/mqtt/MqttSettingsForm.tsx | 10 ++++++---- interface/src/project/DashboardData.tsx | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index e251bbcf9..fda328a59 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -193,8 +193,10 @@ const MqttSettingsForm: FC = () => { {data.publish_single && ( } - label="publish to command topics (ioBroker)" + control={ + + } + label="Publish to command topics (ioBroker)" /> )} @@ -203,14 +205,14 @@ const MqttSettingsForm: FC = () => { } - label="Enable MQTT Discovery (for Home Assistant, Domoticz)" + label="Enable MQTT Discovery (Home Assistant, Domoticz)" /> {data.ha_enabled && ( { InputProps={{ startAdornment: % }} - /> From 493238e6963a6bfc32aac9f9df70477e46ea292e Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 20 Feb 2022 13:38:59 +0100 Subject: [PATCH 074/319] bump 3.4.0b7 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index ead90ccd1..c726fbf26 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b6" +#define EMSESP_APP_VERSION "3.4.0b7" From 35fec3150b046911004072fbee0a8943cdc39a5e Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 20 Feb 2022 13:39:36 +0100 Subject: [PATCH 075/319] remove obsolete create_device_config and icons --- src/mqtt.cpp | 46 ++++++++++++++++++++++------------------------ src/mqtt.h | 2 -- 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index a69254977..3f642dcd3 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -63,12 +63,12 @@ MAKE_PSTR(icontime, "mdi:clock-outline") // DeviceValueUOM::SECONDS MIN MAKE_PSTR(iconkb, "mdi:memory") // DeviceValueUOM::KB MAKE_PSTR(iconlmin, "mdi:water-boiler") // DeviceValueUOM::LMIN // MAKE_PSTR(iconkwh, "mdi:transmission-tower") // DeviceValueUOM::KWH & WH -MAKE_PSTR(iconua, "mdi:lightning-bolt-circle") // DeviceValueUOM::UA +MAKE_PSTR(iconua, "mdi:lightning-bolt-circle") // DeviceValueUOM::UA // MAKE_PSTR(iconbar, "mdi:gauge") // DeviceValueUOM::BAR // MAKE_PSTR(iconkw, "mdi:omega") // DeviceValueUOM::KW & W // MAKE_PSTR(icondbm, "mdi:wifi-strength-2") // DeviceValueUOM::DBM -MAKE_PSTR(iconnum, "mdi:counter") // DeviceValueUOM::NONE -MAKE_PSTR(icondevice, "mdi:home-automation") // for devices in HA +MAKE_PSTR(iconnum, "mdi:counter") // DeviceValueUOM::NONE +MAKE_PSTR(icondevice, "mdi:home-automation") // for devices in HA uuid::log::Logger Mqtt::logger_{F_(mqtt), uuid::log::Facility::DAEMON}; @@ -892,19 +892,8 @@ void Mqtt::process_queue() { mqtt_messages_.pop_front(); // remove the message from the queue } -// publish HA sensor for System using the heartbeat tag -void Mqtt::publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom) { - StaticJsonDocument doc; - JsonObject dev_json = doc.createNestedObject("dev"); - - JsonArray ids = dev_json.createNestedArray("ids"); - ids.add("ems-esp"); - - publish_ha_sensor_config(type, DeviceValueTAG::TAG_HEARTBEAT, name, EMSdevice::DeviceType::SYSTEM, entity, uom, false, false, false, nullptr, 0, 0, 0, dev_json); -} - // create's a ha sensor config topic from a device value object -// and also takes a flag to see whether it will also create the main HA device config +// and also takes a flag (create_device_config) used to also create the main HA device config. This is only needed for one entity void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, const std::string & brand, const bool remove, const bool create_device_config) { StaticJsonDocument dev_json; @@ -934,7 +923,6 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, dv.short_name, dv.uom, remove, - create_device_config, dv.has_cmd, dv.options, dv.options_size, @@ -943,17 +931,27 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, dev_json.as()); } +// publish HA sensor for System using the heartbeat tag +void Mqtt::publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom) { + StaticJsonDocument doc; + JsonObject dev_json = doc.createNestedObject("dev"); + + JsonArray ids = dev_json.createNestedArray("ids"); + ids.add("ems-esp"); + + publish_ha_sensor_config(type, DeviceValueTAG::TAG_HEARTBEAT, name, EMSdevice::DeviceType::SYSTEM, entity, uom, false, false, nullptr, 0, 0, 0, dev_json); +} + // MQTT discovery configs // entity must match the key/value pair in the *_data topic // note: some extra string copying done here, it looks messy but does help with heap fragmentation issues -void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType - uint8_t tag, // EMSdevice::DeviceValueTAG - const __FlashStringHelper * name, // fullname - const uint8_t device_type, // EMSdevice::DeviceType - const __FlashStringHelper * entity, // shortname - const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE) - const bool remove, // true if we want to remove this topic - const bool create_device_config, // true if need to create main device config +void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType + uint8_t tag, // EMSdevice::DeviceValueTAG + const __FlashStringHelper * name, // fullname + const uint8_t device_type, // EMSdevice::DeviceType + const __FlashStringHelper * entity, // shortname + const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE) + const bool remove, // true if we want to remove this topic const bool has_cmd, const __FlashStringHelper * const * options, uint8_t options_size, diff --git a/src/mqtt.h b/src/mqtt.h index 3295e4f6f..9fe8442f8 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -92,7 +92,6 @@ class Mqtt { static void publish_ha_sensor_config(DeviceValue & dv, const std::string & model, const std::string & brand, const bool remove, const bool create_device_config = false); - static void publish_ha_sensor_config(uint8_t type, uint8_t tag, const __FlashStringHelper * name, @@ -100,7 +99,6 @@ class Mqtt { const __FlashStringHelper * entity, const uint8_t uom, const bool remove, - const bool create_device_config, const bool has_cmd, const __FlashStringHelper * const * options, uint8_t options_size, From 935e04b266fc13f7bd770b956e7143503261d145 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 20 Feb 2022 13:40:58 +0100 Subject: [PATCH 076/319] fixes Excluding thermostat entities should also remove the climate discovery topic #368 --- src/emsdevice.h | 3 ++- src/emsesp.cpp | 15 ++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/emsdevice.h b/src/emsdevice.h index 1ae6b8fce..721cf3010 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -245,7 +245,8 @@ class EMSdevice { void publish_value(void * value); void publish_all_values(); - void publish_mqtt_ha_entity_config(); + void mqtt_ha_entity_config_create(); + void mqtt_ha_entity_config_remove(); const std::string telegram_type_name(std::shared_ptr telegram); diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 5d99037c0..ff6badbfa 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -560,13 +560,18 @@ void EMSESP::publish_device_values(uint8_t device_type) { // group by device type for (const auto & emsdevice : emsdevices) { if (emsdevice && (emsdevice->device_type() == device_type)) { - // specially for HA + // specially for MQTT Discovery // we may have some RETAINED /config topics that reference fields in the data payloads that no longer exist // remove them immediately to prevent HA from complaining // we need to do this first before the data payload is published, and only done once! - if (Mqtt::ha_enabled() && emsdevice->ha_config_firstrun()) { - emsdevice->ha_config_clear(); - emsdevice->ha_config_firstrun(false); + if (Mqtt::ha_enabled()) { + if (emsdevice->ha_config_firstrun()) { + emsdevice->ha_config_clear(); + emsdevice->ha_config_firstrun(false); + } else { + // see if we need to delete and /config topics before adding the payloads + emsdevice->mqtt_ha_entity_config_remove(); + } } // if its a boiler, generate json for each group and publish it directly. not nested @@ -627,7 +632,7 @@ void EMSESP::publish_device_values(uint8_t device_type) { // we want to create the /config topic after the data payload to prevent HA from throwing up a warning if (Mqtt::ha_enabled()) { - emsdevice->publish_mqtt_ha_entity_config(); + emsdevice->mqtt_ha_entity_config_create(); } } } From d06145bb3ae7fcd05d8dfe90ab8ee046e12c424d Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 20 Feb 2022 13:41:12 +0100 Subject: [PATCH 077/319] formatting --- src/devices/thermostat.cpp | 23 ++++++++------- src/emsdevice.cpp | 59 ++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 46 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index db80f594f..310dac535 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -459,15 +459,7 @@ void Thermostat::publish_ha_config_hc(std::shared_ptr()); // publish the config payload with retain flag - - /* - // enable the a special "thermostat_hc" topic to take both mode strings and floats for each of the heating circuits - std::string topic2(Mqtt::MQTT_TOPIC_MAX_SIZE, '\0'); - snprintf(&topic2[0], topic2.capacity() + 1, "thermostat_hc%d", hc_num); - Mqtt::subscribe(EMSdevice::DeviceType::THERMOSTAT, topic2, [=](const char * m) { return thermostat_ha_cmd(m, hc_num); }); - */ } // for HA specifically when receiving over MQTT in the thermostat topic @@ -679,12 +671,21 @@ void Thermostat::process_RC10Monitor(std::shared_ptr telegram) { // add the HVAC/Climate HA component for the HC void Thermostat::add_ha_climate(std::shared_ptr hc) { - if (!Mqtt::ha_enabled() || (hc->ha_climate_created())) { + if (!Mqtt::ha_enabled()) { return; } - // only if it has a valid seltemp (roomtemp is optional) - if (Helpers::hasValue(hc->selTemp)) { + bool has_values = Helpers::hasValue(hc->selTemp) && Helpers::hasValue(hc->roomTemp); + + // see if we need to remove the HA climate component because some of the values have been lost + // note, this doesn't account for whether any of the device values have been excluded + if (hc->ha_climate_created() && !has_values) { + // remove the whole climate component + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "climate/%s/thermostat_hc%d/config", Mqtt::base().c_str(), hc->hc_num()); + Mqtt::publish_ha(topic); + } else { + // create publish_ha_config_hc(hc); hc->ha_climate_created(true); // only create it once } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 17a0f4434..8d4cd336d 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -779,7 +779,7 @@ void EMSdevice::exclude_entity(uint8_t id) { for (auto & dv : devicevalues_) { if (dv.id == id) { #if defined(EMSESP_USE_SERIAL) - Serial.print("exclude_entity() Removing state for device value: "); + Serial.print("exclude_entity() Removing Visible for device value: "); Serial.println(read_flash_string(dv.full_name).c_str()); #endif dv.remove_state(DeviceValueState::DV_VISIBLE); // this will remove from MQTT payloads and showing in web & console @@ -1225,47 +1225,36 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c return has_values; } +// remove the Home Assistant configs for each device value/entity if its not visible or active +// this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() +void EMSdevice::mqtt_ha_entity_config_remove() { + for (auto & dv : devicevalues_) { + if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) + && ((!dv.has_state(DeviceValueState::DV_VISIBLE)) || (!dv.has_state(DeviceValueState::DV_ACTIVE)))) { + Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + } + } +} + // create the Home Assistant configs for each device value / entity -// this is called when an MQTT publish is done via an EMS Device in emsesp.cpp -void EMSdevice::publish_mqtt_ha_entity_config() { - // create the main device config if not already done, per device type - bool create_device_config = !ha_config_done(); +// this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() +void EMSdevice::mqtt_ha_entity_config_create() { + bool create_device_config = !ha_config_done(); // do we need to create the main Discovery device config with this entity? // check the state of each of the device values + // create the discovery topic if if hasn't already been created, not a command (like reset) and is active and visible for (auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_ACTIVE)) { - // entity has an active value (it means it contains a valid value) - - if (dv.has_state(DeviceValueState::DV_VISIBLE)) { - // visible - // if the HA config topic hasn't been created it, do it now (unless its a command like reset) - if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.type != DeviceValueType::CMD) { - Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); - dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); - if (create_device_config) { - create_device_config = false; - } - } - } else { - // not visible. It must be on the entity exclusion list defined in the Customizations service - // if a HA config topic was created then remove it. This entity has become 'lost' - if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED)) { - Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), true, create_device_config); // remove /config - dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); - } - } - } else { - // entity does not have an active value - // if a HA config topic was created then remove it. This entity has become 'lost' - // https://github.com/emsesp/EMS-ESP32/issues/196 - if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED)) { - Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), true, create_device_config); // remove /config - dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); - } + if ((!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.type != DeviceValueType::CMD) && dv.has_state(DeviceValueState::DV_ACTIVE) + && dv.has_state(DeviceValueState::DV_VISIBLE)) { + // create_device_config is only done once for the EMS device. It can added to any entity, so we take the first + Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); + dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); + create_device_config = false; // only create the main config once } } - ha_config_done(true); // assume we've created the config + ha_config_done(!create_device_config); } // remove all config topics in HA From a4ba130e5ff3cf8a52d85746f81184f2137e7dca Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 20 Feb 2022 16:29:49 +0100 Subject: [PATCH 078/319] add ww to thermostat single publish --- src/emsesp.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 5d99037c0..7ea820c98 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -591,7 +591,9 @@ void EMSESP::publish_device_values(uint8_t device_type) { need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } else { json = doc.to(); - if (emsdevice->generate_values(json, DeviceValueTAG::TAG_THERMOSTAT_DATA, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested + need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_THERMOSTAT_DATA, false, EMSdevice::OUTPUT_TARGET::MQTT); // not nested + need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_DEVICE_DATA_WW, false, EMSdevice::OUTPUT_TARGET::MQTT); + if (need_publish) { Mqtt::publish(Mqtt::tag_to_topic(device_type, DeviceValueTAG::TAG_NONE), json); } for (uint8_t hc_tag = DeviceValueTAG::TAG_HC1; hc_tag <= DeviceValueTAG::TAG_HC8; hc_tag++) { From 63a94dcef1563fc2dd2033dc6d7e5eb9fec35dac Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 21 Feb 2022 10:29:10 +0100 Subject: [PATCH 079/319] fix HA climate --- src/devices/thermostat.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 310dac535..ac18865e4 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -675,19 +675,18 @@ void Thermostat::add_ha_climate(std::shared_ptr hc) { return; } - bool has_values = Helpers::hasValue(hc->selTemp) && Helpers::hasValue(hc->roomTemp); - - // see if we need to remove the HA climate component because some of the values have been lost // note, this doesn't account for whether any of the device values have been excluded - if (hc->ha_climate_created() && !has_values) { - // remove the whole climate component - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "climate/%s/thermostat_hc%d/config", Mqtt::base().c_str(), hc->hc_num()); - Mqtt::publish_ha(topic); + if (hc->ha_climate_created()) { + // see if we've lost the selTemp (roomTemp/currTemp is optional and checked in the publish_ha_config_hc() function) + if (!Helpers::hasValue(hc->selTemp)) { + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "climate/%s/thermostat_hc%d/config", Mqtt::base().c_str(), hc->hc_num()); + Mqtt::publish_ha(topic); + } } else { - // create + // create the climate component, only once publish_ha_config_hc(hc); - hc->ha_climate_created(true); // only create it once + hc->ha_climate_created(true); } } From 24216d7b4fa9cf4932b633bab7369a36310c8670 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 23 Feb 2022 10:29:56 +0100 Subject: [PATCH 080/319] move HA climate to mqtt --- src/devices/thermostat.cpp | 188 ++----------------------------------- src/devices/thermostat.h | 13 --- src/emsdevice.cpp | 18 +++- src/emsdevicevalue.h | 3 +- src/mqtt.cpp | 90 ++++++++++++++++++ src/mqtt.h | 10 ++ 6 files changed, 126 insertions(+), 196 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index ac18865e4..d126638e2 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -333,8 +333,6 @@ std::shared_ptr Thermostat::heating_circuit(std::sha auto new_hc = std::make_shared(hc_num, model()); heating_circuits_.push_back(new_hc); - new_hc->ha_climate_created(false); // set flag saying we're ready to create the MQTT Discovery Climate topic for this hc - // sort based on hc number so there's a nice order when displaying // TODO temporarily commented out the HC sorting until I'm 100% sure the return object still references the newly created object // not sure if new_hc and heating_circuits_.back() will still reference the new HC after its sorted - to check! @@ -371,123 +369,6 @@ std::shared_ptr Thermostat::heating_circuit(std::sha return new_hc; // return back point to new HC object } -// publish config topic for HA MQTT Discovery for a heating circuit -// e.g. homeassistant/climate/ems-esp/thermostat_hc1/config -void Thermostat::publish_ha_config_hc(std::shared_ptr hc) { - uint8_t hc_num = hc->hc_num(); - StaticJsonDocument doc; - - char topic_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; - char hc_mode_s[30]; - char seltemp_s[30]; - char currtemp_s[30]; - char mode_str_tpl[400]; - char name_s[30]; - char uniq_id_s[30]; - char temp_cmd_s[30]; - char mode_cmd_s[30]; - char min_s[10]; - char max_s[10]; - - // https://github.com/emsesp/EMS-ESP32/issues/325#issuecomment-1022249093 - // before you had to have a seltemp and roomtemp for the HA to work, now its optional - bool have_current_room_temp = Helpers::hasValue(hc->roomTemp); - - if (Mqtt::is_nested()) { - // nested format - snprintf(hc_mode_s, sizeof(hc_mode_s), "value_json.hc%d.mode", hc_num); - snprintf(seltemp_s, sizeof(seltemp_s), "{{value_json.hc%d.seltemp}}", hc_num); - if (have_current_room_temp) { - snprintf(currtemp_s, sizeof(currtemp_s), "{{value_json.hc%d.currtemp}}", hc_num); - } - snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(EMSdevice::DeviceType::THERMOSTAT, DeviceValueTAG::TAG_NONE).c_str()); - } else { - // single format - snprintf(hc_mode_s, sizeof(hc_mode_s), "value_json.mode"); - snprintf(seltemp_s, sizeof(seltemp_s), "{{value_json.seltemp}}"); - if (have_current_room_temp) { - snprintf(currtemp_s, sizeof(currtemp_s), "{{value_json.currtemp}}"); - } - snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(EMSdevice::DeviceType::THERMOSTAT, DeviceValueTAG::TAG_HC1 + hc_num - 1).c_str()); - } - - snprintf(mode_str_tpl, - sizeof(mode_str_tpl), - "{%%if %s=='manual'%%}heat{%%elif %s=='day'%%}heat{%%elif %s=='night'%%}off{%%elif %s=='off'%%}off{%%else%%}auto{%%endif%%}", - hc_mode_s, - hc_mode_s, - hc_mode_s, - hc_mode_s); - - snprintf(name_s, sizeof(name_s), "Thermostat hc%d", hc_num); - snprintf(uniq_id_s, sizeof(uniq_id_s), "thermostat_hc%d", hc_num); - snprintf(temp_cmd_s, sizeof(temp_cmd_s), "~/thermostat/hc%d/seltemp", hc_num); - snprintf(mode_cmd_s, sizeof(temp_cmd_s), "~/thermostat/hc%d/mode", hc_num); - - doc["~"] = Mqtt::base(); - doc["name"] = name_s; - doc["uniq_id"] = uniq_id_s; - doc["mode_stat_t"] = topic_t; - doc["mode_stat_tpl"] = mode_str_tpl; - doc["temp_cmd_t"] = temp_cmd_s; - doc["temp_stat_t"] = topic_t; - doc["temp_stat_tpl"] = seltemp_s; - doc["mode_cmd_t"] = mode_cmd_s; - - if (have_current_room_temp) { - doc["curr_temp_t"] = topic_t; - doc["curr_temp_tpl"] = currtemp_s; - } - - doc["min_temp"] = Helpers::render_value(min_s, 5, 0, EMSESP::system_.fahrenheit() ? 2 : 0); - doc["max_temp"] = Helpers::render_value(max_s, 30, 0, EMSESP::system_.fahrenheit() ? 2 : 0); - doc["temp_step"] = "0.5"; - - // the HA climate component only responds to auto, heat and off - JsonArray modes = doc.createNestedArray("modes"); - - if (model() != EMSdevice::EMS_DEVICE_FLAG_RC10) { - modes.add("auto"); - } - - modes.add("heat"); - modes.add("off"); - - JsonObject dev = doc.createNestedObject("dev"); - JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp-thermostat"); - - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "climate/%s/thermostat_hc%d/config", Mqtt::base().c_str(), hc_num); - Mqtt::publish_ha(topic, doc.as()); // publish the config payload with retain flag -} - -// for HA specifically when receiving over MQTT in the thermostat topic -// e.g. thermostat_hc1 -// it could be either a 'mode' or a float value for a temperature. we try brute force both and see which one works. -// return true if it parses the message correctly -bool Thermostat::thermostat_ha_cmd(const char * message, uint8_t hc_num) { - // check if it's json. We know the message isn't empty - if (message[0] == '{') { - return false; - } - - // check for mode first, which is a string - if (message[0] >= 'A') { - if (set_mode(message, hc_num)) { - return true; - } - } - if ((message[0] >= '0' && message[0] <= '9') || message[0] == '-') { - // otherwise handle as a numerical temperature value and set the setpoint temp - float f = strtof((char *)message, 0); - set_temperature(f, HeatingCircuit::Mode::AUTO, hc_num); - return true; - } - - return false; -} - // decodes the thermostat mode for the heating circuit based on the thermostat type // modes are off, manual, auto, day, night and holiday uint8_t Thermostat::HeatingCircuit::get_mode() const { @@ -665,29 +546,6 @@ void Thermostat::process_RC10Monitor(std::shared_ptr telegram) { has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte has_update(telegram, hc->roomTemp, 2); // is * 10 has_update(telegram, hc->reduceminutes, 5); - - add_ha_climate(hc); -} - -// add the HVAC/Climate HA component for the HC -void Thermostat::add_ha_climate(std::shared_ptr hc) { - if (!Mqtt::ha_enabled()) { - return; - } - - // note, this doesn't account for whether any of the device values have been excluded - if (hc->ha_climate_created()) { - // see if we've lost the selTemp (roomTemp/currTemp is optional and checked in the publish_ha_config_hc() function) - if (!Helpers::hasValue(hc->selTemp)) { - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "climate/%s/thermostat_hc%d/config", Mqtt::base().c_str(), hc->hc_num()); - Mqtt::publish_ha(topic); - } - } else { - // create the climate component, only once - publish_ha_config_hc(hc); - hc->ha_climate_created(true); - } } // type 0xB0 - for reading the mode from the RC10 thermostat (0x17) @@ -791,8 +649,6 @@ void Thermostat::process_RC20Monitor_2(std::shared_ptr telegram) has_update(telegram, hc->selTemp, 2, 1); // is * 2, force as single byte has_update(telegram, hc->roomTemp, 3); // is * 10 has_bitupdate(telegram, hc->summermode, 1, 0); - - add_ha_climate(hc); } // 0xAD - for reading the mode from the RC20/ES72 thermostat (0x17) @@ -817,8 +673,6 @@ void Thermostat::process_RC20Set_2(std::shared_ptr telegram) { has_update(telegram, hc->minflowtemp, 15); has_update(telegram, hc->maxflowtemp, 16); has_update(telegram, hc->summertemp, 17); - - add_ha_climate(hc); } // 0xAF - for reading the roomtemperature from the RC20/ES72 thermostat (0x18, 0x19, ..) @@ -827,8 +681,7 @@ void Thermostat::process_RC20Remote(std::shared_ptr telegram) { if (hc == nullptr) { return; } - has_update(telegram, hc->roomTemp, 0); - add_ha_climate(hc); + has_update(telegram, hc->remotetemp, 0); } // type 0x0165, ff @@ -844,8 +697,6 @@ void Thermostat::process_JunkersSet(std::shared_ptr telegram) { has_update(telegram, hc->control, 1); // remote: 0-off, 1-FB10, 2-FB100 has_enumupdate(telegram, hc->program, 13, 1); // 1-6: 1 = A, 2 = B,... has_enumupdate(telegram, hc->mode, 14, 1); // 0 = nofrost, 1 = eco, 2 = heat, 3 = auto - - add_ha_climate(hc); } // type 0x0179, ff @@ -860,8 +711,6 @@ void Thermostat::process_JunkersSet2(std::shared_ptr telegram) { has_update(telegram, hc->nofrosttemp, 5); // is * 2 has_enumupdate(telegram, hc->program, 10, 1); // 1-6: 1 = A, 2 = B,... has_enumupdate(telegram, hc->mode, 4, 1); // 0 = nofrost, 1 = eco, 2 = heat, 3 = auto - - add_ha_climate(hc); } // type 0x123 - FR10/FR110 Junkers as remote @@ -870,8 +719,7 @@ void Thermostat::process_JunkersRemoteMonitor(std::shared_ptr te if (hc == nullptr) { return; } - has_update(telegram, hc->roomTemp, 0); // roomTemp from remote - add_ha_climate(hc); + has_update(telegram, hc->remotetemp, 0); // roomTemp from remote } // type 0xA3 - for external temp settings from the the RC* thermostats (e.g. RC35) @@ -892,7 +740,6 @@ void Thermostat::process_RC20Monitor(std::shared_ptr telegram) { has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte has_update(telegram, hc->roomTemp, 2); // is * 10 - add_ha_climate(hc); } // type 0x0A - data from the Nefit Easy/TC100 thermostat (0x18) - 31 bytes long @@ -904,7 +751,6 @@ void Thermostat::process_EasyMonitor(std::shared_ptr telegram) { has_update(telegram, hc->roomTemp, 8); // is * 100 has_update(telegram, hc->selTemp, 10); // is * 100 - add_ha_climate(hc); } // Settings Parameters - 0xA5 - RC30_1 @@ -984,9 +830,7 @@ void Thermostat::process_JunkersMonitor(std::shared_ptr telegram } else { has_update(telegram, hc->roomTemp, 4); // value is * 10 } - - add_ha_climate(hc); -} + } // type 0x02A5 - data from Worchester CRF200 void Thermostat::process_CRFMonitor(std::shared_ptr telegram) { @@ -1000,8 +844,6 @@ void Thermostat::process_CRFMonitor(std::shared_ptr telegram) { has_bitupdate(telegram, hc->mode, 2, 4); // bit 4, mode (auto=0, off=1) has_update(telegram, hc->selTemp, 6, 1); // is * 2, force as single byte has_update(telegram, hc->targetflowtemp, 4); - - add_ha_climate(hc); } // type 0x02A5 - data from the Nefit RC1010/3000 thermostat (0x18) and RC300/310s on 0x10 @@ -1026,8 +868,6 @@ void Thermostat::process_RC300Monitor(std::shared_ptr telegram) has_bitupdate(telegram, hc->summermode, 2, 4); has_update(telegram, hc->targetflowtemp, 4); has_update(telegram, hc->curroominfl, 27); - - add_ha_climate(hc); } // type 0x02B9 EMS+ for reading from RC300/RC310 thermostat @@ -1182,8 +1022,6 @@ void Thermostat::process_RC30Monitor(std::shared_ptr telegram) { has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte has_update(telegram, hc->roomTemp, 2); - - add_ha_climate(hc); } // type 0xA7 - for reading the mode from the RC30 thermostat (0x10) @@ -1193,8 +1031,6 @@ void Thermostat::process_RC30Set(std::shared_ptr telegram) { return; } has_update(telegram, hc->mode, 23); - - add_ha_climate(hc); } // type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4) - data from the RC35 thermostat (0x10) - 16 bytes @@ -1216,23 +1052,13 @@ void Thermostat::process_RC35Monitor(std::shared_ptr telegram) { } has_update(telegram, hc->selTemp, 2, 1); // is * 2, force to single byte, is 0 in summermode - int16_t roomTemp = hc->roomTemp; - has_update(telegram, hc->roomTemp, 3); // is * 10 - or 0x7D00 if thermostat is mounted on boiler - // publish zero if there was a roomtemp, but now is missing - if (Helpers::hasValue(roomTemp) && !Helpers::hasValue(hc->roomTemp)) { - roomTemp = hc->roomTemp; - hc->roomTemp = 0; - has_update(hc->roomTemp); - hc->roomTemp = roomTemp; - } + has_update(telegram, hc->roomTemp, 3); // is * 10 - or 0x7D00 if thermostat is mounted on boiler has_bitupdate(telegram, hc->modetype, 1, 1); has_bitupdate(telegram, hc->summermode, 1, 0); has_bitupdate(telegram, hc->holidaymode, 0, 5); has_update(telegram, hc->targetflowtemp, 14); - - add_ha_climate(hc); } // type 0x3D (HC1), 0x47 (HC2), 0x51 (HC3), 0x5B (HC4) - Working Mode Heating - for reading the mode from the RC35 thermostat (0x10) @@ -1273,8 +1099,6 @@ void Thermostat::process_RC35Set(std::shared_ptr telegram) { has_update(telegram, hc->designtemp, 17); // is * 1 has_update(telegram, hc->maxflowtemp, 15); // is * 1 } - - add_ha_climate(hc); } // type 0x3F (HC1), 0x49 (HC2), 0x53 (HC3), 0x5D (HC4) - timer setting @@ -1512,7 +1336,7 @@ bool Thermostat::set_remotetemp(const char * value, const int8_t id) { } Roomctrl::set_remotetemp(hc->hc(), hc->remotetemp); - // has_update(hc->remotetemp); + has_update(hc->remotetemp); return true; } @@ -3423,6 +3247,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrheatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp)); register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); + register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_remotetemp)); break; case EMS_DEVICE_FLAG_RC25: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); @@ -3488,6 +3313,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrnofrosttemp, DeviceValueType::INT, FL_(div2), FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_j_control), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode4), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); + register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES); break; } } diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index dc2d20771..8f1f77b7b 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -96,14 +96,6 @@ class Thermostat : public EMSdevice { return Helpers::hasValue(selTemp); } - bool ha_climate_created() { - return ha_climate_created_; - } - - void ha_climate_created(bool ha_climate_created) { - ha_climate_created_ = ha_climate_created; - } - uint8_t get_mode() const; uint8_t get_mode_type() const; @@ -142,7 +134,6 @@ class Thermostat : public EMSdevice { private: uint8_t hc_num_; // heating circuit number 1..10 uint8_t model_; // the model type - bool ha_climate_created_; // if we need to create the HA climate control }; static std::string mode_tostring(uint8_t mode); @@ -298,12 +289,8 @@ class Thermostat : public EMSdevice { std::shared_ptr heating_circuit(std::shared_ptr telegram); std::shared_ptr heating_circuit(const uint8_t hc_num); - void publish_ha_config_hc(std::shared_ptr hc); void register_device_values_hc(std::shared_ptr hc); - bool thermostat_ha_cmd(const char * message, uint8_t hc_num); - void add_ha_climate(std::shared_ptr hc); - void process_RCOutdoorTemp(std::shared_ptr telegram); void process_IBASettings(std::shared_ptr telegram); void process_RCTime(std::shared_ptr telegram); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 8d4cd336d..020eef77e 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1229,6 +1229,11 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() void EMSdevice::mqtt_ha_entity_config_remove() { for (auto & dv : devicevalues_) { + if ((dv.short_name == FL_(roomTemp)[0]) && (!dv.has_state(DeviceValueState::DV_VISIBLE)) + && (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { + Mqtt::publish_ha_climate_config(dv.tag, false, true); // delete topic (remove = true) + dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); + } if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && ((!dv.has_state(DeviceValueState::DV_VISIBLE)) || (!dv.has_state(DeviceValueState::DV_ACTIVE)))) { Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) @@ -1243,9 +1248,20 @@ void EMSdevice::mqtt_ha_entity_config_create() { bool create_device_config = !ha_config_done(); // do we need to create the main Discovery device config with this entity? // check the state of each of the device values + // create climate if roomtemp is visible // create the discovery topic if if hasn't already been created, not a command (like reset) and is active and visible for (auto & dv : devicevalues_) { - if ((!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.type != DeviceValueType::CMD) && dv.has_state(DeviceValueState::DV_ACTIVE) + if ((dv.short_name == FL_(roomTemp)[0]) && dv.has_state(DeviceValueState::DV_VISIBLE)) { + if (dv.has_state(DeviceValueState::DV_ACTIVE) + && (dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT) || !dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED))) { + dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); + Mqtt::publish_ha_climate_config(dv.tag, true); + } else if (!dv.has_state(DeviceValueState::DV_ACTIVE) && !dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT)) { + dv.add_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); + Mqtt::publish_ha_climate_config(dv.tag, false); + } + } + if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && (dv.type != DeviceValueType::CMD) && dv.has_state(DeviceValueState::DV_ACTIVE) && dv.has_state(DeviceValueState::DV_VISIBLE)) { // create_device_config is only done once for the EMS device. It can added to any entity, so we take the first Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index c6bf629b6..e41533fd4 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -113,7 +113,8 @@ class DeviceValue { DV_DEFAULT = 0, // 0 - does not yet have a value DV_ACTIVE = (1 << 0), // 1 - has a validated real value DV_VISIBLE = (1 << 1), // 2 - shown on web, console and on MQTT payload. Otherwise hidden - DV_HA_CONFIG_CREATED = (1 << 2) // 4 - set if the HA config topic has been created + DV_HA_CONFIG_CREATED = (1 << 2), // 4 - set if the HA config topic has been created + DV_HA_CLIMATE_NO_RT = (1 << 3) // 8 - climate created without roomTemp }; uint8_t device_type; // EMSdevice::DeviceType diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 3f642dcd3..6e1cd21ee 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -49,6 +49,7 @@ std::vector Mqtt::mqtt_subfunctions_; uint32_t Mqtt::mqtt_publish_fails_ = 0; bool Mqtt::connecting_ = false; bool Mqtt::initialized_ = false; +bool Mqtt::ha_climate_reset_ = false; uint8_t Mqtt::connectcount_ = 0; uint32_t Mqtt::mqtt_message_id_ = 0; char will_topic_[Mqtt::MQTT_TOPIC_MAX_SIZE]; // because MQTT library keeps only char pointer @@ -581,6 +582,7 @@ void Mqtt::on_connect() { queue_unsubscribe_message(discovery_prefix_ + "/switch/" + mqtt_base_ + "/#"); EMSESP::reset_mqtt_ha(); // re-create all HA devices if there are any ha_status(); // create the EMS-ESP device in HA, which is MQTT retained + ha_climate_reset(true); } else { queue_subscribe_message(discovery_prefix_ + "/climate/" + mqtt_base_ + "/#"); queue_subscribe_message(discovery_prefix_ + "/sensor/" + mqtt_base_ + "/#"); @@ -1220,6 +1222,94 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, publish_ha(topic, doc.as()); } +void Mqtt::publish_ha_climate_config(uint8_t tag, bool has_roomtemp, bool remove) { + uint8_t hc_num = tag - DeviceValueTAG::TAG_HC1 + 1; + + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + char topic_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; + char hc_mode_s[30]; + char seltemp_s[30]; + char currtemp_s[30]; + char mode_str_tpl[400]; + char name_s[30]; + char uniq_id_s[30]; + char temp_cmd_s[30]; + char mode_cmd_s[30]; + char min_s[10]; + char max_s[10]; + + snprintf(topic, sizeof(topic), "climate/%s/thermostat_hc%d/config", Mqtt::base().c_str(), hc_num); + if (remove) { + publish_ha(topic); // publish empty payload with retain flag + return; + } + + if (Mqtt::is_nested()) { + // nested format + snprintf(hc_mode_s, sizeof(hc_mode_s), "value_json.hc%d.mode", hc_num); + snprintf(seltemp_s, sizeof(seltemp_s), "{{value_json.hc%d.seltemp}}", hc_num); + if (has_roomtemp) { + snprintf(currtemp_s, sizeof(currtemp_s), "{{value_json.hc%d.currtemp}}", hc_num); + } + snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(EMSdevice::DeviceType::THERMOSTAT, DeviceValueTAG::TAG_NONE).c_str()); + } else { + // single format + snprintf(hc_mode_s, sizeof(hc_mode_s), "value_json.mode"); + snprintf(seltemp_s, sizeof(seltemp_s), "{{value_json.seltemp}}"); + if (has_roomtemp) { + snprintf(currtemp_s, sizeof(currtemp_s), "{{value_json.currtemp}}"); + } + snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(EMSdevice::DeviceType::THERMOSTAT, DeviceValueTAG::TAG_HC1 + hc_num - 1).c_str()); + } + + snprintf(mode_str_tpl, + sizeof(mode_str_tpl), + "{%%if %s=='manual'%%}heat{%%elif %s=='day'%%}heat{%%elif %s=='night'%%}off{%%elif %s=='off'%%}off{%%else%%}auto{%%endif%%}", + hc_mode_s, + hc_mode_s, + hc_mode_s, + hc_mode_s); + + snprintf(name_s, sizeof(name_s), "Thermostat hc%d", hc_num); + snprintf(uniq_id_s, sizeof(uniq_id_s), "thermostat_hc%d", hc_num); + snprintf(temp_cmd_s, sizeof(temp_cmd_s), "~/thermostat/hc%d/seltemp", hc_num); + snprintf(mode_cmd_s, sizeof(temp_cmd_s), "~/thermostat/hc%d/mode", hc_num); + + StaticJsonDocument doc; + + doc["~"] = base(); + doc["name"] = name_s; + doc["uniq_id"] = uniq_id_s; + doc["mode_stat_t"] = topic_t; + doc["mode_stat_tpl"] = mode_str_tpl; + doc["temp_cmd_t"] = temp_cmd_s; + doc["temp_stat_t"] = topic_t; + doc["temp_stat_tpl"] = seltemp_s; + doc["mode_cmd_t"] = mode_cmd_s; + + if (has_roomtemp) { + doc["curr_temp_t"] = topic_t; + doc["curr_temp_tpl"] = currtemp_s; + } + + doc["min_temp"] = Helpers::render_value(min_s, 5, 0, EMSESP::system_.fahrenheit() ? 2 : 0); + doc["max_temp"] = Helpers::render_value(max_s, 30, 0, EMSESP::system_.fahrenheit() ? 2 : 0); + doc["temp_step"] = "0.5"; + + // the HA climate component only responds to auto, heat and off + JsonArray modes = doc.createNestedArray("modes"); + + modes.add("auto"); + modes.add("heat"); + modes.add("off"); + + JsonObject dev = doc.createNestedObject("dev"); + JsonArray ids = dev.createNestedArray("ids"); + ids.add("ems-esp-thermostat"); + + publish_ha(topic, doc.as()); // publish the config payload with retain flag +} + // based on the device and tag, create the MQTT topic name (without the basename) // differs based on whether MQTT nested is enabled // tag = EMSdevice::DeviceValueTAG diff --git a/src/mqtt.h b/src/mqtt.h index 9fe8442f8..413d28fd1 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -107,6 +107,7 @@ class Mqtt { const JsonObject & dev_json); static void publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom); + static void publish_ha_climate_config(uint8_t tag, bool has_roomtemp, bool remove = false); static void show_topic_handlers(uuid::console::Shell & shell, const uint8_t device_type); static void show_mqtt(uuid::console::Shell & shell); @@ -191,6 +192,14 @@ class Mqtt { ha_enabled_ = ha_enabled; } + static bool ha_climate_reset() { + return ha_climate_reset_; + } + + static void ha_climate_reset(bool reset) { + ha_climate_reset_ = reset;; + } + static bool send_response() { return send_response_; } @@ -276,6 +285,7 @@ class Mqtt { static bool initialized_; static uint32_t mqtt_publish_fails_; static uint8_t connectcount_; + static bool ha_climate_reset_; // settings, copied over static std::string mqtt_base_; From 9c15ddf952cf4e1c412c36a7650b7ce3d28b314c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 26 Feb 2022 14:23:45 +0100 Subject: [PATCH 081/319] HA climate as extra value, can be disabled --- src/devices/thermostat.cpp | 32 ++++++++++++++++++++++++++++++-- src/devices/thermostat.h | 3 +++ src/emsdevice.cpp | 15 ++++++--------- src/locale_DE.h | 2 ++ src/locale_EN.h | 2 ++ 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index d126638e2..3d4ea2eb2 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -369,6 +369,15 @@ std::shared_ptr Thermostat::heating_circuit(std::sha return new_hc; // return back point to new HC object } +// add the HVAC/Climate HA component for the HC +void Thermostat::add_ha_climate(std::shared_ptr hc) { + if (!Mqtt::ha_enabled()) { + hc->climate = EMS_VALUE_UINT_NOTSET; + return; + } + hc->climate = Helpers::hasValue(hc->roomTemp) ? 1 : Helpers::hasValue(hc->selTemp) ? 0 : EMS_VALUE_UINT_NOTSET; +} + // decodes the thermostat mode for the heating circuit based on the thermostat type // modes are off, manual, auto, day, night and holiday uint8_t Thermostat::HeatingCircuit::get_mode() const { @@ -546,6 +555,8 @@ void Thermostat::process_RC10Monitor(std::shared_ptr telegram) { has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte has_update(telegram, hc->roomTemp, 2); // is * 10 has_update(telegram, hc->reduceminutes, 5); + + add_ha_climate(hc); } // type 0xB0 - for reading the mode from the RC10 thermostat (0x17) @@ -649,6 +660,8 @@ void Thermostat::process_RC20Monitor_2(std::shared_ptr telegram) has_update(telegram, hc->selTemp, 2, 1); // is * 2, force as single byte has_update(telegram, hc->roomTemp, 3); // is * 10 has_bitupdate(telegram, hc->summermode, 1, 0); + + add_ha_climate(hc); } // 0xAD - for reading the mode from the RC20/ES72 thermostat (0x17) @@ -740,6 +753,8 @@ void Thermostat::process_RC20Monitor(std::shared_ptr telegram) { has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte has_update(telegram, hc->roomTemp, 2); // is * 10 + + add_ha_climate(hc); } // type 0x0A - data from the Nefit Easy/TC100 thermostat (0x18) - 31 bytes long @@ -751,6 +766,8 @@ void Thermostat::process_EasyMonitor(std::shared_ptr telegram) { has_update(telegram, hc->roomTemp, 8); // is * 100 has_update(telegram, hc->selTemp, 10); // is * 100 + + add_ha_climate(hc); } // Settings Parameters - 0xA5 - RC30_1 @@ -830,7 +847,9 @@ void Thermostat::process_JunkersMonitor(std::shared_ptr telegram } else { has_update(telegram, hc->roomTemp, 4); // value is * 10 } - } + + add_ha_climate(hc); +} // type 0x02A5 - data from Worchester CRF200 void Thermostat::process_CRFMonitor(std::shared_ptr telegram) { @@ -844,6 +863,8 @@ void Thermostat::process_CRFMonitor(std::shared_ptr telegram) { has_bitupdate(telegram, hc->mode, 2, 4); // bit 4, mode (auto=0, off=1) has_update(telegram, hc->selTemp, 6, 1); // is * 2, force as single byte has_update(telegram, hc->targetflowtemp, 4); + + add_ha_climate(hc); } // type 0x02A5 - data from the Nefit RC1010/3000 thermostat (0x18) and RC300/310s on 0x10 @@ -868,6 +889,8 @@ void Thermostat::process_RC300Monitor(std::shared_ptr telegram) has_bitupdate(telegram, hc->summermode, 2, 4); has_update(telegram, hc->targetflowtemp, 4); has_update(telegram, hc->curroominfl, 27); + + add_ha_climate(hc); } // type 0x02B9 EMS+ for reading from RC300/RC310 thermostat @@ -1022,6 +1045,8 @@ void Thermostat::process_RC30Monitor(std::shared_ptr telegram) { has_update(telegram, hc->selTemp, 1, 1); // is * 2, force as single byte has_update(telegram, hc->roomTemp, 2); + + add_ha_climate(hc); } // type 0xA7 - for reading the mode from the RC30 thermostat (0x10) @@ -1059,6 +1084,8 @@ void Thermostat::process_RC35Monitor(std::shared_ptr telegram) { has_bitupdate(telegram, hc->holidaymode, 0, 5); has_update(telegram, hc->targetflowtemp, 14); + + add_ha_climate(hc); } // type 0x3D (HC1), 0x47 (HC2), 0x51 (HC3), 0x5B (HC4) - Working Mode Heating - for reading the mode from the RC35 thermostat (0x10) @@ -3181,6 +3208,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrclimate, DeviceValueType::ENUM, FL_(enum_climate), FL_(climate), DeviceValueUOM::NONE); switch (model) { case EMS_DEVICE_FLAG_RC10: @@ -3247,7 +3275,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrheatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp)); register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); - register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_remotetemp)); + register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES); break; case EMS_DEVICE_FLAG_RC25: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 8f1f77b7b..d9f8969a3 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -74,6 +74,7 @@ class Thermostat : public EMSdevice { char vacation[26]; char switchtime1[16]; char switchtime2[16]; + uint8_t climate; // RC 10 uint8_t reducehours; // night reduce duration @@ -291,6 +292,8 @@ class Thermostat : public EMSdevice { void register_device_values_hc(std::shared_ptr hc); + void add_ha_climate(std::shared_ptr hc); + void process_RCOutdoorTemp(std::shared_ptr telegram); void process_IBASettings(std::shared_ptr telegram); void process_RCTime(std::shared_ptr telegram); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 020eef77e..9d3183772 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1229,15 +1229,13 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() void EMSdevice::mqtt_ha_entity_config_remove() { for (auto & dv : devicevalues_) { - if ((dv.short_name == FL_(roomTemp)[0]) && (!dv.has_state(DeviceValueState::DV_VISIBLE)) - && (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { - Mqtt::publish_ha_climate_config(dv.tag, false, true); // delete topic (remove = true) - dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); - } if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && ((!dv.has_state(DeviceValueState::DV_VISIBLE)) || (!dv.has_state(DeviceValueState::DV_ACTIVE)))) { Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + if (dv.short_name == FL_(climate)[0]) { + Mqtt::publish_ha_climate_config(dv.tag, false, true); // delete topic (remove = true) + } } } } @@ -1251,12 +1249,11 @@ void EMSdevice::mqtt_ha_entity_config_create() { // create climate if roomtemp is visible // create the discovery topic if if hasn't already been created, not a command (like reset) and is active and visible for (auto & dv : devicevalues_) { - if ((dv.short_name == FL_(roomTemp)[0]) && dv.has_state(DeviceValueState::DV_VISIBLE)) { - if (dv.has_state(DeviceValueState::DV_ACTIVE) - && (dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT) || !dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED))) { + if ((dv.short_name == FL_(climate)[0]) && dv.has_state(DeviceValueState::DV_VISIBLE) && dv.has_state(DeviceValueState::DV_ACTIVE)) { + if (*(int8_t *)(dv.value_p) == 1 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); Mqtt::publish_ha_climate_config(dv.tag, true); - } else if (!dv.has_state(DeviceValueState::DV_ACTIVE) && !dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT)) { + } else if (*(int8_t *)(dv.value_p) == 0 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || !dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.add_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); Mqtt::publish_ha_climate_config(dv.tag, false); } diff --git a/src/locale_DE.h b/src/locale_DE.h index c57701bfd..633c00a0b 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -387,6 +387,7 @@ MAKE_PSTR_LIST(enum_progMode3, F("Familie"), F("Morgends"), F("Abends"), F("Vorm MAKE_PSTR_LIST(enum_progMode4, F("prog_a"), F("prog_b"), F("prog_c"), F("prog_d"), F("prog_e"), F("prog_f")) MAKE_PSTR_LIST(enum_switchmode, F_(off), F_(eco), F_(comfort), F_(heat)) +MAKE_PSTR_LIST(enum_climate, F("Solltemperature"), F("Raumtemperatur")) // solar list MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog")) @@ -581,6 +582,7 @@ MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("Kreis 2 Extra")) MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) // thermostat hc +MAKE_PSTR_LIST(climate, F("climate"), F("Klima Anzeige")) MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("Sollwert Raumtemperatur")) MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("aktuelle Raumtemperatur")) MAKE_PSTR_LIST(mode, F("mode"), F("modus")) diff --git a/src/locale_EN.h b/src/locale_EN.h index e6908a12c..6146c4a83 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -387,6 +387,7 @@ MAKE_PSTR_LIST(enum_progMode3, F("family"), F("morning"), F("evening"), F("am"), MAKE_PSTR_LIST(enum_progMode4, F("prog_a"), F("prog_b"), F("prog_c"), F("prog_d"), F("prog_e"), F("prog_f")) MAKE_PSTR_LIST(enum_switchmode, F_(off), F_(eco), F_(comfort), F_(heat)) +MAKE_PSTR_LIST(enum_climate, F("selTemp"), F("roomTemp")) // solar list MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog")) @@ -582,6 +583,7 @@ MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra")) MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) // thermostat hc +MAKE_PSTR_LIST(climate, F("climate"), F("climate entity")) MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("selected room temperature")) MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("current room temperature")) MAKE_PSTR_LIST(mode, F("mode"), F("mode")) From cde761fadd6280707663c09a82e0a3fcbc9adc56 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 26 Feb 2022 17:15:42 +0100 Subject: [PATCH 082/319] check selTemp, roomTemp visibility for climate creation --- src/devices/thermostat.cpp | 11 ++++++++++- src/emsdevice.cpp | 10 ++++++++++ src/emsdevice.h | 3 ++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 3d4ea2eb2..e426728e1 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -375,7 +375,16 @@ void Thermostat::add_ha_climate(std::shared_ptr hc) { hc->climate = EMS_VALUE_UINT_NOTSET; return; } - hc->climate = Helpers::hasValue(hc->roomTemp) ? 1 : Helpers::hasValue(hc->selTemp) ? 0 : EMS_VALUE_UINT_NOTSET; + + if (Helpers::hasValue(hc->selTemp) && is_visible(&hc->selTemp)) { + if (Helpers::hasValue(hc->roomTemp) && is_visible(&hc->roomTemp)) { + hc->climate = 1; + } else { + hc->climate = 0; + } + } else { + hc->climate = EMS_VALUE_UINT_NOTSET; + } } // decodes the thermostat mode for the heating circuit based on the thermostat type diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 9d3183772..ab411413a 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -524,6 +524,16 @@ void EMSdevice::register_device_value(uint8_t tag, register_device_value(tag, value_p, type, options, name, uom, nullptr, 0, 0); } +// check if value is visiible +bool EMSdevice::is_visible(void * value_p) { + for (auto & dv : devicevalues_) { + if (dv.value_p == value_p && dv.has_state(DeviceValueState::DV_VISIBLE)) { + return true; + } + } + return false; +} + // publish a single value on change void EMSdevice::publish_value(void * value_p) { if (!Mqtt::publish_single() || value_p == nullptr) { diff --git a/src/emsdevice.h b/src/emsdevice.h index 721cf3010..8487e056a 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -242,7 +242,8 @@ class EMSdevice { void read_command(const uint16_t type_id, uint8_t offset = 0, uint8_t length = 0); - void publish_value(void * value); + bool is_visible(void * value_p); + void publish_value(void * value_p); void publish_all_values(); void mqtt_ha_entity_config_create(); From 743838572904864223449c716fd13d06e049b54c Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 26 Feb 2022 18:12:33 +0100 Subject: [PATCH 083/319] upgrade packages --- interface/package-lock.json | 58 ++++++++++++++++++------------------- interface/package.json | 6 ++-- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 104a0b285..703212fa0 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -12,9 +12,9 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.4.2", - "@mui/material": "^5.4.2", - "@types/lodash": "^4.14.178", - "@types/node": "^17.0.18", + "@mui/material": "^5.4.3", + "@types/lodash": "^4.14.179", + "@types/node": "^17.0.21", "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", @@ -2764,13 +2764,13 @@ } }, "node_modules/@mui/material": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.2.tgz", - "integrity": "sha512-jmeLWEO6AA6g7HErhI3MXVGaMZtqDZjDwcHCg24WY954wO38Xn0zJ53VfpFc44ZTJLV9Ejd7ci9fLlG/HmJCeg==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.3.tgz", + "integrity": "sha512-E2K402xjz3U09mTgrVYj+vUACeOppV41uEcu9GSkm7QSg4Nzy48WkdaiGL7TRCyH0T8HsonFSMJvCpwyQbD6iw==", "dependencies": { "@babel/runtime": "^7.17.0", "@mui/base": "5.0.0-alpha.69", - "@mui/system": "^5.4.2", + "@mui/system": "^5.4.3", "@mui/types": "^7.1.2", "@mui/utils": "^5.4.2", "@types/react-transition-group": "^4.4.4", @@ -2864,9 +2864,9 @@ } }, "node_modules/@mui/system": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.2.tgz", - "integrity": "sha512-QegBVu6fxUNov1X9bWc1MZUTeV3A5g9PIpli7d0kzkGfq6JzrJWuPlhSPZ+6hlWmWky+bbAXhU65Qz8atWxDGw==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.3.tgz", + "integrity": "sha512-Xz5AVe9JMufJVozMzUv93IRtnLNZnw/Q8k+Mg7Q4oRuwdir0TcYkMVUqAHetVKb3rAouIVCu/cQv0jB8gVeVsQ==", "dependencies": { "@babel/runtime": "^7.17.0", "@mui/private-theming": "^5.4.2", @@ -3588,9 +3588,9 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "node_modules/@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" + "version": "4.14.179", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.179.tgz", + "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==" }, "node_modules/@types/mime": { "version": "1.3.2", @@ -3598,9 +3598,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz", - "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==" + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -19362,13 +19362,13 @@ } }, "@mui/material": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.2.tgz", - "integrity": "sha512-jmeLWEO6AA6g7HErhI3MXVGaMZtqDZjDwcHCg24WY954wO38Xn0zJ53VfpFc44ZTJLV9Ejd7ci9fLlG/HmJCeg==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.3.tgz", + "integrity": "sha512-E2K402xjz3U09mTgrVYj+vUACeOppV41uEcu9GSkm7QSg4Nzy48WkdaiGL7TRCyH0T8HsonFSMJvCpwyQbD6iw==", "requires": { "@babel/runtime": "^7.17.0", "@mui/base": "5.0.0-alpha.69", - "@mui/system": "^5.4.2", + "@mui/system": "^5.4.3", "@mui/types": "^7.1.2", "@mui/utils": "^5.4.2", "@types/react-transition-group": "^4.4.4", @@ -19401,9 +19401,9 @@ } }, "@mui/system": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.2.tgz", - "integrity": "sha512-QegBVu6fxUNov1X9bWc1MZUTeV3A5g9PIpli7d0kzkGfq6JzrJWuPlhSPZ+6hlWmWky+bbAXhU65Qz8atWxDGw==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.3.tgz", + "integrity": "sha512-Xz5AVe9JMufJVozMzUv93IRtnLNZnw/Q8k+Mg7Q4oRuwdir0TcYkMVUqAHetVKb3rAouIVCu/cQv0jB8gVeVsQ==", "requires": { "@babel/runtime": "^7.17.0", "@mui/private-theming": "^5.4.2", @@ -19899,9 +19899,9 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" + "version": "4.14.179", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.179.tgz", + "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==" }, "@types/mime": { "version": "1.3.2", @@ -19909,9 +19909,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz", - "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==" + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" }, "@types/parse-json": { "version": "4.0.0", diff --git a/interface/package.json b/interface/package.json index eb29d0402..7b33f679a 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,9 +8,9 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.4.2", - "@mui/material": "^5.4.2", - "@types/lodash": "^4.14.178", - "@types/node": "^17.0.18", + "@mui/material": "^5.4.3", + "@types/lodash": "^4.14.179", + "@types/node": "^17.0.21", "@types/react": "^17.0.39", "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.3", From f206ce71147be9fc29f67773fc77ac7f57499116 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 26 Feb 2022 18:12:42 +0100 Subject: [PATCH 084/319] auto formatting --- src/devices/thermostat.h | 4 ++-- src/emsdevice.cpp | 5 +++-- src/mqtt.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index d9f8969a3..e10eccda8 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -133,8 +133,8 @@ class Thermostat : public EMSdevice { } private: - uint8_t hc_num_; // heating circuit number 1..10 - uint8_t model_; // the model type + uint8_t hc_num_; // heating circuit number 1..10 + uint8_t model_; // the model type }; static std::string mode_tostring(uint8_t mode); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index ab411413a..6263554ee 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -524,7 +524,7 @@ void EMSdevice::register_device_value(uint8_t tag, register_device_value(tag, value_p, type, options, name, uom, nullptr, 0, 0); } -// check if value is visiible +// check if value is visible bool EMSdevice::is_visible(void * value_p) { for (auto & dv : devicevalues_) { if (dv.value_p == value_p && dv.has_state(DeviceValueState::DV_VISIBLE)) { @@ -1263,7 +1263,8 @@ void EMSdevice::mqtt_ha_entity_config_create() { if (*(int8_t *)(dv.value_p) == 1 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); Mqtt::publish_ha_climate_config(dv.tag, true); - } else if (*(int8_t *)(dv.value_p) == 0 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || !dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { + } else if (*(int8_t *)(dv.value_p) == 0 + && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || !dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.add_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); Mqtt::publish_ha_climate_config(dv.tag, false); } diff --git a/src/mqtt.h b/src/mqtt.h index 413d28fd1..ebe8bac78 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -197,7 +197,7 @@ class Mqtt { } static void ha_climate_reset(bool reset) { - ha_climate_reset_ = reset;; + ha_climate_reset_ = reset; } static bool send_response() { From c1fd9643444fa78d04e8e357b33becacc834d181 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 27 Feb 2022 13:10:53 +0100 Subject: [PATCH 085/319] climate hidden, customization of hidden and commands, cleanup --- src/emsdevice.cpp | 201 +++++++++++++++++++++++----------------------- src/locale_DE.h | 2 +- src/locale_EN.h | 2 +- 3 files changed, 103 insertions(+), 102 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 6263554ee..c1d62e3c3 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -293,7 +293,7 @@ bool EMSdevice::is_fetch(uint16_t telegram_id) { // called from the command 'entities' void EMSdevice::list_device_entries(JsonObject & output) { for (const auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.type != DeviceValueType::CMD) { + if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.type != DeviceValueType::CMD && dv.full_name) { // if we have a tag prefix it char key[50]; if (!EMSdevice::tag_to_mqtt(dv.tag).empty()) { @@ -445,23 +445,24 @@ void EMSdevice::register_device_value(uint8_t tag, // determine state uint8_t state = DeviceValueState::DV_VISIBLE; // default to visible - if (!full_name) { - state = DeviceValueState::DV_DEFAULT; // don't show if the full_name is empty - } else { - // scan through customizations to see if it's on the exclusion list by matching the productID and deviceID - EMSESP::webCustomizationService.read([&](WebCustomization & settings) { - for (EntityCustomization entityCustomization : settings.entityCustomizations) { - if ((entityCustomization.product_id == product_id()) && (entityCustomization.device_id == device_id())) { - for (uint8_t entity_id : entityCustomization.entity_ids) { - if (entity_id == dv_id) { - state = DeviceValueState::DV_DEFAULT; // it's on the exclude list, turn off active and visible flags - break; - } + + // if (!full_name) { + // state = DeviceValueState::DV_DEFAULT; // don't show if the full_name is empty + // } else { + // scan through customizations to see if it's on the exclusion list by matching the productID and deviceID + EMSESP::webCustomizationService.read([&](WebCustomization & settings) { + for (EntityCustomization entityCustomization : settings.entityCustomizations) { + if ((entityCustomization.product_id == product_id()) && (entityCustomization.device_id == device_id())) { + for (uint8_t entity_id : entityCustomization.entity_ids) { + if (entity_id == dv_id) { + state = DeviceValueState::DV_DEFAULT; // it's on the exclude list, turn off active and visible flags + break; } } } - }); - } + } + }); + // } // add the device devicevalues_.emplace_back(device_type_, tag, value_p, type, options, options_size, short_name, full_name, uom, 0, has_cmd, min, max, state, dv_id); @@ -526,9 +527,9 @@ void EMSdevice::register_device_value(uint8_t tag, // check if value is visible bool EMSdevice::is_visible(void * value_p) { - for (auto & dv : devicevalues_) { - if (dv.value_p == value_p && dv.has_state(DeviceValueState::DV_VISIBLE)) { - return true; + for (const auto & dv : devicevalues_) { + if (dv.value_p == value_p) { + return dv.has_state(DeviceValueState::DV_VISIBLE); } } return false; @@ -539,7 +540,7 @@ void EMSdevice::publish_value(void * value_p) { if (!Mqtt::publish_single() || value_p == nullptr) { return; } - for (auto & dv : devicevalues_) { + for (const auto & dv : devicevalues_) { if (dv.value_p == value_p && dv.has_state(DeviceValueState::DV_VISIBLE)) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; if (Mqtt::publish_single2cmd()) { @@ -640,7 +641,7 @@ const std::string EMSdevice::get_value_uom(const char * key) { // look up key in our device value list for (const auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_VISIBLE)) { + if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.full_name) { if (read_flash_string(dv.full_name) == key_p) { // ignore TIME since "minutes" is already added to the string value if ((dv.uom == DeviceValueUOM::NONE) || (dv.uom == DeviceValueUOM::MINUTES)) { @@ -667,7 +668,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { // 1. full_name cannot be empty // 2. it must have a valid value, if it is not a command like 'reset' - if (dv.has_state(DeviceValueState::DV_VISIBLE) && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { + if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { JsonObject obj = data.createNestedObject(); // create the object, we know there is a value uint8_t fahrenheit = 0; @@ -694,11 +695,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; } - // handle commands without value - // else if (dv.type == DeviceValueType::CMD) { - // obj["v"] = "-"; - // } - + // handle numbers else { // If a divider is specified, do the division to 2 decimals places and send back as double/float // otherwise force as an integer whole @@ -801,69 +798,69 @@ void EMSdevice::exclude_entity(uint8_t id) { // as generate_values_web() but stripped down to only show all entities and their state void EMSdevice::generate_values_web_all(JsonArray & output) { for (auto & dv : devicevalues_) { - // ignore commands and entities that have an empty full name - if ((dv.type != DeviceValueType::CMD) && (dv.full_name)) { - JsonObject obj = output.createNestedObject(); + // also show commands and entities that have an empty full name + JsonObject obj = output.createNestedObject(); - // create the value - if (dv.hasValue()) { - // handle Booleans (true, false) - if (dv.type == DeviceValueType::BOOL) { - bool value_b = *(bool *)(dv.value_p); - if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { - obj["v"] = value_b; - } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { - obj["v"] = value_b ? 1 : 0; - } else { - char s[7]; - obj["v"] = Helpers::render_boolean(s, value_b); - } - } - - // handle TEXT strings - else if (dv.type == DeviceValueType::STRING) { - obj["v"] = (char *)(dv.value_p); - } - - // handle ENUMs - else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { - obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; - } - - // handle Integers and Floats - else { - // If a divider is specified, do the division to 2 decimals places and send back as double/float - // otherwise force as an integer whole - // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler - uint8_t divider = 0; - uint8_t factor = 1; - if (dv.options_size == 1) { - const char * s = read_flash_string(dv.options[0]).c_str(); - if (s[0] == '*') { - factor = Helpers::atoint(&s[1]); - } else { - divider = Helpers::atoint(s); - } - } - - if (dv.type == DeviceValueType::INT) { - obj["v"] = (divider) ? Helpers::round2(*(int8_t *)(dv.value_p), divider) : *(int8_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::UINT) { - obj["v"] = (divider) ? Helpers::round2(*(uint8_t *)(dv.value_p), divider) : *(uint8_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::SHORT) { - obj["v"] = (divider) ? Helpers::round2(*(int16_t *)(dv.value_p), divider) : *(int16_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::USHORT) { - obj["v"] = (divider) ? Helpers::round2(*(uint16_t *)(dv.value_p), divider) : *(uint16_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::ULONG) { - obj["v"] = divider ? Helpers::round2(*(uint32_t *)(dv.value_p), divider) : *(uint32_t *)(dv.value_p) * factor; - } else if (dv.type == DeviceValueType::TIME) { - uint32_t time_value = *(uint32_t *)(dv.value_p); - obj["v"] = (divider > 0) ? time_value / divider : time_value * factor; // sometimes we need to divide by 60 - } + // create the value + if (dv.hasValue()) { + // handle Booleans (true, false) + if (dv.type == DeviceValueType::BOOL) { + bool value_b = *(bool *)(dv.value_p); + if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + obj["v"] = value_b; + } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + obj["v"] = value_b ? 1 : 0; + } else { + char s[7]; + obj["v"] = Helpers::render_boolean(s, value_b); } } - // add name, prefixing the tag if it exists + // handle TEXT strings + else if (dv.type == DeviceValueType::STRING) { + obj["v"] = (char *)(dv.value_p); + } + + // handle ENUMs + else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { + obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; + } + + // handle Integers and Floats + else { + // If a divider is specified, do the division to 2 decimals places and send back as double/float + // otherwise force as an integer whole + // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler + uint8_t divider = 0; + uint8_t factor = 1; + if (dv.options_size == 1) { + const char * s = read_flash_string(dv.options[0]).c_str(); + if (s[0] == '*') { + factor = Helpers::atoint(&s[1]); + } else { + divider = Helpers::atoint(s); + } + } + + if (dv.type == DeviceValueType::INT) { + obj["v"] = (divider) ? Helpers::round2(*(int8_t *)(dv.value_p), divider) : *(int8_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::UINT) { + obj["v"] = (divider) ? Helpers::round2(*(uint8_t *)(dv.value_p), divider) : *(uint8_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::SHORT) { + obj["v"] = (divider) ? Helpers::round2(*(int16_t *)(dv.value_p), divider) : *(int16_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::USHORT) { + obj["v"] = (divider) ? Helpers::round2(*(uint16_t *)(dv.value_p), divider) : *(uint16_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::ULONG) { + obj["v"] = divider ? Helpers::round2(*(uint32_t *)(dv.value_p), divider) : *(uint32_t *)(dv.value_p) * factor; + } else if (dv.type == DeviceValueType::TIME) { + uint32_t time_value = *(uint32_t *)(dv.value_p); + obj["v"] = (divider > 0) ? time_value / divider : time_value * factor; // sometimes we need to divide by 60 + } + } + } + + // add name, prefixing the tag if it exists + if (dv.full_name) { if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { obj["n"] = dv.full_name; } else { @@ -871,20 +868,21 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { snprintf(name, sizeof(name), "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); obj["n"] = name; } - - // shortname - if (dv.tag >= DeviceValueTAG::TAG_HC1) { - obj["s"] = tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); - } else { - obj["s"] = dv.short_name; - } - - // is it marked as excluded? - obj["x"] = !dv.has_state(DeviceValueState::DV_VISIBLE); - - // add the unique ID - obj["i"] = dv.id; + } else { + obj["n"] = "(hidden)"; } + // shortname + if (dv.tag >= DeviceValueTAG::TAG_HC1) { + obj["s"] = tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); + } else { + obj["s"] = dv.short_name; + } + + // is it marked as excluded? + obj["x"] = !dv.has_state(DeviceValueState::DV_VISIBLE); + + // add the unique ID + obj["i"] = dv.id; } } @@ -1057,7 +1055,7 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 // mqtt publish all single values from one device (used for time schedule) void EMSdevice::publish_all_values() { - for (auto & dv : devicevalues_) { + for (const auto & dv : devicevalues_) { publish_value(dv.value_p); } } @@ -1241,10 +1239,11 @@ void EMSdevice::mqtt_ha_entity_config_remove() { for (auto & dv : devicevalues_) { if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && ((!dv.has_state(DeviceValueState::DV_VISIBLE)) || (!dv.has_state(DeviceValueState::DV_ACTIVE)))) { - Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); if (dv.short_name == FL_(climate)[0]) { Mqtt::publish_ha_climate_config(dv.tag, false, true); // delete topic (remove = true) + } else { + Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) } } } @@ -1262,10 +1261,12 @@ void EMSdevice::mqtt_ha_entity_config_create() { if ((dv.short_name == FL_(climate)[0]) && dv.has_state(DeviceValueState::DV_VISIBLE) && dv.has_state(DeviceValueState::DV_ACTIVE)) { if (*(int8_t *)(dv.value_p) == 1 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); + dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); Mqtt::publish_ha_climate_config(dv.tag, true); } else if (*(int8_t *)(dv.value_p) == 0 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || !dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.add_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); + dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); Mqtt::publish_ha_climate_config(dv.tag, false); } } diff --git a/src/locale_DE.h b/src/locale_DE.h index 633c00a0b..26114d001 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -582,7 +582,7 @@ MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("Kreis 2 Extra")) MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) // thermostat hc -MAKE_PSTR_LIST(climate, F("climate"), F("Klima Anzeige")) +MAKE_PSTR_LIST(climate, F("climate")) MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("Sollwert Raumtemperatur")) MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("aktuelle Raumtemperatur")) MAKE_PSTR_LIST(mode, F("mode"), F("modus")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 6146c4a83..00b02ad7c 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -583,7 +583,7 @@ MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra")) MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) // thermostat hc -MAKE_PSTR_LIST(climate, F("climate"), F("climate entity")) +MAKE_PSTR_LIST(climate, F("climate")) MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("selected room temperature")) MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("current room temperature")) MAKE_PSTR_LIST(mode, F("mode"), F("mode")) From c1edbbf0475cf81c6f3ed1ec794a17e420e44a20 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Mar 2022 14:25:35 +0100 Subject: [PATCH 086/319] sonar fixes --- .gitignore | 4 + Makefile | 2 + interface/package-lock.json | 222 ++++++++++++++-------------- interface/package.json | 10 +- scripts/run_sonar.sh | 8 + sonar-project.properties | 11 ++ src/analogsensor.cpp | 76 +++++----- src/analogsensor.h | 22 +-- src/command.cpp | 109 +++++++------- src/command.h | 4 +- src/console.cpp | 10 +- src/dallassensor.cpp | 1 - src/devices/boiler.cpp | 48 +++--- src/devices/thermostat.cpp | 40 +++-- src/devices/thermostat.h | 4 +- src/emsdevice.cpp | 112 +++++++------- src/emsdevice.h | 58 ++++---- src/emsesp.cpp | 140 ++++++++---------- src/helpers.cpp | 24 +-- src/helpers.h | 2 +- src/locale_DE.h | 13 +- src/mqtt.cpp | 26 ++-- src/mqtt.h | 16 +- src/shower.cpp | 6 +- src/shower.h | 2 +- src/system.cpp | 6 +- src/telegram.cpp | 4 +- src/telegram.h | 25 ++-- src/test/test.cpp | 40 ++--- src/web/WebAPIService.cpp | 8 +- src/web/WebCustomizationService.cpp | 48 +++--- src/web/WebDataService.cpp | 108 +++++++------- src/web/WebLogService.cpp | 26 ++-- src/web/WebLogService.h | 2 +- src/web/WebSettingsService.cpp | 4 +- src/web/WebStatusService.cpp | 6 +- src/web/WebStatusService.h | 2 +- 37 files changed, 639 insertions(+), 610 deletions(-) create mode 100755 scripts/run_sonar.sh create mode 100644 sonar-project.properties diff --git a/.gitignore b/.gitignore index 1f342b86d..2d76fc27d 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,7 @@ node_modules test.sh scripts/__pycache__ .temp + +# sonar +.scannerwork/ +sonar/ diff --git a/Makefile b/Makefile index 88cac6bc0..9baf49005 100644 --- a/Makefile +++ b/Makefile @@ -113,6 +113,7 @@ COMPILE.cpp = $(CXX) $(CXX_STANDARD) $(CXXFLAGS) $(DEPFLAGS) -c $< -o $@ #---------------------------------------------------------------------- # Targets #---------------------------------------------------------------------- +.PHONY: all all: $(OUTPUT) $(OUTPUT): $(OBJS) @@ -138,6 +139,7 @@ cppcheck: $(SOURCES) run: $(OUTPUT) @$< +.PHONY: clean clean: @$(RM) -r $(BUILD) $(OUTPUT) diff --git a/interface/package-lock.json b/interface/package-lock.json index 703212fa0..cb94ea75e 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -11,12 +11,12 @@ "@emotion/react": "^11.8.1", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.4.2", - "@mui/material": "^5.4.3", + "@mui/icons-material": "^5.4.4", + "@mui/material": "^5.4.4", "@types/lodash": "^4.14.179", "@types/node": "^17.0.21", "@types/react": "^17.0.39", - "@types/react-dom": "^17.0.11", + "@types/react-dom": "^17.0.13", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", "axios": "^0.26.0", @@ -30,10 +30,10 @@ "react-dom": "^17.0.2", "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", - "react-router-dom": "^6.2.1", + "react-router-dom": "^6.2.2", "react-scripts": "5.0.0", "sockette": "^2.0.6", - "typescript": "^4.5.5" + "typescript": "^4.6.2" }, "devDependencies": { "nodemon": "^2.0.15", @@ -2708,13 +2708,13 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.69", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.69.tgz", - "integrity": "sha512-IxUUj/lkilCTNBIybQxyQGW/zpxFp490G0QBQJgRp9TJkW2PWSTLvAH7gcH0YHd0L2TAf1TRgfdemoRseMzqQA==", + "version": "5.0.0-alpha.70", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.70.tgz", + "integrity": "sha512-8UZWhz1JYuQnPkAbC37cl4aL1JyNWZ08wDXlp57W7fYQp5xFpBP/7p56AcWg2qG9CNJP0IlFg2Wp4md1v2l4iA==", "dependencies": { - "@babel/runtime": "^7.17.0", - "@emotion/is-prop-valid": "^1.1.1", - "@mui/utils": "^5.4.2", + "@babel/runtime": "^7.17.2", + "@emotion/is-prop-valid": "^1.1.2", + "@mui/utils": "^5.4.4", "@popperjs/core": "^2.4.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -2739,11 +2739,11 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.2.tgz", - "integrity": "sha512-7c+G3jBT+e+pN0a9DJ0Bd8Kr1Vy6os5Q1yd2aXcwuhlRI3uzJBLJ8sX6FSWoh5DSEBchb7Bsk1uHz6U0YN9l+Q==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.4.tgz", + "integrity": "sha512-7zoRpjO8vsd+bPvXq6rtXu0V8Saj70X09dtTQogZmxQKabrYW3g7+Yym7SCRA7IYVF3ysz2AvdQrGD1P/sGepg==", "dependencies": { - "@babel/runtime": "^7.17.0" + "@babel/runtime": "^7.17.2" }, "engines": { "node": ">=12.0.0" @@ -2764,15 +2764,15 @@ } }, "node_modules/@mui/material": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.3.tgz", - "integrity": "sha512-E2K402xjz3U09mTgrVYj+vUACeOppV41uEcu9GSkm7QSg4Nzy48WkdaiGL7TRCyH0T8HsonFSMJvCpwyQbD6iw==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.4.tgz", + "integrity": "sha512-VDJC7GzO1HTFqfMe2zwvaW/sRhABBJXFkKEv5gO3uXx7x9fdwJHQr4udU7NWZCUdOcx9Y0h3BsAILLefYq+WPw==", "dependencies": { - "@babel/runtime": "^7.17.0", - "@mui/base": "5.0.0-alpha.69", - "@mui/system": "^5.4.3", + "@babel/runtime": "^7.17.2", + "@mui/base": "5.0.0-alpha.70", + "@mui/system": "^5.4.4", "@mui/types": "^7.1.2", - "@mui/utils": "^5.4.2", + "@mui/utils": "^5.4.4", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.10", @@ -2808,12 +2808,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.2.tgz", - "integrity": "sha512-mlPDYYko4wIcwXjCPEmOWbNTT4DZ6h9YHdnRtQPnWM28+TRUHEo7SbydnnmVDQLRXUfaH4Y6XtEHIfBNPE/SLg==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.4.tgz", + "integrity": "sha512-V/gxttr6736yJoU9q+4xxXsa0K/w9Hn9pg99zsOHt7i/O904w2CX5NHh5WqDXtoUzVcayLF0RB17yr6l79CE+A==", "dependencies": { - "@babel/runtime": "^7.17.0", - "@mui/utils": "^5.4.2", + "@babel/runtime": "^7.17.2", + "@mui/utils": "^5.4.4", "prop-types": "^15.7.2" }, "engines": { @@ -2834,11 +2834,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.2.tgz", - "integrity": "sha512-tz9p3aRtzXHKAg7x3BgP0hVQEoGKaxNCFxsJ+d/iqEHYvywWFSs6oxqYAvDHIRpvMlUZyPNoTrkcNnbdMmH/ng==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.4.tgz", + "integrity": "sha512-AKx3rSgB6dmt5f7iP4K18mLFlE5/9EfJe/5EH9Pyqez8J/CPkTgYhJ/Va6qtlrcunzpui+uG/vfuf04yAZekSg==", "dependencies": { - "@babel/runtime": "^7.17.0", + "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", "prop-types": "^15.7.2" }, @@ -2864,15 +2864,15 @@ } }, "node_modules/@mui/system": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.3.tgz", - "integrity": "sha512-Xz5AVe9JMufJVozMzUv93IRtnLNZnw/Q8k+Mg7Q4oRuwdir0TcYkMVUqAHetVKb3rAouIVCu/cQv0jB8gVeVsQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.4.tgz", + "integrity": "sha512-Zjbztq2o/VRuRRCWjG44juRrPKYLQMqtQpMHmMttGu5BnvK6PAPW3WOY0r1JCAwLhbd8Kug9nyhGQYKETjo+tQ==", "dependencies": { - "@babel/runtime": "^7.17.0", - "@mui/private-theming": "^5.4.2", - "@mui/styled-engine": "^5.4.2", + "@babel/runtime": "^7.17.2", + "@mui/private-theming": "^5.4.4", + "@mui/styled-engine": "^5.4.4", "@mui/types": "^7.1.2", - "@mui/utils": "^5.4.2", + "@mui/utils": "^5.4.4", "clsx": "^1.1.1", "csstype": "^3.0.10", "prop-types": "^15.7.2" @@ -2916,11 +2916,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.2.tgz", - "integrity": "sha512-646dBCC57MXTo/Gf3AnZSHRHznaTETQq5x7AWp5FRQ4jPeyT4WSs18cpJVwkV01cAHKh06pNQTIufIALIWCL5g==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.4.tgz", + "integrity": "sha512-hfYIXEuhc2mXMGN5nUPis8beH6uE/zl3uMWJcyHX0/LN/+QxO9zhYuV6l8AsAaphHFyS/fBv0SW3Nid7jw5hKQ==", "dependencies": { - "@babel/runtime": "^7.17.0", + "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.7.2", @@ -3643,9 +3643,9 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", - "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz", + "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==", "dependencies": { "@types/react": "*" } @@ -8551,9 +8551,9 @@ } }, "node_modules/history": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.2.0.tgz", - "integrity": "sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", "dependencies": { "@babel/runtime": "^7.7.6" } @@ -14275,9 +14275,9 @@ } }, "node_modules/react-router": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.1.tgz", - "integrity": "sha512-2fG0udBtxou9lXtK97eJeET2ki5//UWfQSl1rlJ7quwe6jrktK9FCCc8dQb5QY6jAv3jua8bBQRhhDOM/kVRsg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz", + "integrity": "sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==", "dependencies": { "history": "^5.2.0" }, @@ -14286,12 +14286,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.1.tgz", - "integrity": "sha512-I6Zax+/TH/cZMDpj3/4Fl2eaNdcvoxxHoH1tYOREsQ22OKDYofGebrNm6CTPUcvLvZm63NL/vzCYdjf9CUhqmA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz", + "integrity": "sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==", "dependencies": { "history": "^5.2.0", - "react-router": "6.2.1" + "react-router": "6.2.2" }, "peerDependencies": { "react": ">=16.8", @@ -16212,9 +16212,9 @@ } }, "node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19340,13 +19340,13 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.69", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.69.tgz", - "integrity": "sha512-IxUUj/lkilCTNBIybQxyQGW/zpxFp490G0QBQJgRp9TJkW2PWSTLvAH7gcH0YHd0L2TAf1TRgfdemoRseMzqQA==", + "version": "5.0.0-alpha.70", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.70.tgz", + "integrity": "sha512-8UZWhz1JYuQnPkAbC37cl4aL1JyNWZ08wDXlp57W7fYQp5xFpBP/7p56AcWg2qG9CNJP0IlFg2Wp4md1v2l4iA==", "requires": { - "@babel/runtime": "^7.17.0", - "@emotion/is-prop-valid": "^1.1.1", - "@mui/utils": "^5.4.2", + "@babel/runtime": "^7.17.2", + "@emotion/is-prop-valid": "^1.1.2", + "@mui/utils": "^5.4.4", "@popperjs/core": "^2.4.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -19354,23 +19354,23 @@ } }, "@mui/icons-material": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.2.tgz", - "integrity": "sha512-7c+G3jBT+e+pN0a9DJ0Bd8Kr1Vy6os5Q1yd2aXcwuhlRI3uzJBLJ8sX6FSWoh5DSEBchb7Bsk1uHz6U0YN9l+Q==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.4.tgz", + "integrity": "sha512-7zoRpjO8vsd+bPvXq6rtXu0V8Saj70X09dtTQogZmxQKabrYW3g7+Yym7SCRA7IYVF3ysz2AvdQrGD1P/sGepg==", "requires": { - "@babel/runtime": "^7.17.0" + "@babel/runtime": "^7.17.2" } }, "@mui/material": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.3.tgz", - "integrity": "sha512-E2K402xjz3U09mTgrVYj+vUACeOppV41uEcu9GSkm7QSg4Nzy48WkdaiGL7TRCyH0T8HsonFSMJvCpwyQbD6iw==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.4.tgz", + "integrity": "sha512-VDJC7GzO1HTFqfMe2zwvaW/sRhABBJXFkKEv5gO3uXx7x9fdwJHQr4udU7NWZCUdOcx9Y0h3BsAILLefYq+WPw==", "requires": { - "@babel/runtime": "^7.17.0", - "@mui/base": "5.0.0-alpha.69", - "@mui/system": "^5.4.3", + "@babel/runtime": "^7.17.2", + "@mui/base": "5.0.0-alpha.70", + "@mui/system": "^5.4.4", "@mui/types": "^7.1.2", - "@mui/utils": "^5.4.2", + "@mui/utils": "^5.4.4", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.10", @@ -19381,35 +19381,35 @@ } }, "@mui/private-theming": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.2.tgz", - "integrity": "sha512-mlPDYYko4wIcwXjCPEmOWbNTT4DZ6h9YHdnRtQPnWM28+TRUHEo7SbydnnmVDQLRXUfaH4Y6XtEHIfBNPE/SLg==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.4.tgz", + "integrity": "sha512-V/gxttr6736yJoU9q+4xxXsa0K/w9Hn9pg99zsOHt7i/O904w2CX5NHh5WqDXtoUzVcayLF0RB17yr6l79CE+A==", "requires": { - "@babel/runtime": "^7.17.0", - "@mui/utils": "^5.4.2", + "@babel/runtime": "^7.17.2", + "@mui/utils": "^5.4.4", "prop-types": "^15.7.2" } }, "@mui/styled-engine": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.2.tgz", - "integrity": "sha512-tz9p3aRtzXHKAg7x3BgP0hVQEoGKaxNCFxsJ+d/iqEHYvywWFSs6oxqYAvDHIRpvMlUZyPNoTrkcNnbdMmH/ng==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.4.tgz", + "integrity": "sha512-AKx3rSgB6dmt5f7iP4K18mLFlE5/9EfJe/5EH9Pyqez8J/CPkTgYhJ/Va6qtlrcunzpui+uG/vfuf04yAZekSg==", "requires": { - "@babel/runtime": "^7.17.0", + "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", "prop-types": "^15.7.2" } }, "@mui/system": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.3.tgz", - "integrity": "sha512-Xz5AVe9JMufJVozMzUv93IRtnLNZnw/Q8k+Mg7Q4oRuwdir0TcYkMVUqAHetVKb3rAouIVCu/cQv0jB8gVeVsQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.4.tgz", + "integrity": "sha512-Zjbztq2o/VRuRRCWjG44juRrPKYLQMqtQpMHmMttGu5BnvK6PAPW3WOY0r1JCAwLhbd8Kug9nyhGQYKETjo+tQ==", "requires": { - "@babel/runtime": "^7.17.0", - "@mui/private-theming": "^5.4.2", - "@mui/styled-engine": "^5.4.2", + "@babel/runtime": "^7.17.2", + "@mui/private-theming": "^5.4.4", + "@mui/styled-engine": "^5.4.4", "@mui/types": "^7.1.2", - "@mui/utils": "^5.4.2", + "@mui/utils": "^5.4.4", "clsx": "^1.1.1", "csstype": "^3.0.10", "prop-types": "^15.7.2" @@ -19422,11 +19422,11 @@ "requires": {} }, "@mui/utils": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.2.tgz", - "integrity": "sha512-646dBCC57MXTo/Gf3AnZSHRHznaTETQq5x7AWp5FRQ4jPeyT4WSs18cpJVwkV01cAHKh06pNQTIufIALIWCL5g==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.4.tgz", + "integrity": "sha512-hfYIXEuhc2mXMGN5nUPis8beH6uE/zl3uMWJcyHX0/LN/+QxO9zhYuV6l8AsAaphHFyS/fBv0SW3Nid7jw5hKQ==", "requires": { - "@babel/runtime": "^7.17.0", + "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.7.2", @@ -19954,9 +19954,9 @@ } }, "@types/react-dom": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", - "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz", + "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==", "requires": { "@types/react": "*" } @@ -23572,9 +23572,9 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "history": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.2.0.tgz", - "integrity": "sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", "requires": { "@babel/runtime": "^7.7.6" } @@ -27598,20 +27598,20 @@ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, "react-router": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.1.tgz", - "integrity": "sha512-2fG0udBtxou9lXtK97eJeET2ki5//UWfQSl1rlJ7quwe6jrktK9FCCc8dQb5QY6jAv3jua8bBQRhhDOM/kVRsg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz", + "integrity": "sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==", "requires": { "history": "^5.2.0" } }, "react-router-dom": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.1.tgz", - "integrity": "sha512-I6Zax+/TH/cZMDpj3/4Fl2eaNdcvoxxHoH1tYOREsQ22OKDYofGebrNm6CTPUcvLvZm63NL/vzCYdjf9CUhqmA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz", + "integrity": "sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==", "requires": { "history": "^5.2.0", - "react-router": "6.2.1" + "react-router": "6.2.2" } }, "react-scripts": { @@ -29046,9 +29046,9 @@ } }, "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==" + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==" }, "unbox-primitive": { "version": "1.0.1", diff --git a/interface/package.json b/interface/package.json index 7b33f679a..e6c94e445 100644 --- a/interface/package.json +++ b/interface/package.json @@ -7,12 +7,12 @@ "@emotion/react": "^11.8.1", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.4.2", - "@mui/material": "^5.4.3", + "@mui/icons-material": "^5.4.4", + "@mui/material": "^5.4.4", "@types/lodash": "^4.14.179", "@types/node": "^17.0.21", "@types/react": "^17.0.39", - "@types/react-dom": "^17.0.11", + "@types/react-dom": "^17.0.13", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", "axios": "^0.26.0", @@ -26,10 +26,10 @@ "react-dom": "^17.0.2", "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", - "react-router-dom": "^6.2.1", + "react-router-dom": "^6.2.2", "react-scripts": "5.0.0", "sockette": "^2.0.6", - "typescript": "^4.5.5" + "typescript": "^4.6.2" }, "scripts": { "start": "react-app-rewired start", diff --git a/scripts/run_sonar.sh b/scripts/run_sonar.sh new file mode 100755 index 000000000..a667c6884 --- /dev/null +++ b/scripts/run_sonar.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# make sure you add the soanr token here +# export SONAR_TOKEN="" + +make clean +build-wrapper-linux-x86-64 --out-dir sonar/build_wrapper_output_directory make all +sonar-scanner diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 000000000..a0ce26c0b --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,11 @@ +sonar.organization=emsesp +sonar.projectKey=emsesp_EMS-ESP32 +sonar.projectName=EMS-ESP32 +sonar.projectVersion=3.4 +sonar.sources=./src +sonar.cfamily.build-wrapper-output=./sonar/build_wrapper_output_directory +sonar.sourceEncoding=UTF-8 +sonar.host.url=https://sonarcloud.io +sonar.cfamily.threads=8 +sonar.cfamily.cache.enabled=false +; sonar.cfamily.cache.path=./sonar/cache diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 0fb66a6e8..9eeb66210 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -295,13 +295,13 @@ bool AnalogSensor::update(uint8_t id, const std::string & name, float offset, fl if (!found_sensor) { EMSESP::webCustomizationService.update( [&](WebCustomization & settings) { - AnalogCustomization newSensor = AnalogCustomization(); - newSensor.id = id; - newSensor.name = name; - newSensor.offset = offset; - newSensor.factor = factor; - newSensor.uom = uom; - newSensor.type = type; + auto newSensor = AnalogCustomization(); + newSensor.id = id; + newSensor.name = name; + newSensor.offset = offset; + newSensor.factor = factor; + newSensor.uom = uom; + newSensor.type = type; settings.analogCustomizations.push_back(newSensor); LOG_DEBUG(F("Adding new customization for analog sensor ID %d"), id); return StateUpdateResult::CHANGED; // persist the change @@ -325,7 +325,7 @@ bool AnalogSensor::updated_values() { } // publish a single sensor to MQTT -void AnalogSensor::publish_sensor(const Sensor & sensor) { +void AnalogSensor::publish_sensor(const Sensor & sensor) const { if (Mqtt::publish_single()) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; if (Mqtt::publish_single2cmd()) { @@ -339,7 +339,7 @@ void AnalogSensor::publish_sensor(const Sensor & sensor) { } // send empty config topic to remove the entry from HA -void AnalogSensor::remove_ha_topic(const uint8_t id) { +void AnalogSensor::remove_ha_topic(const uint8_t id) const { if (!Mqtt::ha_enabled()) { return; } @@ -363,7 +363,6 @@ void AnalogSensor::publish_values(const bool force) { for (const auto & sensor : sensors_) { publish_sensor(sensor); } - // return; } DynamicJsonDocument doc(120 * num_sensors); @@ -383,61 +382,59 @@ void AnalogSensor::publish_values(const bool force) { case AnalogType::PWM_0: case AnalogType::PWM_1: case AnalogType::PWM_2: - dataSensor["value"] = (float)sensor.value(); // float + dataSensor["value"] = sensor.value(); // float break; - case AnalogType::DIGITAL_IN: - case AnalogType::DIGITAL_OUT: default: dataSensor["value"] = (uint8_t)sensor.value(); // convert to char for 1 or 0 break; } // create HA config - if (Mqtt::ha_enabled()) { - if (!sensor.ha_registered || force) { - LOG_DEBUG(F("Recreating HA config for analog sensor ID %d"), sensor.id()); + if (Mqtt::ha_enabled() && (!sensor.ha_registered || force)) { + LOG_DEBUG(F("Recreating HA config for analog sensor ID %d"), sensor.id()); - StaticJsonDocument config; + StaticJsonDocument config; - char stat_t[50]; - snprintf(stat_t, sizeof(stat_t), "%s/analogsensor_data", Mqtt::base().c_str()); - config["stat_t"] = stat_t; + char stat_t[50]; + snprintf(stat_t, sizeof(stat_t), "%s/analogsensor_data", Mqtt::base().c_str()); + config["stat_t"] = stat_t; - char str[50]; - snprintf(str, sizeof(str), "{{value_json['%d'].value}}", sensor.id()); - config["val_tpl"] = str; + char str[50]; + snprintf(str, sizeof(str), "{{value_json['%d'].value}}", sensor.id()); + config["val_tpl"] = str; - snprintf(str, sizeof(str), "Analog Sensor %s", sensor.name().c_str()); - config["name"] = str; + snprintf(str, sizeof(str), "Analog Sensor %s", sensor.name().c_str()); + config["name"] = str; - snprintf(str, sizeof(str), "analogsensor_%d", sensor.id()); - config["uniq_id"] = str; + snprintf(str, sizeof(str), "analogsensor_%d", sensor.id()); + config["uniq_id"] = str; - JsonObject dev = config.createNestedObject("dev"); - JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp"); + JsonObject dev = config.createNestedObject("dev"); + JsonArray ids = dev.createNestedArray("ids"); + ids.add("ems-esp"); - char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%d/config", Mqtt::base().c_str(), sensor.id()); + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%d/config", Mqtt::base().c_str(), sensor.id()); - Mqtt::publish_ha(topic, config.as()); + Mqtt::publish_ha(topic, config.as()); - sensor.ha_registered = true; - } + sensor.ha_registered = true; } + } else { // not nested doc[sensor.name()] = sensor.value(); } } } + Mqtt::publish(F("analogsensor_data"), doc.as()); } // called from emsesp.cpp, similar to the emsdevice->get_value_info // searches by name -bool AnalogSensor::get_value_info(JsonObject & output, const char * cmd, const int8_t id) { +bool AnalogSensor::get_value_info(JsonObject & output, const char * cmd, const int8_t id) const { for (const auto & sensor : sensors_) { if (strcmp(cmd, sensor.name().c_str()) == 0) { output["id"] = sensor.id(); @@ -455,8 +452,8 @@ bool AnalogSensor::get_value_info(JsonObject & output, const char * cmd, const i // creates JSON doc from values // returns false if there are no sensors -bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject & output) { - if (sensors_.size() == 0) { +bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject & output) const { + if (sensors_.empty()) { return false; } @@ -532,7 +529,7 @@ bool AnalogSensor::command_setvalue(const char * value, const int8_t id) { return true; } else if (sensor.type() == AnalogType::DIGITAL_OUT) { uint8_t v = val; - if ((sensor.id() == 25 || sensor.id() == 26)) { + if (sensor.id() == 25 || sensor.id() == 26) { sensor.set_offset(v); sensor.set_value(v); pinMode(sensor.id(), OUTPUT); @@ -573,7 +570,6 @@ bool AnalogSensor::command_commands(const char * value, const int8_t id, JsonObj // hard coded tests #ifdef EMSESP_DEBUG void AnalogSensor::test() { - // Sensor(const uint8_t id, const std::string & name, const float offset, const float factor, const uint8_t uom, const int8_t type); sensors_.emplace_back(36, "test12", 0, 0.1, 17, AnalogType::ADC); sensors_.back().set_value(12.4); diff --git a/src/analogsensor.h b/src/analogsensor.h index e48acd7e9..fc7f72ea6 100644 --- a/src/analogsensor.h +++ b/src/analogsensor.h @@ -127,38 +127,38 @@ class AnalogSensor { void start(); void loop(); - void publish_sensor(const Sensor & sensor); + void publish_sensor(const Sensor & sensor) const; void publish_values(const bool force); void reload(); bool updated_values(); // return back reference to the sensor list, used by other classes - const std::vector sensors() const { + std::vector sensors() const { return sensors_; } - uint32_t reads() { + uint32_t reads() const { return sensorreads_; } - uint32_t fails() { + uint32_t fails() const { return sensorfails_; } - bool analog_enabled() { + bool analog_enabled() const { return (analog_enabled_); } - bool have_sensors() { - return (sensors_.size() > 0); + bool have_sensors() const { + return (!sensors_.empty()); } - size_t no_sensors() { + size_t no_sensors() const { return sensors_.size(); } bool update(uint8_t id, const std::string & name, float offset, float factor, uint8_t uom, int8_t type); - bool get_value_info(JsonObject & output, const char * cmd, const int8_t id); + bool get_value_info(JsonObject & output, const char * cmd, const int8_t id) const; #ifdef EMSESP_DEBUG void test(); @@ -170,10 +170,10 @@ class AnalogSensor { static uuid::log::Logger logger_; - void remove_ha_topic(const uint8_t id); + void remove_ha_topic(const uint8_t id) const; bool command_setvalue(const char * value, const int8_t id); void measure(); - bool command_info(const char * value, const int8_t id, JsonObject & output); + bool command_info(const char * value, const int8_t id, JsonObject & output) const; bool command_commands(const char * value, const int8_t id, JsonObject & output); std::vector sensors_; // our list of sensors diff --git a/src/command.cpp b/src/command.cpp index 0efece5cd..34358bbdc 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -39,13 +39,13 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec } // check first if it's from API, if so strip the "api/" - if ((p.paths().front() == "api")) { + if (p.paths().front() == "api") { p.paths().erase(p.paths().begin()); } else { // not /api, so must be MQTT path. Check for base and remove it. if (!strncmp(path, Mqtt::base().c_str(), Mqtt::base().length())) { char new_path[Mqtt::MQTT_TOPIC_MAX_SIZE]; - strncpy(new_path, path, sizeof(new_path)); + strlcpy(new_path, path, sizeof(new_path)); p.parse(new_path + Mqtt::base().length() + 1); // re-parse the stripped path } else { return message(CommandRet::ERROR, "unrecognized path", output); // error @@ -177,6 +177,8 @@ const std::string Command::return_code_string(const uint8_t return_code) { case CommandRet::FAIL: return read_flash_string(F("Failed")); break; + default: + break; } char s[4]; return Helpers::smallitoa(s, return_code); @@ -191,7 +193,7 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { // make a copy of the string command for parsing char command_s[100]; - strncpy(command_s, command, sizeof(command_s)); + strlcpy(command_s, command, sizeof(command_s)); // look for a delimeter and split the string char * p = command_s; @@ -462,7 +464,7 @@ bool Command::device_has_commands(const uint8_t device_type) { } for (const auto & emsdevice : EMSESP::emsdevices) { - if ((emsdevice) && (emsdevice->device_type() == device_type)) { + if (emsdevice && (emsdevice->device_type() == device_type)) { // device found, now see if it has any commands for (const auto & cf : cmdfunctions_) { if (cf.device_type_ == device_type) { @@ -488,7 +490,7 @@ void Command::show_devices(uuid::console::Shell & shell) { for (const auto & device_class : EMSFactory::device_handlers()) { for (const auto & emsdevice : EMSESP::emsdevices) { - if ((emsdevice) && (emsdevice->device_type() == device_class.first) && (device_has_commands(device_class.first))) { + if (emsdevice && (emsdevice->device_type() == device_class.first) && (device_has_commands(device_class.first))) { shell.printf("%s ", EMSdevice::device_type_2_device_name(device_class.first).c_str()); break; // we only want to show one (not multiple of the same device types) } @@ -554,6 +556,14 @@ SUrlParser::SUrlParser(const char * uri) { } bool SUrlParser::parse(const char * uri) { + if (uri == nullptr) { + return false; + } + + if (*uri == '\0') { + return false; + } + m_folders.clear(); m_keysvalues.clear(); enum Type { begin, folder, param, value }; @@ -563,54 +573,53 @@ bool SUrlParser::parse(const char * uri) { enum Type t = Type::begin; std::string last_param; - if (c != nullptr || *c != '\0') { - do { - if (*c == '/') { - if (s.length() > 0) { - m_folders.push_back(s); - s.clear(); - } - t = Type::folder; - } else if (*c == '?' && (t == Type::folder || t == Type::begin)) { - if (s.length() > 0) { - m_folders.push_back(s); - s.clear(); - } - t = Type::param; - } else if (*c == '=' && (t == Type::param || t == Type::begin)) { + do { + if (*c == '/') { + if (s.length() > 0) { + m_folders.push_back(s); + s.clear(); + } + t = Type::folder; + } else if (*c == '?' && (t == Type::folder || t == Type::begin)) { + if (s.length() > 0) { + m_folders.push_back(s); + s.clear(); + } + t = Type::param; + } else if (*c == '=' && (t == Type::param || t == Type::begin)) { + m_keysvalues[s] = ""; + last_param = s; + s.clear(); + t = Type::value; + } else if (*c == '&' && (t == Type::value || t == Type::param || t == Type::begin)) { + if (t == Type::value) { + m_keysvalues[last_param] = s; + } else if ((t == Type::param || t == Type::begin) && (s.length() > 0)) { m_keysvalues[s] = ""; last_param = s; - s.clear(); - t = Type::value; - } else if (*c == '&' && (t == Type::value || t == Type::param || t == Type::begin)) { - if (t == Type::value) { - m_keysvalues[last_param] = s; - } else if ((t == Type::param || t == Type::begin) && (s.length() > 0)) { - m_keysvalues[s] = ""; - last_param = s; - } - t = Type::param; - s.clear(); - } else if (*c == '\0' && s.length() > 0) { - if (t == Type::value) { - m_keysvalues[last_param] = s; - } else if (t == Type::folder || t == Type::begin) { - m_folders.push_back(s); - } else if (t == Type::param) { - m_keysvalues[s] = ""; - last_param = s; - } - s.clear(); - } else if (*c == '\0' && s.length() == 0) { - if (t == Type::param && last_param.length() > 0) { - m_keysvalues[last_param] = ""; - } - s.clear(); - } else { - s += *c; } - } while (*c++ != '\0'); - } + t = Type::param; + s.clear(); + } else if (*c == '\0' && s.length() > 0) { + if (t == Type::value) { + m_keysvalues[last_param] = s; + } else if (t == Type::folder || t == Type::begin) { + m_folders.push_back(s); + } else if (t == Type::param) { + m_keysvalues[s] = ""; + last_param = s; + } + s.clear(); + } else if (*c == '\0' && s.length() == 0) { + if (t == Type::param && last_param.length() > 0) { + m_keysvalues[last_param] = ""; + } + s.clear(); + } else { + s += *c; + } + } while (*c++ != '\0'); + return true; } diff --git a/src/command.h b/src/command.h index bc1bf7e7c..0da1a8a90 100644 --- a/src/command.h +++ b/src/command.h @@ -132,7 +132,7 @@ class Command { static std::vector cmdfunctions_; // the list of commands - inline static uint8_t message(uint8_t error_code, const char * message, JsonObject & output) { + inline static uint8_t message(uint8_t error_code, const char * message, const JsonObject & output) { output.clear(); output["message"] = (const char *)message; return error_code; @@ -148,7 +148,7 @@ class SUrlParser { Folder_t m_folders; public: - SUrlParser(){}; + SUrlParser() = default; SUrlParser(const char * url); bool parse(const char * url); diff --git a/src/console.cpp b/src/console.cpp index 9bf0c7048..256d16fa2 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -31,9 +31,8 @@ std::shared_ptr EMSESPShell::commands = [] { return commands; }(); -static std::shared_ptr shell; - -std::vector EMSESPStreamConsole::ptys_; +std::shared_ptr shell; +std::vector EMSESPStreamConsole::ptys_; #ifndef EMSESP_STANDALONE uuid::telnet::TelnetService telnet_([](Stream & stream, const IPAddress & addr, uint16_t port) -> std::shared_ptr { @@ -536,10 +535,7 @@ void Console::load_standard_commands(unsigned int context) { EMSESPShell::commands->add_command(context, CommandFlags::USER, flash_string_vector{F_(exit)}, - [=](Shell & shell, const std::vector & arguments __attribute__((unused))) { - shell.stop(); - // shell.exit_context(); - }); + [=](Shell & shell, const std::vector & arguments __attribute__((unused))) { shell.stop(); }); EMSESPShell::commands->add_command(context, CommandFlags::USER, diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index 0a69b6f17..00dfc2251 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -435,7 +435,6 @@ void DallasSensor::publish_values(const bool force) { for (const auto & sensor : sensors_) { publish_sensor(sensor); } - // return; } DynamicJsonDocument doc(120 * num_sensors); diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index b562e64ad..3f3165410 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -532,7 +532,7 @@ void Boiler::process_UBAParameterWW(std::shared_ptr telegram) { has_update(telegram, wwDisinfectionTemp_, 8); has_bitupdate(telegram, wwChargeType_, 10, 0); // 0 = charge pump, 0xff = 3-way valve - uint8_t wwComfort; + uint8_t wwComfort = EMS_VALUE_UINT_NOTSET; telegram->read_value(wwComfort, 9); if (wwComfort == 0) { wwComfort = 0; // Hot @@ -594,7 +594,7 @@ void Boiler::process_UBAMonitorFastPlus(std::shared_ptr telegram // read 3 char service code / installation status as appears on the display if ((telegram->message_length > 3) && (telegram->offset == 0)) { - char serviceCode[4]; + char serviceCode[4] = {0}; telegram->read_value(serviceCode[0], 1); serviceCode[0] = (serviceCode[0] == (char)0xF0) ? '~' : serviceCode[0]; telegram->read_value(serviceCode[1], 2); @@ -878,19 +878,19 @@ void Boiler::process_UBAErrorMessage(std::shared_ptr telegram) { if (telegram->message_data[4] & 0x80) { // valid date static uint32_t lastCodeDate_ = 0; // last code date - char code[3]; - uint16_t codeNo; - code[0] = telegram->message_data[0]; - code[1] = telegram->message_data[1]; - code[2] = 0; + char code[3] = {0}; + uint16_t codeNo = EMS_VALUE_SHORT_NOTSET; + code[0] = telegram->message_data[0]; + code[1] = telegram->message_data[1]; + code[2] = 0; telegram->read_value(codeNo, 2); - uint16_t year = (telegram->message_data[4] & 0x7F) + 2000; - uint8_t month = telegram->message_data[5]; - uint8_t day = telegram->message_data[7]; - uint8_t hour = telegram->message_data[6]; - uint8_t min = telegram->message_data[8]; - uint32_t date = (year - 2000) * 535680UL + month * 44640UL + day * 1440UL + hour * 60 + min; - uint16_t duration; + uint16_t year = (telegram->message_data[4] & 0x7F) + 2000; + uint8_t month = telegram->message_data[5]; + uint8_t day = telegram->message_data[7]; + uint8_t hour = telegram->message_data[6]; + uint8_t min = telegram->message_data[8]; + uint32_t date = (year - 2000) * 535680UL + month * 44640UL + day * 1440UL + hour * 60 + min; + uint16_t duration = EMS_VALUE_SHORT_NOTSET; telegram->read_value(duration, 9); // store only the newest code from telegrams 10 and 11 if (date > lastCodeDate_) { @@ -908,12 +908,12 @@ void Boiler::process_UBAErrorMessage2(std::shared_ptr telegram) return; } - char code[sizeof(lastCode_)]; - uint16_t codeNo; - code[0] = telegram->message_data[5]; - code[1] = telegram->message_data[6]; - code[2] = telegram->message_data[7]; - code[3] = 0; + char code[sizeof(lastCode_)] = {0}; + uint16_t codeNo = EMS_VALUE_SHORT_NOTSET; + code[0] = telegram->message_data[5]; + code[1] = telegram->message_data[6]; + code[2] = telegram->message_data[7]; + code[3] = 0; telegram->read_value(codeNo, 8); // check for valid date, https://github.com/emsesp/EMS-ESP32/issues/204 @@ -1486,8 +1486,12 @@ bool Boiler::set_reset(const char * value, const int8_t id) { return false; } -//maintenance +// maintenance bool Boiler::set_maintenance(const char * value, const int8_t id) { + if (value == nullptr) { + return false; + } + std::string s; if (Helpers::value2string(value, s)) { if (s == Helpers::toLower(read_flash_string(F_(reset)))) { @@ -1549,7 +1553,7 @@ bool Boiler::set_maintenancetime(const char * value, const int8_t id) { //maintenance bool Boiler::set_maintenancedate(const char * value, const int8_t id) { - if (strlen(value) == 10) { // date + if ((value != nullptr) && strlen(value) == 10) { // date uint8_t day = (value[0] - '0') * 10 + (value[1] - '0'); uint8_t month = (value[3] - '0') * 10 + (value[4] - '0'); uint8_t year = (uint8_t)(Helpers::atoint(&value[6]) - 2000); diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index e426728e1..e669d2815 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -370,7 +370,7 @@ std::shared_ptr Thermostat::heating_circuit(std::sha } // add the HVAC/Climate HA component for the HC -void Thermostat::add_ha_climate(std::shared_ptr hc) { +void Thermostat::add_ha_climate(std::shared_ptr hc) const { if (!Mqtt::ha_enabled()) { hc->climate = EMS_VALUE_UINT_NOTSET; return; @@ -1274,18 +1274,18 @@ void Thermostat::process_RCErrorMessage(std::shared_ptr telegram // data: displaycode(2), errornumber(2), year, month, hour, day, minute, duration(2), src-addr if (telegram->message_data[4] & 0x80) { // valid date - char code[sizeof(lastCode_)]; - uint16_t codeNo = EMS_VALUE_USHORT_NOTSET; - code[0] = telegram->message_data[0]; - code[1] = telegram->message_data[1]; - code[2] = 0; + char code[sizeof(lastCode_)] = {0}; + uint16_t codeNo = EMS_VALUE_USHORT_NOTSET; + code[0] = telegram->message_data[0]; + code[1] = telegram->message_data[1]; + code[2] = 0; telegram->read_value(codeNo, 2); - uint16_t year = (telegram->message_data[4] & 0x7F) + 2000; - uint8_t month = telegram->message_data[5]; - uint8_t day = telegram->message_data[7]; - uint8_t hour = telegram->message_data[6]; - uint8_t min = telegram->message_data[8]; - uint16_t duration; + uint16_t year = (telegram->message_data[4] & 0x7F) + 2000; + uint8_t month = telegram->message_data[5]; + uint8_t day = telegram->message_data[7]; + uint8_t hour = telegram->message_data[6]; + uint8_t min = telegram->message_data[8]; + uint16_t duration = EMS_VALUE_SHORT_NOTSET; telegram->read_value(duration, 9); snprintf(&code[2], sizeof(code) - 2, "(%d) %02d.%02d.%d %02d:%02d (%d min)", codeNo, day, month, year, hour, min, duration); has_update(lastCode_, code, sizeof(lastCode_)); @@ -1329,7 +1329,7 @@ bool Thermostat::set_calinttemp(const char * value, const int8_t id) { return false; } - int8_t t = (int8_t)(ct * 10); + auto t = (int8_t)(ct * 10); LOG_DEBUG(F("Calibrating internal temperature to %d.%d C"), t / 10, t < 0 ? -t % 10 : t % 10); if (model() == EMS_DEVICE_FLAG_RC10) { @@ -1696,9 +1696,11 @@ bool Thermostat::set_wwCircProg(const char * value, const int8_t id) { bool Thermostat::set_holiday(const char * value, const int8_t id, const bool vacation) { uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; std::shared_ptr hc = heating_circuit(hc_num); - if (hc == nullptr) { + + if ((hc == nullptr) || (value == nullptr)) { return false; } + if (strlen(value) != 21) { return false; } @@ -1843,7 +1845,7 @@ bool Thermostat::set_roominfl_factor(const char * value, const int8_t id) { // sets the thermostat working mode, where mode is a string // converts string mode to HeatingCircuit::Mode bool Thermostat::set_mode(const char * value, const int8_t id) { - if (strlen(value) >= 20) { + if ((value == nullptr) || (strlen(value) >= 20)) { return false; } @@ -2171,7 +2173,7 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char } const char * s_mode = doc["mode"]; const char * s_time = doc["time"]; - if ((model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N)) { + if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { bool b; if (Helpers::value2bool(s_mode, b)) { on = b ? 1 : 0; @@ -2386,6 +2388,8 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = 4; } break; + default: + break; } } else if (model == EMS_DEVICE_FLAG_RC20) { switch (mode) { @@ -2419,6 +2423,8 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = EMS_OFFSET_RC20Set_temp_auto; } break; + default: + break; } } else if (model == EMS_DEVICE_FLAG_RC30) { @@ -3352,6 +3358,8 @@ void Thermostat::register_device_values_hc(std::shared_ptrprogram, DeviceValueType::ENUM, FL_(enum_progMode4), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES); break; + default: + break; } } diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index e10eccda8..8bd467b46 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -93,7 +93,7 @@ class Thermostat : public EMSdevice { } // determines if the heating circuit is actually present and has data - bool is_active() { + bool is_active() const { return Helpers::hasValue(selTemp); } @@ -292,7 +292,7 @@ class Thermostat : public EMSdevice { void register_device_values_hc(std::shared_ptr hc); - void add_ha_climate(std::shared_ptr hc); + void add_ha_climate(std::shared_ptr hc) const; void process_RCOutdoorTemp(std::shared_ptr telegram); void process_IBASettings(std::shared_ptr telegram); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index c1d62e3c3..bae306d86 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -34,7 +34,7 @@ uint8_t EMSdevice::count_entities() { } // see if there are entities, excluding any commands -bool EMSdevice::has_entities() { +bool EMSdevice::has_entities() const { for (const auto & dv : devicevalues_) { if (dv.type != DeviceValueType::CMD) { return true; @@ -43,22 +43,22 @@ bool EMSdevice::has_entities() { return false; } -const std::string EMSdevice::tag_to_string(uint8_t tag) { +std::string EMSdevice::tag_to_string(uint8_t tag) { return read_flash_string(DeviceValue::DeviceValueTAG_s[tag]); } -const std::string EMSdevice::tag_to_mqtt(uint8_t tag) { +std::string EMSdevice::tag_to_mqtt(uint8_t tag) { return read_flash_string(DeviceValue::DeviceValueTAG_mqtt[tag]); } -const std::string EMSdevice::uom_to_string(uint8_t uom) { +std::string EMSdevice::uom_to_string(uint8_t uom) { if (EMSESP::system_.fahrenheit() && (uom == DeviceValueUOM::DEGREES || uom == DeviceValueUOM::DEGREES_R)) { return read_flash_string(DeviceValue::DeviceValueUOM_s[DeviceValueUOM::FAHRENHEIT]); } return read_flash_string(DeviceValue::DeviceValueUOM_s[uom]); } -const std::string EMSdevice::brand_to_string() const { +std::string EMSdevice::brand_to_string() const { switch (brand_) { case EMSdevice::Brand::BOSCH: return read_flash_string(F("Bosch")); @@ -91,7 +91,7 @@ const std::string EMSdevice::brand_to_string() const { } // returns the name of the MQTT topic to use for a specific device, without the base -const std::string EMSdevice::device_type_2_device_name(const uint8_t device_type) { +std::string EMSdevice::device_type_2_device_name(const uint8_t device_type) { switch (device_type) { case DeviceType::SYSTEM: return read_flash_string(F_(system)); @@ -196,7 +196,7 @@ uint8_t EMSdevice::device_name_2_device_type(const char * topic) { } // return name of the device type, capitalized -const std::string EMSdevice::device_type_name() const { +std::string EMSdevice::device_type_name() const { std::string s = device_type_2_device_name(device_type_); s[0] = toupper(s[0]); return s; @@ -226,7 +226,6 @@ uint8_t EMSdevice::decode_brand(uint8_t value) { case 13: return EMSdevice::Brand::IVT; break; - case 0: default: return EMSdevice::Brand::NO_BRAND; break; @@ -234,7 +233,7 @@ uint8_t EMSdevice::decode_brand(uint8_t value) { } // returns string of a human friendly description of the EMS device -const std::string EMSdevice::to_string() const { +std::string EMSdevice::to_string() const { // for devices that haven't been lookup yet, don't show all details if (product_id_ == 0) { return name_ + " (DeviceID:" + Helpers::hextoa(device_id_) + ")"; @@ -249,7 +248,7 @@ const std::string EMSdevice::to_string() const { } // returns out brand + device name -const std::string EMSdevice::to_string_short() const { +std::string EMSdevice::to_string_short() const { if (brand_ == Brand::NO_BRAND) { return device_type_name() + ": " + name_; } @@ -280,8 +279,8 @@ void EMSdevice::toggle_fetch(uint16_t telegram_id, bool toggle) { } // get status of automatic fetch for a telegramID -bool EMSdevice::is_fetch(uint16_t telegram_id) { - for (auto & tf : telegram_functions_) { +bool EMSdevice::is_fetch(uint16_t telegram_id) const { + for (const auto & tf : telegram_functions_) { if (tf.telegram_type_id_ == telegram_id) { return tf.fetch_; } @@ -291,7 +290,7 @@ bool EMSdevice::is_fetch(uint16_t telegram_id) { // list of registered device entries // called from the command 'entities' -void EMSdevice::list_device_entries(JsonObject & output) { +void EMSdevice::list_device_entries(JsonObject & output) const { for (const auto & dv : devicevalues_) { if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.type != DeviceValueType::CMD && dv.full_name) { // if we have a tag prefix it @@ -316,8 +315,8 @@ void EMSdevice::list_device_entries(JsonObject & output) { } // list all the telegram type IDs for this device -void EMSdevice::show_telegram_handlers(uuid::console::Shell & shell) { - if (telegram_functions_.size() == 0) { +void EMSdevice::show_telegram_handlers(uuid::console::Shell & shell) const { + if (telegram_functions_.empty()) { return; } /* @@ -383,7 +382,7 @@ char * EMSdevice::show_telegram_handlers(char * result, uint8_t handlers) { } // list all the mqtt handlers for this device -void EMSdevice::show_mqtt_handlers(uuid::console::Shell & shell) { +void EMSdevice::show_mqtt_handlers(uuid::console::Shell & shell) const { Mqtt::show_topic_handlers(shell, device_type_); } @@ -416,7 +415,7 @@ void EMSdevice::register_device_value(uint8_t tag, uint16_t max) { // initialize the device value depending on it's type if (type == DeviceValueType::STRING) { - *(char *)(value_p) = {'\0'}; + *(char *)(value_p) = {'\0'}; // this is important for string functions like strlen() to work later } else if (type == DeviceValueType::INT) { *(int8_t *)(value_p) = EMS_VALUE_INT_NOTSET; } else if (type == DeviceValueType::SHORT) { @@ -437,7 +436,7 @@ void EMSdevice::register_device_value(uint8_t tag, uint8_t i = 0; while (options[i++]) { options_size++; - }; + } } // this is the unique id set for the device entity. it's a simple sequence number @@ -446,9 +445,6 @@ void EMSdevice::register_device_value(uint8_t tag, // determine state uint8_t state = DeviceValueState::DV_VISIBLE; // default to visible - // if (!full_name) { - // state = DeviceValueState::DV_DEFAULT; // don't show if the full_name is empty - // } else { // scan through customizations to see if it's on the exclusion list by matching the productID and deviceID EMSESP::webCustomizationService.read([&](WebCustomization & settings) { for (EntityCustomization entityCustomization : settings.entityCustomizations) { @@ -462,7 +458,6 @@ void EMSdevice::register_device_value(uint8_t tag, } } }); - // } // add the device devicevalues_.emplace_back(device_type_, tag, value_p, type, options, options_size, short_name, full_name, uom, 0, has_cmd, min, max, state, dv_id); @@ -526,7 +521,7 @@ void EMSdevice::register_device_value(uint8_t tag, } // check if value is visible -bool EMSdevice::is_visible(void * value_p) { +bool EMSdevice::is_visible(const void * value_p) const { for (const auto & dv : devicevalues_) { if (dv.value_p == value_p) { return dv.has_state(DeviceValueState::DV_VISIBLE); @@ -536,15 +531,16 @@ bool EMSdevice::is_visible(void * value_p) { } // publish a single value on change -void EMSdevice::publish_value(void * value_p) { +void EMSdevice::publish_value(void * value_p) const { if (!Mqtt::publish_single() || value_p == nullptr) { return; } + for (const auto & dv : devicevalues_) { if (dv.value_p == value_p && dv.has_state(DeviceValueState::DV_VISIBLE)) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; if (Mqtt::publish_single2cmd()) { - if ((dv.tag >= DeviceValueTAG::TAG_HC1 && dv.tag <= DeviceValueTAG::TAG_WWC4)) { + if (dv.tag >= DeviceValueTAG::TAG_HC1 && dv.tag <= DeviceValueTAG::TAG_WWC4) { snprintf(topic, sizeof(topic), "%s/%s/%s", @@ -622,7 +618,7 @@ void EMSdevice::publish_value(void * value_p) { } // looks up the UOM for a given key from the device value table -const std::string EMSdevice::get_value_uom(const char * key) { +std::string EMSdevice::get_value_uom(const char * key) const { // the key may have a TAG string prefixed at the beginning. If so, remove it char new_key[80]; strlcpy(new_key, key, sizeof(new_key)); @@ -641,14 +637,12 @@ const std::string EMSdevice::get_value_uom(const char * key) { // look up key in our device value list for (const auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.full_name) { - if (read_flash_string(dv.full_name) == key_p) { - // ignore TIME since "minutes" is already added to the string value - if ((dv.uom == DeviceValueUOM::NONE) || (dv.uom == DeviceValueUOM::MINUTES)) { - break; - } - return EMSdevice::uom_to_string(dv.uom); + if ((dv.has_state(DeviceValueState::DV_VISIBLE) && dv.full_name) && (read_flash_string(dv.full_name) == key_p)) { + // ignore TIME since "minutes" is already added to the string value + if ((dv.uom == DeviceValueUOM::NONE) || (dv.uom == DeviceValueUOM::MINUTES)) { + break; } + return EMSdevice::uom_to_string(dv.uom); } } @@ -675,9 +669,9 @@ void EMSdevice::generate_values_web(JsonObject & output) { // handle Booleans (true, false) if (dv.type == DeviceValueType::BOOL) { bool value_b = *(bool *)(dv.value_p); - if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { obj["v"] = value_b ? "true" : "false"; - } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { obj["v"] = value_b ? 1 : 0; } else { char s[7]; @@ -806,9 +800,9 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { // handle Booleans (true, false) if (dv.type == DeviceValueType::BOOL) { bool value_b = *(bool *)(dv.value_p); - if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { obj["v"] = value_b; - } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { obj["v"] = value_b ? 1 : 0; } else { char s[7]; @@ -834,7 +828,8 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { uint8_t divider = 0; uint8_t factor = 1; if (dv.options_size == 1) { - const char * s = read_flash_string(dv.options[0]).c_str(); + auto s_str = read_flash_string(dv.options[0]); // prevent object backing the pointer will be destroyed at the end of the full-expression + const char * s = s_str.c_str(); if (s[0] == '*') { factor = Helpers::atoint(&s[1]); } else { @@ -843,13 +838,13 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { } if (dv.type == DeviceValueType::INT) { - obj["v"] = (divider) ? Helpers::round2(*(int8_t *)(dv.value_p), divider) : *(int8_t *)(dv.value_p) * factor; + obj["v"] = divider ? Helpers::round2(*(int8_t *)(dv.value_p), divider) : *(int8_t *)(dv.value_p) * factor; } else if (dv.type == DeviceValueType::UINT) { - obj["v"] = (divider) ? Helpers::round2(*(uint8_t *)(dv.value_p), divider) : *(uint8_t *)(dv.value_p) * factor; + obj["v"] = divider ? Helpers::round2(*(uint8_t *)(dv.value_p), divider) : *(uint8_t *)(dv.value_p) * factor; } else if (dv.type == DeviceValueType::SHORT) { - obj["v"] = (divider) ? Helpers::round2(*(int16_t *)(dv.value_p), divider) : *(int16_t *)(dv.value_p) * factor; + obj["v"] = divider ? Helpers::round2(*(int16_t *)(dv.value_p), divider) : *(int16_t *)(dv.value_p) * factor; } else if (dv.type == DeviceValueType::USHORT) { - obj["v"] = (divider) ? Helpers::round2(*(uint16_t *)(dv.value_p), divider) : *(uint16_t *)(dv.value_p) * factor; + obj["v"] = divider ? Helpers::round2(*(uint16_t *)(dv.value_p), divider) : *(uint16_t *)(dv.value_p) * factor; } else if (dv.type == DeviceValueType::ULONG) { obj["v"] = divider ? Helpers::round2(*(uint32_t *)(dv.value_p), divider) : *(uint32_t *)(dv.value_p) * factor; } else if (dv.type == DeviceValueType::TIME) { @@ -980,10 +975,10 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 case DeviceValueType::BOOL: if (Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { - bool value_b = (bool)(*(uint8_t *)(dv.value_p)); - if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + auto value_b = (bool)(*(uint8_t *)(dv.value_p)); + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { json[value] = value_b; - } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { json[value] = value_b ? 1 : 0; } else { char s[7]; @@ -1098,10 +1093,10 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c if (have_tag) { snprintf(name, 80, "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); // prefix the tag } else { - strcpy(name, read_flash_string(dv.full_name).c_str()); // use full name + strlcpy(name, read_flash_string(dv.full_name).c_str(), sizeof(name)); // use full name } } else { - strcpy(name, read_flash_string(dv.short_name).c_str()); // use short name + strlcpy(name, read_flash_string(dv.short_name).c_str(), sizeof(name)); // use short name // if we have a tag, and its different to the last one create a nested object. only for hc, wwc and hs if (dv.tag != old_tag) { @@ -1115,14 +1110,14 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // handle Booleans if (dv.type == DeviceValueType::BOOL && Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { // see how to render the value depending on the setting - bool value_b = (bool)*(uint8_t *)(dv.value_p); + auto value_b = (bool)*(uint8_t *)(dv.value_p); if (Mqtt::ha_enabled() && (output_target == OUTPUT_TARGET::MQTT)) { char s[7]; json[name] = Helpers::render_boolean(s, value_b); // for HA always render as string } else { - if ((EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE)) { + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { json[name] = value_b; - } else if ((EMSESP::system_.bool_format() == BOOL_FORMAT_10)) { + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { json[name] = value_b ? 1 : 0; } else { char s[7]; @@ -1139,7 +1134,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // handle ENUMs else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { // check for numeric enum-format - if ((EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX)) { + if (EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX) { json[name] = (uint8_t)(*(uint8_t *)(dv.value_p)); } else { json[name] = dv.options[*(uint8_t *)(dv.value_p)]; @@ -1156,7 +1151,8 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c uint8_t divider = 0; uint8_t factor = 1; if (dv.options_size == 1) { - const char * s = read_flash_string(dv.options[0]).c_str(); + auto s_str = read_flash_string(dv.options[0]); // prevent object backing the pointer will be destroyed at the end of the full-expression + const char * s = s_str.c_str(); if (s[0] == '*') { factor = Helpers::atoint(&s[1]); } else { @@ -1292,7 +1288,7 @@ void EMSdevice::ha_config_clear() { ha_config_done(false); // this will force the recreation of the main HA device config } -bool EMSdevice::has_telegram_id(uint16_t id) { +bool EMSdevice::has_telegram_id(uint16_t id) const { for (const auto & tf : telegram_functions_) { if (tf.telegram_type_id_ == id) { return true; @@ -1302,7 +1298,7 @@ bool EMSdevice::has_telegram_id(uint16_t id) { } // return the name of the telegram type -const std::string EMSdevice::telegram_type_name(std::shared_ptr telegram) { +std::string EMSdevice::telegram_type_name(std::shared_ptr telegram) const { // see if it's one of the common ones, like Version if (telegram->type_id == EMS_TYPE_VERSION) { return read_flash_string(F("Version")); @@ -1343,22 +1339,22 @@ bool EMSdevice::handle_telegram(std::shared_ptr telegram) { } // send Tx write with a data block -void EMSdevice::write_command(const uint16_t type_id, const uint8_t offset, uint8_t * message_data, const uint8_t message_length, const uint16_t validate_typeid) { +void EMSdevice::write_command(const uint16_t type_id, const uint8_t offset, uint8_t * message_data, const uint8_t message_length, const uint16_t validate_typeid) const { EMSESP::send_write_request(type_id, device_id(), offset, message_data, message_length, validate_typeid); } // send Tx write with a single value -void EMSdevice::write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid) { +void EMSdevice::write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid) const { EMSESP::send_write_request(type_id, device_id(), offset, value, validate_typeid); } // send Tx write with a single value, with no post validation -void EMSdevice::write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value) { +void EMSdevice::write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value) const { EMSESP::send_write_request(type_id, device_id(), offset, value, 0); } // send Tx read command to the device -void EMSdevice::read_command(const uint16_t type_id, const uint8_t offset, const uint8_t length) { +void EMSdevice::read_command(const uint16_t type_id, const uint8_t offset, const uint8_t length) const { EMSESP::send_read_request(type_id, device_id(), offset, length); } diff --git a/src/emsdevice.h b/src/emsdevice.h index 8487e056a..5c385a3c7 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -44,13 +44,13 @@ class EMSdevice { strlcpy(version_, version, sizeof(version_)); } - const std::string device_type_name() const; + std::string device_type_name() const; - static const std::string device_type_2_device_name(const uint8_t device_type); - static uint8_t device_name_2_device_type(const char * topic); - static const std::string uom_to_string(uint8_t uom); - static const std::string tag_to_string(uint8_t tag); - static const std::string tag_to_mqtt(uint8_t tag); + static std::string device_type_2_device_name(const uint8_t device_type); + static uint8_t device_name_2_device_type(const char * topic); + static std::string uom_to_string(uint8_t uom); + static std::string tag_to_string(uint8_t tag); + static std::string tag_to_mqtt(uint8_t tag); inline uint8_t device_id() const { return device_id_; @@ -64,7 +64,7 @@ class EMSdevice { product_id_ = product_id; } - inline bool is_device_id(uint8_t device_id) { + inline bool is_device_id(uint8_t device_id) const { return ((device_id & 0x7F) == (device_id_ & 0x7F)); } @@ -90,7 +90,7 @@ class EMSdevice { strlcpy(version_, version, sizeof(version_)); } - inline const char * version() { + inline const char * version() const { return version_; } @@ -132,7 +132,7 @@ class EMSdevice { publish_value(value); } - inline void has_update(char * value, char * newvalue, size_t len) { + inline void has_update(char * value, const char * newvalue, size_t len) { if (strcmp(value, newvalue) != 0) { strlcpy(value, newvalue, len); has_update_ = true; @@ -171,18 +171,18 @@ class EMSdevice { } } - const std::string brand_to_string() const; - static uint8_t decode_brand(uint8_t value); + std::string brand_to_string() const; + static uint8_t decode_brand(uint8_t value); - const std::string to_string() const; - const std::string to_string_short() const; + std::string to_string() const; + std::string to_string_short() const; enum Handlers : uint8_t { ALL, RECEIVED, FETCHED, PENDING }; - void show_telegram_handlers(uuid::console::Shell & shell); + void show_telegram_handlers(uuid::console::Shell & shell) const; char * show_telegram_handlers(char * result, uint8_t handlers); - void show_mqtt_handlers(uuid::console::Shell & shell); - void list_device_entries(JsonObject & output); + void show_mqtt_handlers(uuid::console::Shell & shell) const; + void list_device_entries(JsonObject & output) const; void exclude_entity(uint8_t entity_id); void reset_exclude_entities(); @@ -191,9 +191,9 @@ class EMSdevice { void register_telegram_type(const uint16_t telegram_type_id, const __FlashStringHelper * telegram_type_name, bool fetch, const process_function_p cb); bool handle_telegram(std::shared_ptr telegram); - const std::string get_value_uom(const char * key); - bool get_value_info(JsonObject & root, const char * cmd, const int8_t id); - void get_dv_info(JsonObject & json); + std::string get_value_uom(const char * key) const; + bool get_value_info(JsonObject & root, const char * cmd, const int8_t id); + void get_dv_info(JsonObject & json); enum OUTPUT_TARGET : uint8_t { API_VERBOSE, API_SHORTNAMES, MQTT }; bool generate_values(JsonObject & output, const uint8_t tag_filter, const bool nested, const uint8_t output_target); @@ -236,25 +236,25 @@ class EMSdevice { const __FlashStringHelper * const * name, uint8_t uom); - void write_command(const uint16_t type_id, const uint8_t offset, uint8_t * message_data, const uint8_t message_length, const uint16_t validate_typeid); - void write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid); - void write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value); + void write_command(const uint16_t type_id, const uint8_t offset, uint8_t * message_data, const uint8_t message_length, const uint16_t validate_typeid) const; + void write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid) const; + void write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value) const; - void read_command(const uint16_t type_id, uint8_t offset = 0, uint8_t length = 0); + void read_command(const uint16_t type_id, uint8_t offset = 0, uint8_t length = 0) const; - bool is_visible(void * value_p); - void publish_value(void * value_p); + bool is_visible(const void * value_p) const; + void publish_value(void * value_p) const; void publish_all_values(); void mqtt_ha_entity_config_create(); void mqtt_ha_entity_config_remove(); - const std::string telegram_type_name(std::shared_ptr telegram); + std::string telegram_type_name(std::shared_ptr telegram) const; void fetch_values(); void toggle_fetch(uint16_t telegram_id, bool toggle); - bool is_fetch(uint16_t telegram_id); - bool has_telegram_id(uint16_t id); + bool is_fetch(uint16_t telegram_id) const; + bool has_telegram_id(uint16_t id) const; void ha_config_clear(); bool ha_config_done() const { @@ -345,7 +345,7 @@ class EMSdevice { static constexpr uint8_t EMS_DEVICE_FLAG_CRF = 12; // CRF200 only monitor uint8_t count_entities(); - bool has_entities(); + bool has_entities() const; private: uint8_t unique_id_; diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 4bb24c723..255c98422 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -78,12 +78,10 @@ bool EMSESP::wait_km_ = true; // or if device_id is 0 it will fetch from all our known and active devices void EMSESP::fetch_device_values(const uint8_t device_id) { for (const auto & emsdevice : emsdevices) { - if (emsdevice) { - if ((device_id == 0) || emsdevice->is_device_id(device_id)) { - emsdevice->fetch_values(); - if (device_id != 0) { - return; // quit, we only want to return the selected device - } + if ((device_id == 0) || emsdevice->is_device_id(device_id)) { + emsdevice->fetch_values(); + if (device_id != 0) { + return; // quit, we only want to return the selected device } } } @@ -92,10 +90,8 @@ void EMSESP::fetch_device_values(const uint8_t device_id) { // see if the deviceID exists bool EMSESP::valid_device(const uint8_t device_id) { for (const auto & emsdevice : emsdevices) { - if (emsdevice) { - if (emsdevice->is_device_id(device_id)) { - return true; - } + if (emsdevice && emsdevice->is_device_id(device_id)) { + return true; } } return false; // can't find it @@ -104,7 +100,7 @@ bool EMSESP::valid_device(const uint8_t device_id) { // for a specific EMS device type go and request data values void EMSESP::fetch_device_values_type(const uint8_t device_type) { for (const auto & emsdevice : emsdevices) { - if ((emsdevice) && (emsdevice->device_type() == device_type)) { + if (emsdevice && (emsdevice->device_type() == device_type)) { emsdevice->fetch_values(); } } @@ -228,9 +224,9 @@ void EMSESP::watch_id(uint16_t watch_id) { // resets all counters and bumps the UART // this is called when the tx_mode is persisted in the FS either via Web UI or the console void EMSESP::uart_init() { - uint8_t tx_mode; - uint8_t rx_gpio; - uint8_t tx_gpio; + uint8_t tx_mode = 0; + uint8_t rx_gpio = 0; + uint8_t tx_gpio = 0; EMSESP::webSettingsService.read([&](WebSettings & settings) { tx_mode = settings.tx_mode; rx_gpio = settings.rx_gpio; @@ -275,10 +271,8 @@ uint8_t EMSESP::bus_status() { } // Tx Failure rate > 10% - if (total_fail < total_sent) { - if (((total_fail * 100) / total_sent) > EMSbus::EMS_TX_ERROR_LIMIT) { - return BUS_STATUS_TX_ERRORS; - } + if ((total_fail < total_sent) && (((total_fail * 100) / total_sent) > EMSbus::EMS_TX_ERROR_LIMIT)) { + return BUS_STATUS_TX_ERRORS; } return BUS_STATUS_CONNECTED; @@ -294,7 +288,6 @@ void EMSESP::show_ems(uuid::console::Shell & shell) { case BUS_STATUS_TX_ERRORS: shell.printfln(F("EMS Bus is connected, but Tx is not stable.")); break; - case BUS_STATUS_CONNECTED: default: shell.printfln(F("EMS Bus is connected.")); break; @@ -306,7 +299,7 @@ void EMSESP::show_ems(uuid::console::Shell & shell) { shell.printfln(F("EMS Bus info:")); EMSESP::webSettingsService.read([&](WebSettings & settings) { shell.printfln(F(" Tx mode: %d"), settings.tx_mode); }); shell.printfln(F(" Bus protocol: %s"), EMSbus::is_ht3() ? F("HT3") : F("Buderus")); - shell.printfln(F(" #recognized EMS devices: %d"), (EMSESP::emsdevices).size()); + shell.printfln(F(" #recognized EMS devices: %d"), EMSESP::emsdevices.size()); shell.printfln(F(" #telegrams received: %d"), rxservice_.telegram_count()); shell.printfln(F(" #read requests sent: %d"), txservice_.telegram_read_count()); shell.printfln(F(" #write requests sent: %d"), txservice_.telegram_write_count()); @@ -366,7 +359,7 @@ void EMSESP::show_device_values(uuid::console::Shell & shell) { // do this in the order of factory classes to keep a consistent order when displaying for (const auto & device_class : EMSFactory::device_handlers()) { for (const auto & emsdevice : emsdevices) { - if ((emsdevice) && (emsdevice->device_type() == device_class.first)) { + if (emsdevice && (emsdevice->device_type() == device_class.first)) { // print header shell.printfln(F("%s: %s (%d)"), emsdevice->device_type_name().c_str(), emsdevice->to_string().c_str(), emsdevice->count_entities()); @@ -388,7 +381,7 @@ void EMSESP::show_device_values(uuid::console::Shell & shell) { shell.print(data.as()); } else if (data.is()) { char s[10]; - shell.print(Helpers::render_value(s, (float)data.as(), 1)); + shell.print(Helpers::render_value(s, data.as(), 1)); } else if (data.is()) { shell.print(data.as() ? F_(on) : F_(off)); } @@ -458,8 +451,8 @@ void EMSESP::show_sensor_values(uuid::console::Shell & shell) { sensor.offset()); break; default: - case AnalogSensor::AnalogType::DIGITAL_IN: - case AnalogSensor::AnalogType::COUNTER: + // case AnalogSensor::AnalogType::DIGITAL_IN: + // case AnalogSensor::AnalogType::COUNTER: shell.printfln(F(" %s: %s%d%s (Type: %s)"), sensor.name().c_str(), COLOR_BRIGHT_GREEN, @@ -680,7 +673,7 @@ void EMSESP::publish_response(std::shared_ptr telegram) { doc["dest"] = Helpers::hextoa(buffer, telegram->dest); doc["type"] = Helpers::hextoa(buffer, telegram->type_id); doc["offset"] = Helpers::hextoa(buffer, telegram->offset); - strcpy(buffer, Helpers::data_to_hex(telegram->message_data, telegram->message_length).c_str()); // telegram is without crc + strlcpy(buffer, Helpers::data_to_hex(telegram->message_data, telegram->message_length).c_str(), sizeof(buffer)); // telegram is without crc doc["data"] = buffer; if (telegram->message_length <= 4) { @@ -928,31 +921,29 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { bool found = false; bool knowndevice = false; for (const auto & emsdevice : emsdevices) { - if (emsdevice) { - if (emsdevice->is_device_id(telegram->src) || emsdevice->is_device_id(telegram->dest)) { - knowndevice = true; - found = emsdevice->handle_telegram(telegram); - if (found && emsdevice->is_device_id(telegram->dest)) { - LOG_DEBUG(F("Process setting 0x%02X for device 0x%02X"), telegram->type_id, telegram->dest); - } - // if we correctly processed the telegram then follow up with sending it via MQTT (if enabled) - if (found && Mqtt::connected()) { - if ((mqtt_.get_publish_onchange(emsdevice->device_type()) && emsdevice->has_update()) - || (telegram->type_id == publish_id_ && telegram->dest == txservice_.ems_bus_id())) { - if (telegram->type_id == publish_id_) { - publish_id_ = 0; - } - emsdevice->has_update(false); // reset flag - if (!Mqtt::publish_single()) { - publish_device_values(emsdevice->device_type()); // publish to MQTT if we explicitly have too - } + if (emsdevice->is_device_id(telegram->src) || emsdevice->is_device_id(telegram->dest)) { + knowndevice = true; + found = emsdevice->handle_telegram(telegram); + if (found && emsdevice->is_device_id(telegram->dest)) { + LOG_DEBUG(F("Process setting 0x%02X for device 0x%02X"), telegram->type_id, telegram->dest); + } + // if we correctly processed the telegram then follow up with sending it via MQTT (if enabled) + if (found && Mqtt::connected()) { + if ((mqtt_.get_publish_onchange(emsdevice->device_type()) && emsdevice->has_update()) + || (telegram->type_id == publish_id_ && telegram->dest == txservice_.ems_bus_id())) { + if (telegram->type_id == publish_id_) { + publish_id_ = 0; + } + emsdevice->has_update(false); // reset flag + if (!Mqtt::publish_single()) { + publish_device_values(emsdevice->device_type()); // publish to MQTT if we explicitly have too } } - if (wait_validate_ == telegram->type_id) { - wait_validate_ = 0; - } - break; } + if (wait_validate_ == telegram->type_id) { + wait_validate_ = 0; + } + break; } } @@ -972,10 +963,8 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { // return true if we have this device already registered bool EMSESP::device_exists(const uint8_t device_id) { for (const auto & emsdevice : emsdevices) { - if (emsdevice) { - if (emsdevice->is_device_id(device_id)) { - return true; - } + if (emsdevice && emsdevice->is_device_id(device_id)) { + return true; } } @@ -996,7 +985,7 @@ void EMSESP::show_devices(uuid::console::Shell & shell) { // count the number of thermostats uint8_t num_thermostats = 0; for (const auto & emsdevice : emsdevices) { - if ((emsdevice) && (emsdevice->device_type() == DeviceType::THERMOSTAT)) { + if (emsdevice && (emsdevice->device_type() == DeviceType::THERMOSTAT)) { num_thermostats++; } } @@ -1005,7 +994,7 @@ void EMSESP::show_devices(uuid::console::Shell & shell) { // so we keep a consistent order for (const auto & device_class : EMSFactory::device_handlers()) { for (const auto & emsdevice : emsdevices) { - if ((emsdevice) && (emsdevice->device_type() == device_class.first)) { + if (emsdevice && (emsdevice->device_type() == device_class.first)) { shell.printf(F("%s: %s"), emsdevice->device_type_name().c_str(), emsdevice->to_string().c_str()); if ((num_thermostats > 1) && (emsdevice->device_type() == EMSdevice::DeviceType::THERMOSTAT) && (emsdevice->device_id() == actual_master_thermostat())) { @@ -1033,25 +1022,23 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const // first check to see if we already have it, if so update the record for (const auto & emsdevice : emsdevices) { - if (emsdevice) { - if (emsdevice->is_device_id(device_id)) { - LOG_DEBUG(F("Updating details for already active deviceID 0x%02X"), device_id); - emsdevice->product_id(product_id); - emsdevice->version(version); - // only set brand if it doesn't already exist - if (emsdevice->brand() == EMSdevice::Brand::NO_BRAND) { - emsdevice->brand(brand); - } - // find the name and flags in our database - for (const auto & device : device_library_) { - if (device.product_id == product_id && device.device_type == emsdevice->device_type()) { - emsdevice->name(std::move(read_flash_string(device.name))); - emsdevice->add_flags(device.flags); - } - } - - return true; // finish up + if (emsdevice && emsdevice->is_device_id(device_id)) { + LOG_DEBUG(F("Updating details for already active deviceID 0x%02X"), device_id); + emsdevice->product_id(product_id); + emsdevice->version(version); + // only set brand if it doesn't already exist + if (emsdevice->brand() == EMSdevice::Brand::NO_BRAND) { + emsdevice->brand(brand); } + // find the name and flags in our database + for (const auto & device : device_library_) { + if (device.product_id == product_id && device.device_type == emsdevice->device_type()) { + emsdevice->name(std::move(read_flash_string(device.name))); + emsdevice->add_flags(device.flags); + } + } + + return true; // finish up } } @@ -1187,7 +1174,7 @@ bool EMSESP::command_entities(uint8_t device_type, JsonObject & output, const in JsonObject node; for (const auto & emsdevice : emsdevices) { - if ((emsdevice) && (emsdevice->device_type() == device_type)) { + if (emsdevice && (emsdevice->device_type() == device_type)) { emsdevice->list_device_entries(output); return true; } @@ -1302,11 +1289,10 @@ void EMSESP::incoming_telegram(uint8_t * data, const uint8_t length) { txservice_.send_poll(); // close the bus txservice_.reset_retry_count(); tx_successful = true; + // if telegram is longer read next part with offset +25 for ems+ or +27 for ems1.0 - if (length == 32) { - if (txservice_.read_next_tx(data[3]) == read_id_) { - read_next_ = true; - } + if ((length == 32) && (txservice_.read_next_tx(data[3]) == read_id_)) { + read_next_ = true; } } } @@ -1430,7 +1416,7 @@ void EMSESP::scheduled_fetch_values() { if (txservice_.tx_queue_empty()) { uint8_t i = 0; for (const auto & emsdevice : emsdevices) { - if (emsdevice && ++i >= no) { + if (++i >= no) { emsdevice->fetch_values(); no++; return; diff --git a/src/helpers.cpp b/src/helpers.cpp index 108b5783f..d89facaad 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -65,8 +65,8 @@ std::string Helpers::hextoa(const uint16_t value, bool prefix) { #ifdef EMSESP_STANDALONE // special function to work outside of ESP's libraries char * Helpers::ultostr(char * ptr, uint32_t value, const uint8_t base) { - if (NULL == ptr) { - return NULL; + if (nullptr == ptr) { + return nullptr; } unsigned long t = 0; @@ -192,7 +192,7 @@ char * Helpers::render_boolean(char * result, bool value) { // render for native char strings char * Helpers::render_value(char * result, const char * value, const int8_t format __attribute__((unused))) { - strcpy(result, value); + strlcpy(result, value, sizeof(result)); return result; } @@ -257,8 +257,8 @@ char * Helpers::render_value(char * result, const float value, const int8_t form uint32_t p[] = {0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000}; - char * ret = result; - int32_t whole = (int32_t)value; + char * ret = result; + auto whole = (int32_t)value; itoa(whole, result, 10); @@ -357,12 +357,11 @@ char * Helpers::render_value(char * result, const uint32_t value, const int8_t f } else { strlcpy(result, ltoa(new_value * format * -1, s, 10), sizeof(s)); } - #else if (!format) { strlcpy(result, ultostr(s, new_value, 10), sizeof(s)); // format is 0 } else { - strncpy(result, ultostr(s, new_value / format, 10), sizeof(s)); + strlcpy(result, ultostr(s, new_value / format, 10), sizeof(s)); strlcat(result, ".", sizeof(s)); strncat(result, ultostr(s, new_value % format, 10), sizeof(s)); } @@ -482,7 +481,7 @@ bool Helpers::hasValue(const int8_t & v) { return (v != EMS_VALUE_INT_NOTSET); } -bool Helpers::hasValue(char * v) { +bool Helpers::hasValue(const char * v) { if ((v == nullptr) || (strlen(v) == 0)) { return false; } @@ -509,7 +508,8 @@ bool Helpers::value2number(const char * v, int & value, const int min, const int value = 0; return false; } - value = atoi((char *)v); + + value = atoi(v); if (value >= min && value <= max) { return true; } @@ -522,12 +522,14 @@ bool Helpers::value2float(const char * v, float & value) { if ((v == nullptr) || (strlen(v) == 0)) { return false; } + if (v[0] == '-' || v[0] == '.' || (v[0] >= '0' && v[0] <= '9')) { - value = atof((char *)v); + value = atof(v); return true; } + if (v[0] == '+' && (v[1] == '.' || (v[1] >= '0' && v[1] <= '9'))) { - value = atof((char *)(v + 1)); + value = atof(v + 1); return true; } return false; diff --git a/src/helpers.h b/src/helpers.h index f7ab36ada..2aa33ae68 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -63,7 +63,7 @@ class Helpers { static bool hasValue(const int16_t & v); static bool hasValue(const uint16_t & v); static bool hasValue(const uint32_t & v); - static bool hasValue(char * v); + static bool hasValue(const char * v); static bool value2number(const char * v, int & value, const int min = -2147483648, const int max = 2147483647); static bool value2float(const char * v, float & value); diff --git a/src/locale_DE.h b/src/locale_DE.h index 26114d001..8f9108c65 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -382,7 +382,18 @@ MAKE_PSTR_LIST(enum_j_control, F_(off), F("fb10"), F("fb110")) MAKE_PSTR_LIST(enum_wwProgMode, F("std Prog"), F_(own_prog)) MAKE_PSTR_LIST(enum_dayOfWeek, F("Mo"), F("Di"), F("Mi"), F("Do"), F("Fr"), F("Sa"), F("So"), F("Alle")) MAKE_PSTR_LIST(enum_progMode, F("Prog_1"), F("Prog_2")) -MAKE_PSTR_LIST(enum_progMode2, F("Eigen_1"), F("Familie"), F("Morgends"), F("Abends"), F("Vormittag"), F("Nachmittag"), F("Mittag"), F("Singles"), F("Senioren"), F("Neu"), F("Eigen_2")) +MAKE_PSTR_LIST(enum_progMode2, + F("Eigen_1"), + F("Familie"), + F("Morgends"), + F("Abends"), + F("Vormittag"), + F("Nachmittag"), + F("Mittag"), + F("Singles"), + F("Senioren"), + F("Neu"), + F("Eigen_2")) MAKE_PSTR_LIST(enum_progMode3, F("Familie"), F("Morgends"), F("Abends"), F("Vormittag"), F("Nachmittag"), F("Mittag"), F("Singles"), F("Senioren")) MAKE_PSTR_LIST(enum_progMode4, F("prog_a"), F("prog_b"), F("prog_c"), F("prog_d"), F("prog_e"), F("prog_f")) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 6e1cd21ee..bfdd28407 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -244,14 +244,16 @@ void Mqtt::show_mqtt(uuid::console::Shell & shell) { #if defined(EMSESP_DEBUG) // simulate receiving a MQTT message, used only for testing void Mqtt::incoming(const char * topic, const char * payload) { - on_message(topic, payload, strlen(payload)); + if (payload != nullptr) { + on_message(topic, payload, strlen(payload)); + } } #endif // received an MQTT message that we subscribed too // topic is the full path // payload is json or a single string and converted to a json with key 'value' -void Mqtt::on_message(const char * topic, const char * payload, size_t len) { +void Mqtt::on_message(const char * topic, const char * payload, size_t len) const { // sometimes the payload is not terminated correctly, so make a copy // convert payload to a null-terminated char string char message[len + 2]; @@ -280,16 +282,14 @@ void Mqtt::on_message(const char * topic, const char * payload, size_t len) { // add the base back char full_topic[MQTT_TOPIC_MAX_SIZE]; snprintf(full_topic, sizeof(full_topic), "%s/%s", mqtt_base_.c_str(), mf.topic_.c_str()); - if (!strcmp(topic, full_topic)) { - if (mf.mqtt_subfunction_) { - if (!(mf.mqtt_subfunction_)(message)) { - LOG_ERROR(F("error: invalid payload %s for this topic %s"), message, topic); - if (send_response_) { - Mqtt::publish(F_(response), "error: invalid data"); - } + if ((!strcmp(topic, full_topic)) && (mf.mqtt_subfunction_)) { + if (!(mf.mqtt_subfunction_)(message)) { + LOG_ERROR(F("error: invalid payload %s for this topic %s"), message, topic); + if (send_response_) { + Mqtt::publish(F_(response), "error: invalid data"); } - return; } + return; } } @@ -353,7 +353,7 @@ void Mqtt::show_topic_handlers(uuid::console::Shell & shell, const uint8_t devic // its a poor man's QOS we assume the ACK represents the last Publish sent // check if ACK matches the last Publish we sent, if not report an error. Only if qos is 1 or 2 // and always remove from queue -void Mqtt::on_publish(uint16_t packetId) { +void Mqtt::on_publish(uint16_t packetId) const { // find the MQTT message in the queue and remove it if (mqtt_messages_.empty()) { #if defined(EMSESP_DEBUG) @@ -462,7 +462,7 @@ void Mqtt::start() { snprintf(will_topic, MQTT_TOPIC_MAX_SIZE, "%s/status", mqtt_base_.c_str()); mqttClient_->setWill(will_topic, 1, true, "offline"); // with qos 1, retain true - mqttClient_->onMessage([this](char * topic, char * payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { + mqttClient_->onMessage([this](const char * topic, const char * payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { on_message(topic, payload, len); // receiving mqtt }); @@ -804,7 +804,7 @@ void Mqtt::process_queue() { char topic[MQTT_TOPIC_MAX_SIZE]; if (message->topic.find(discovery_prefix_) == 0) { - strcpy(topic, message->topic.c_str()); // leave topic as it is + strlcpy(topic, message->topic.c_str(), sizeof(topic)); // leave topic as it is } else { snprintf(topic, MQTT_TOPIC_MAX_SIZE, "%s/%s", mqtt_base_.c_str(), message->topic.c_str()); } diff --git a/src/mqtt.h b/src/mqtt.h index ebe8bac78..712f65233 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -30,7 +30,7 @@ using uuid::console::Shell; // size of queue -#define MAX_MQTT_MESSAGES 300 +static constexpr uint16_t MAX_MQTT_MESSAGES = 300; namespace emsesp { @@ -208,11 +208,11 @@ class Mqtt { send_response_ = send_response; } - void set_qos(uint8_t mqtt_qos) { + void set_qos(uint8_t mqtt_qos) const { mqtt_qos_ = mqtt_qos; } - void set_retain(bool mqtt_retain) { + void set_retain(bool mqtt_retain) const { mqtt_retain_ = mqtt_retain; } @@ -225,15 +225,13 @@ class Mqtt { struct QueuedMqttMessage { const uint32_t id_; const std::shared_ptr content_; - uint8_t retry_count_; - uint16_t packet_id_; + uint8_t retry_count_ = 0; + uint16_t packet_id_ = 0; ~QueuedMqttMessage() = default; QueuedMqttMessage(uint32_t id, std::shared_ptr && content) : id_(id) , content_(std::move(content)) { - retry_count_ = 0; - packet_id_ = 0; } }; static std::deque mqtt_messages_; @@ -253,8 +251,8 @@ class Mqtt { static std::shared_ptr queue_subscribe_message(const std::string & topic); static std::shared_ptr queue_unsubscribe_message(const std::string & topic); - void on_publish(uint16_t packetId); - void on_message(const char * topic, const char * payload, size_t len); + void on_publish(uint16_t packetId) const; + void on_message(const char * topic, const char * payload, size_t len) const; void process_queue(); // function handlers for MQTT subscriptions diff --git a/src/shower.cpp b/src/shower.cpp index 0d4af6718..f9c8a2e8e 100644 --- a/src/shower.cpp +++ b/src/shower.cpp @@ -65,12 +65,12 @@ void Shower::loop() { } } else { // hot water is off // if it just turned off, record the time as it could be a short pause - if ((timer_start_) && (timer_pause_ == 0)) { + if (timer_start_ && (timer_pause_ == 0)) { timer_pause_ = time_now; } // if shower has been off for longer than the wait time - if ((timer_pause_) && ((time_now - timer_pause_) > SHOWER_PAUSE_TIME)) { + if (timer_pause_ && ((time_now - timer_pause_) > SHOWER_PAUSE_TIME)) { // it is over the wait period, so assume that the shower has finished and calculate the total time and publish // because its unsigned long, can't have negative so check if length is less than OFFSET_TIME if ((timer_pause_ - timer_start_) > SHOWER_OFFSET_TIME) { @@ -121,7 +121,7 @@ void Shower::shower_alert_start() { // Publish to the shower_data topic // showing whether the shower timer and alert are enabled or disabled // and the duration of the last shower -void Shower::publish_shower_data() { +void Shower::publish_shower_data() const { StaticJsonDocument doc; if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { diff --git a/src/shower.h b/src/shower.h index a9705923c..dc9dafda4 100644 --- a/src/shower.h +++ b/src/shower.h @@ -55,7 +55,7 @@ class Shower { static constexpr uint32_t SHOWER_COLDSHOT_DURATION = 10000; // 10 seconds for cold water before turning back hot water static constexpr uint32_t SHOWER_MAX_DURATION = 420000; // in ms. 7 minutes, before trigger a shot of cold water - void publish_shower_data(); + void publish_shower_data() const; void shower_alert_start(); void shower_alert_stop(); diff --git a/src/system.cpp b/src/system.cpp index 80a66086b..9ac897566 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -484,7 +484,7 @@ bool System::upload_status() { void System::upload_status(bool in_progress) { // if we've just started an upload - if ((!upload_status_) && (in_progress)) { + if (!upload_status_ && in_progress) { EMSuart::stop(); } upload_status_ = in_progress; @@ -615,7 +615,7 @@ void System::network_init(bool refresh) { // ETH_CLOCK_GPIO0_OUT = 1 RMII clock output from GPIO0 // ETH_CLOCK_GPIO16_OUT = 2 RMII clock output from GPIO16 // ETH_CLOCK_GPIO17_OUT = 3 RMII clock output from GPIO17, for 50hz inverted clock - eth_clock_mode_t clock_mode = (eth_clock_mode_t)eth_clock_mode_; + auto clock_mode = (eth_clock_mode_t)eth_clock_mode_; ETH.begin(phy_addr, power, mdc, mdio, type, clock_mode); } @@ -1182,7 +1182,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp JsonArray devices = output.createNestedArray("Devices"); for (const auto & device_class : EMSFactory::device_handlers()) { for (const auto & emsdevice : EMSESP::emsdevices) { - if ((emsdevice) && (emsdevice->device_type() == device_class.first)) { + if (emsdevice && (emsdevice->device_type() == device_class.first)) { JsonObject obj = devices.createNestedObject(); obj["type"] = emsdevice->device_type_name(); // obj["name"] = emsdevice->to_string(); diff --git a/src/telegram.cpp b/src/telegram.cpp index 59c0921b8..6e2ae85f2 100644 --- a/src/telegram.cpp +++ b/src/telegram.cpp @@ -264,7 +264,7 @@ void TxService::start() { } // sends a 1 byte poll which is our own deviceID -void TxService::send_poll() { +void TxService::send_poll() const { //LOG_DEBUG(F("Ack %02X"),ems_bus_id() ^ ems_mask()); if (tx_mode()) { EMSuart::send_poll(ems_bus_id() ^ ems_mask()); @@ -574,7 +574,7 @@ void TxService::send_raw(const char * telegram_data) { while (p != 0) { if ((p = strtok(nullptr, " ,"))) { strlcpy(value, p, sizeof(value)); - uint8_t val = (uint8_t)strtol(value, 0, 16); + auto val = (uint8_t)strtol(value, 0, 16); data[++count] = val; } } diff --git a/src/telegram.h b/src/telegram.h index e75f53008..31e03167d 100644 --- a/src/telegram.h +++ b/src/telegram.h @@ -87,11 +87,12 @@ class Telegram { // reads a bit value from a given telegram position bool read_bitvalue(uint8_t & value, const uint8_t index, const uint8_t bit) const { uint8_t abs_index = (index - this->offset); - if (abs_index >= this->message_length) { + if ((abs_index >= this->message_length) || (abs_index > EMS_MAX_TELEGRAM_MESSAGE_LENGTH)) { return false; // out of bounds } + uint8_t val = value; - value = (uint8_t)(((this->message_data[abs_index]) >> (bit)) & 0x01); + value = (uint8_t)(((this->message_data[abs_index]) >> bit) & 0x01); return (val != value); } @@ -105,14 +106,17 @@ class Telegram { bool read_value(Value & value, const uint8_t index, uint8_t s = 0) const { uint8_t num_bytes = (!s) ? sizeof(Value) : s; // check for out of bounds, if so don't modify the value - if ((index < this->offset) || ((index - this->offset + num_bytes - 1) >= this->message_length)) { + auto msg_size = (index - this->offset + num_bytes - 1); + if ((index < this->offset) || (msg_size >= this->message_length) || (msg_size > EMS_MAX_TELEGRAM_MESSAGE_LENGTH)) { return false; } - auto val = value; - value = 0; + + Value val = value; + value = 0; for (uint8_t i = 0; i < num_bytes; i++) { value = (value << 8) + this->message_data[index - this->offset + i]; // shift by byte } + return (val != value); } @@ -120,6 +124,7 @@ class Telegram { if ((index < this->offset) || ((index - this->offset) >= this->message_length)) { return false; } + uint8_t val = value; value = this->message_data[index - this->offset] - start; return (val != value); @@ -300,7 +305,7 @@ class TxService : public EMSbus { void add(const uint8_t operation, const uint8_t * data, const uint8_t length, const uint16_t validateid, const bool front = false); void read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset = 0, const uint8_t length = 0); void send_raw(const char * telegram_data); - void send_poll(); + void send_poll() const; void retry_tx(const uint8_t operation, const uint8_t * data, const uint8_t length); bool is_last_tx(const uint8_t src, const uint8_t dest) const; uint16_t post_send_query(); @@ -318,7 +323,7 @@ class TxService : public EMSbus { telegram_last_post_send_query_ = type_id; } - uint16_t get_post_send_query() { + uint16_t get_post_send_query() const { return telegram_last_post_send_query_; } @@ -362,14 +367,14 @@ class TxService : public EMSbus { if (telegram_read_fail_count_ == 0) { return 100; // all good, 100% } - return (100 - (uint8_t)((telegram_read_fail_count_ * 100 / (telegram_read_fail_count_ + telegram_read_count_)))); + return (100 - (uint8_t)(telegram_read_fail_count_ * 100 / (telegram_read_fail_count_ + telegram_read_count_))); } uint8_t write_quality() const { if (telegram_write_fail_count_ == 0) { return 100; // all good, 100% } - return (100 - (uint8_t)((telegram_write_fail_count_ * 100 / (telegram_write_fail_count_ + telegram_write_count_)))); + return (100 - (uint8_t)(telegram_write_fail_count_ * 100 / (telegram_write_fail_count_ + telegram_write_count_))); } void increment_telegram_read_fail_count() { @@ -399,7 +404,7 @@ class TxService : public EMSbus { return tx_telegrams_; } - bool tx_queue_empty() { + bool tx_queue_empty() const { return tx_telegrams_.size() == 0; } diff --git a/src/test/test.cpp b/src/test/test.cpp index 70d32ce92..a9ec54c4f 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -804,28 +804,28 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const // test command parse int8_t id_n; - const char * cmd; + const char * ncmd; char command_s[100]; id_n = -1; - strcpy(command_s, "hc2/seltemp"); - cmd = Command::parse_command_string(command_s, id_n); - shell.printfln("test cmd parse cmd=%s id=%d", cmd, id_n); + strlcpy(command_s, "hc2/seltemp", sizeof(command_s)); + ncmd = Command::parse_command_string(command_s, id_n); + shell.printfln("test cmd parse cmd=%s id=%d", ncmd, id_n); id_n = -1; - strcpy(command_s, "seltemp"); - cmd = Command::parse_command_string(command_s, id_n); - shell.printfln("test cmd parse cmd=%s id=%d", cmd, id_n); + strlcpy(command_s, "seltemp", sizeof(command_s)); + ncmd = Command::parse_command_string(command_s, id_n); + shell.printfln("test cmd parse cmd=%s id=%d", ncmd, id_n); id_n = -1; - strcpy(command_s, "xyz/seltemp"); - cmd = Command::parse_command_string(command_s, id_n); - shell.printfln("test cmd parse cmd=%s id=%d", cmd, id_n); + strlcpy(command_s, "xyz/seltemp", sizeof(command_s)); + ncmd = Command::parse_command_string(command_s, id_n); + shell.printfln("test cmd parse cmd=%s id=%d", ncmd, id_n); id_n = -1; - strcpy(command_s, "wwc4/seltemp"); - cmd = Command::parse_command_string(command_s, id_n); - shell.printfln("test cmd parse cmd=%s id=%d", cmd, id_n); + strlcpy(command_s, "wwc4/seltemp", sizeof(command_s)); + ncmd = Command::parse_command_string(command_s, id_n); + shell.printfln("test cmd parse cmd=%s id=%d", ncmd, id_n); id_n = -1; - strcpy(command_s, "hc3_seltemp"); - cmd = Command::parse_command_string(command_s, id_n); - shell.printfln("test cmd parse cmd=%s id=%d", cmd, id_n); + strlcpy(command_s, "hc3_seltemp", sizeof(command_s)); + ncmd = Command::parse_command_string(command_s, id_n); + shell.printfln("test cmd parse cmd=%s id=%d", ncmd, id_n); #endif @@ -1335,12 +1335,12 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const char system_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; Mqtt::show_mqtt(shell); // show queue - strcpy(boiler_topic, "ems-esp/boiler"); - strcpy(thermostat_topic, "ems-esp/thermostat"); - strcpy(system_topic, "ems-esp/system"); + strlcpy(boiler_topic, "ems-esp/boiler", sizeof(boiler_topic)); + strlcpy(thermostat_topic, "ems-esp/thermostat", sizeof(thermostat_topic)); + strlcpy(system_topic, "ems-esp/system", sizeof(system_topic)); // test publishing - EMSESP::EMSESP::mqtt_.publish(boiler_topic, "test me"); + EMSESP::mqtt_.publish(boiler_topic, "test me"); // test receiving EMSESP::mqtt_.incoming(boiler_topic, ""); // test if ignore empty payloads, should return values diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index ab4c0d202..f7de6d90d 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -63,10 +63,10 @@ void WebAPIService::webAPIService_post(AsyncWebServerRequest * request, JsonVari // reporting back any errors void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) { // check if the user has admin privileges (token is included and authorized) - bool is_admin; + bool is_admin = false; EMSESP::webSettingsService.read([&](WebSettings & settings) { Authentication authentication = _securityManager->authenticateRequest(request); - is_admin = settings.notoken_api | AuthenticationPredicates::IS_ADMIN(authentication); + is_admin = settings.notoken_api || AuthenticationPredicates::IS_ADMIN(authentication); }); // check for query parameters first, the old style from v2 @@ -97,8 +97,8 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) { } // output json buffer - PrettyAsyncJsonResponse * response = new PrettyAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXLARGE_DYN); - JsonObject output = response->getRoot(); + auto * response = new PrettyAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXLARGE_DYN); + JsonObject output = response->getRoot(); // call command uint8_t return_code = Command::process(request->url().c_str(), is_admin, input, output); diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 08a11e778..aa3e5c2c7 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -99,10 +99,10 @@ StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & if (root["sensors"].is()) { for (const JsonObject sensorJson : root["sensors"].as()) { // create each of the sensor, overwritting any previous settings - SensorCustomization sensor = SensorCustomization(); - sensor.id_str = sensorJson["id_str"].as(); - sensor.name = sensorJson["name"].as(); - sensor.offset = sensorJson["offset"]; + auto sensor = SensorCustomization(); + sensor.id_str = sensorJson["id_str"].as(); + sensor.name = sensorJson["name"].as(); + sensor.offset = sensorJson["offset"]; settings.sensorCustomizations.push_back(sensor); // add to list } } @@ -112,13 +112,13 @@ StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & if (root["analogs"].is()) { for (const JsonObject analogJson : root["analogs"].as()) { // create each of the sensor, overwritting any previous settings - AnalogCustomization sensor = AnalogCustomization(); - sensor.id = analogJson["id"]; - sensor.name = analogJson["name"].as(); - sensor.offset = analogJson["offset"]; - sensor.factor = analogJson["factor"]; - sensor.uom = analogJson["uom"]; - sensor.type = analogJson["type"]; + auto sensor = AnalogCustomization(); + sensor.id = analogJson["id"]; + sensor.name = analogJson["name"].as(); + sensor.offset = analogJson["offset"]; + sensor.factor = analogJson["factor"]; + sensor.uom = analogJson["uom"]; + sensor.type = analogJson["type"]; settings.analogCustomizations.push_back(sensor); // add to list } } @@ -127,9 +127,9 @@ StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & settings.entityCustomizations.clear(); if (root["exclude_entities"].is()) { for (const JsonObject exclude_entities : root["exclude_entities"].as()) { - EntityCustomization new_entry = EntityCustomization(); - new_entry.product_id = exclude_entities["product_id"]; - new_entry.device_id = exclude_entities["device_id"]; + auto new_entry = EntityCustomization(); + new_entry.product_id = exclude_entities["product_id"]; + new_entry.device_id = exclude_entities["device_id"]; for (const JsonVariant exclude_entity_id : exclude_entities["entity_ids"].as()) { new_entry.entity_ids.push_back(exclude_entity_id.as()); // add entity list @@ -158,8 +158,8 @@ void WebCustomizationService::reset_customization(AsyncWebServerRequest * reques // send back a short list devices used in the customization page void WebCustomizationService::devices(AsyncWebServerRequest * request) { - AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN); - JsonObject root = response->getRoot(); + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN); + JsonObject root = response->getRoot(); JsonArray devices = root.createNestedArray("devices"); for (auto & emsdevice : EMSESP::emsdevices) { @@ -185,18 +185,16 @@ void WebCustomizationService::devices(AsyncWebServerRequest * request) { // send back list device entities void WebCustomizationService::device_entities(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { - MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(true, EMSESP_JSON_SIZE_XXLARGE_DYN); + auto * response = new MsgpackAsyncJsonResponse(true, EMSESP_JSON_SIZE_XXLARGE_DYN); for (const auto & emsdevice : EMSESP::emsdevices) { - if (emsdevice) { - if (emsdevice->unique_id() == json["id"]) { + if (emsdevice->unique_id() == json["id"]) { #ifndef EMSESP_STANDALONE - JsonArray output = response->getRoot(); - emsdevice->generate_values_web_all(output); + JsonArray output = response->getRoot(); + emsdevice->generate_values_web_all(output); #endif - response->setLength(); - request->send(response); - return; - } + response->setLength(); + request->send(response); + return; } } } diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 85989b9c7..7e8a34fde 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -70,8 +70,8 @@ void WebDataService::scan_devices(AsyncWebServerRequest * request) { // this is used in the dashboard and contains all ems device information // /coreData endpoint void WebDataService::core_data(AsyncWebServerRequest * request) { - AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); - JsonObject root = response->getRoot(); + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); + JsonObject root = response->getRoot(); // list is already sorted by device type // Ignore Contoller @@ -102,8 +102,8 @@ void WebDataService::core_data(AsyncWebServerRequest * request) { // /sensorData endpoint // the "sensors" and "analogs" are arrays and must exist void WebDataService::sensor_data(AsyncWebServerRequest * request) { - AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); - JsonObject root = response->getRoot(); + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); + JsonObject root = response->getRoot(); // dallas sensors JsonArray sensors = root.createNestedArray("sensors"); @@ -158,23 +158,21 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) { // Compresses the JSON using MsgPack https://msgpack.org/index.html void WebDataService::device_data(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { - MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXXLARGE_DYN); + auto * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_XXXLARGE_DYN); for (const auto & emsdevice : EMSESP::emsdevices) { - if (emsdevice) { - if (emsdevice->unique_id() == json["id"]) { - // wait max 2.5 sec for updated data (post_send_delay is 2 sec) - for (uint16_t i = 0; i < (emsesp::TxService::POST_SEND_DELAY + 500) && EMSESP::wait_validate(); i++) { - delay(1); - } - EMSESP::wait_validate(0); // reset in case of timeout -#ifndef EMSESP_STANDALONE - JsonObject output = response->getRoot(); - emsdevice->generate_values_web(output); -#endif - response->setLength(); - request->send(response); - return; + if (emsdevice->unique_id() == json["id"]) { + // wait max 2.5 sec for updated data (post_send_delay is 2 sec) + for (uint16_t i = 0; i < (emsesp::TxService::POST_SEND_DELAY + 500) && EMSESP::wait_validate(); i++) { + delay(1); } + EMSESP::wait_validate(0); // reset in case of timeout +#ifndef EMSESP_STANDALONE + JsonObject output = response->getRoot(); + emsdevice->generate_values_web(output); +#endif + response->setLength(); + request->send(response); + return; } } } @@ -195,46 +193,44 @@ void WebDataService::write_value(AsyncWebServerRequest * request, JsonVariant & // using the unique ID from the web find the real device type // id is the selected device for (const auto & emsdevice : EMSESP::emsdevices) { - if (emsdevice) { - if (emsdevice->unique_id() == unique_id) { - // parse the command as it could have a hc or wwc prefixed, e.g. hc2/seltemp - const char * cmd = dv["c"]; // the command - int8_t id = -1; // default - cmd = Command::parse_command_string(cmd, id); // extract hc or wwc + if (emsdevice->unique_id() == unique_id) { + // parse the command as it could have a hc or wwc prefixed, e.g. hc2/seltemp + const char * cmd = dv["c"]; // the command + int8_t id = -1; // default + cmd = Command::parse_command_string(cmd, id); // extract hc or wwc - // create JSON for output - AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); - JsonObject output = response->getRoot(); + // create JSON for output + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); + JsonObject output = response->getRoot(); - // the data could be in any format, but we need string - // authenticated is always true - JsonVariant data = dv["v"]; // the value in any format - uint8_t return_code = CommandRet::OK; - uint8_t device_type = emsdevice->device_type(); - if (data.is()) { - return_code = Command::call(device_type, cmd, data.as(), true, id, output); - } else if (data.is()) { - char s[10]; - return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 0), true, id, output); - } else if (data.is()) { - char s[10]; - return_code = Command::call(device_type, cmd, Helpers::render_value(s, (float)data.as(), 1), true, id, output); - } else if (data.is()) { - return_code = Command::call(device_type, cmd, data.as() ? "true" : "false", true, id, output); - } - - // write debug - if (return_code != CommandRet::OK) { - EMSESP::logger().err(F("Write command failed %s (%s)"), (const char *)output["message"], Command::return_code_string(return_code).c_str()); - } else { - EMSESP::logger().debug(F("Write command successful")); - } - - response->setCode((return_code == CommandRet::OK) ? 200 : 204); - response->setLength(); - request->send(response); - return; + // the data could be in any format, but we need string + // authenticated is always true + JsonVariant data = dv["v"]; // the value in any format + uint8_t return_code = CommandRet::OK; + uint8_t device_type = emsdevice->device_type(); + if (data.is()) { + return_code = Command::call(device_type, cmd, data.as(), true, id, output); + } else if (data.is()) { + char s[10]; + return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 0), true, id, output); + } else if (data.is()) { + char s[10]; + return_code = Command::call(device_type, cmd, Helpers::render_value(s, (float)data.as(), 1), true, id, output); + } else if (data.is()) { + return_code = Command::call(device_type, cmd, data.as() ? "true" : "false", true, id, output); } + + // write debug + if (return_code != CommandRet::OK) { + EMSESP::logger().err(F("Write command failed %s (%s)"), (const char *)output["message"], Command::return_code_string(return_code).c_str()); + } else { + EMSESP::logger().debug(F("Write command successful")); + } + + response->setCode((return_code == CommandRet::OK) ? 200 : 204); + response->setLength(); + request->send(response); + return; } } } diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 133986d9d..725719f1a 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -90,7 +90,7 @@ void WebLogService::maximum_log_messages(size_t count) { "local"); } -bool WebLogService::compact() { +bool WebLogService::compact() const { return compact_; } @@ -158,7 +158,7 @@ void WebLogService::loop() { // convert time to real offset char * WebLogService::messagetime(char * out, const uint64_t t) { if (!time_offset_) { - strcpy(out, uuid::log::format_timestamp_ms(t, 3).c_str()); + strlcpy(out, uuid::log::format_timestamp_ms(t, 3).c_str(), sizeof(out)); } else { time_t t1 = time_offset_ + t / 1000ULL; strftime(out, 25, "%F %T", localtime(&t1)); @@ -169,9 +169,9 @@ char * WebLogService::messagetime(char * out, const uint64_t t) { // send to web eventsource void WebLogService::transmit(const QueuedLogMessage & message) { - DynamicJsonDocument jsonDocument = DynamicJsonDocument(EMSESP_JSON_SIZE_MEDIUM); - JsonObject logEvent = jsonDocument.to(); - char time_string[25]; + auto jsonDocument = DynamicJsonDocument(EMSESP_JSON_SIZE_MEDIUM); + JsonObject logEvent = jsonDocument.to(); + char time_string[25]; logEvent["t"] = messagetime(time_string, message.content_->uptime_ms); logEvent["l"] = message.content_->level; @@ -190,9 +190,9 @@ void WebLogService::transmit(const QueuedLogMessage & message) { // send the complete log buffer to the API, not filtering on log level void WebLogService::fetchLog(AsyncWebServerRequest * request) { - MsgpackAsyncJsonResponse * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN + 192 * log_messages_.size()); - JsonObject root = response->getRoot(); - JsonArray log = root.createNestedArray("events"); + auto * response = new MsgpackAsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN + 192 * log_messages_.size()); + JsonObject root = response->getRoot(); + JsonArray log = root.createNestedArray("events"); log_message_id_tail_ = log_messages_.back().id_; last_transmit_ = uuid::get_uptime_ms(); @@ -233,11 +233,11 @@ void WebLogService::setValues(AsyncWebServerRequest * request, JsonVariant & jso // return the current value settings after a GET void WebLogService::getValues(AsyncWebServerRequest * request) { - AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); - JsonObject root = response->getRoot(); - root["level"] = log_level(); - root["max_messages"] = maximum_log_messages(); - root["compact"] = compact(); + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); + JsonObject root = response->getRoot(); + root["level"] = log_level(); + root["max_messages"] = maximum_log_messages(); + root["compact"] = compact(); response->setLength(); request->send(response); } diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index 5e3ae234f..71ec42654 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -38,7 +38,7 @@ class WebLogService : public uuid::log::Handler { void log_level(uuid::log::Level level); size_t maximum_log_messages() const; void maximum_log_messages(size_t count); - bool compact(); + bool compact() const; void compact(bool compact); void loop(); diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index e2652fecb..a5d9ef98d 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -276,8 +276,8 @@ void WebSettingsService::save() { // build the json profile to send back void WebSettingsService::board_profile(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { - AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_MEDIUM); - JsonObject root = response->getRoot(); + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_MEDIUM); + JsonObject root = response->getRoot(); if (json.containsKey("board_profile")) { String board_profile = json["board_profile"]; diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 34be9a29b..8bd4b4f81 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -126,8 +126,8 @@ void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { } void WebStatusService::webStatusService(AsyncWebServerRequest * request) { - AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_MEDIUM_DYN); - JsonObject root = response->getRoot(); + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_MEDIUM_DYN); + JsonObject root = response->getRoot(); root["status"] = EMSESP::bus_status(); // 0, 1 or 2 root["num_devices"] = EMSESP::count_devices(); // excluding Controller @@ -163,7 +163,7 @@ void WebStatusService::webStatusService(AsyncWebServerRequest * request) { } // start the multicast UDP service so EMS-ESP is discoverable via .local -void WebStatusService::mDNS_start() { +void WebStatusService::mDNS_start() const { #ifndef EMSESP_STANDALONE if (!MDNS.begin(EMSESP::system_.hostname().c_str())) { EMSESP::logger().warning(F("Failed to start mDNS responder service")); diff --git a/src/web/WebStatusService.h b/src/web/WebStatusService.h index 332533ed9..938bcfa32 100644 --- a/src/web/WebStatusService.h +++ b/src/web/WebStatusService.h @@ -32,7 +32,7 @@ class WebStatusService { private: void webStatusService(AsyncWebServerRequest * request); void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); - void mDNS_start(); + void mDNS_start() const; }; } // namespace emsesp From 5f7f670517f42534e53474102127bb7a9840b36f Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Mar 2022 14:40:29 +0100 Subject: [PATCH 087/319] add GH action --- .github/workflows/sonar_check.yml | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflows/sonar_check.yml diff --git a/.github/workflows/sonar_check.yml b/.github/workflows/sonar_check.yml new file mode 100644 index 000000000..e06228a1d --- /dev/null +++ b/.github/workflows/sonar_check.yml @@ -0,0 +1,58 @@ +name: Sonar Check +on: + push: + branches: + - dev + pull_request: + types: [opened, synchronize, reopened] + schedule: # This trigger is here only to make sure + - cron: '17 0 * * SUN' # the example itself doesn't become stale +jobs: + build: + name: Build + runs-on: ubuntu-latest + env: + # https://binaries.sonarsource.com/?prefix=Distribution/sonar-scanner-cli/ + # SONAR_SCANNER_VERSION: 4.6.1.2450 + SONAR_SCANNER_VERSION: 4.7.0.2747 + SONAR_SERVER_URL: "https://sonarcloud.io" + BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Cache SonarCloud packages + uses: actions/cache@v1 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + - name: Download and set up sonar-scanner + env: + SONAR_SCANNER_DOWNLOAD_URL: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${{ env.SONAR_SCANNER_VERSION }}-linux.zip + run: | + mkdir -p $HOME/.sonar + curl -sSLo $HOME/.sonar/sonar-scanner.zip ${{ env.SONAR_SCANNER_DOWNLOAD_URL }} + unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/ + echo "$HOME/.sonar/sonar-scanner-${{ env.SONAR_SCANNER_VERSION }}-linux/bin" >> $GITHUB_PATH + - name: Download and set up build-wrapper + env: + BUILD_WRAPPER_DOWNLOAD_URL: ${{ env.SONAR_SERVER_URL }}/static/cpp/build-wrapper-linux-x86.zip + run: | + curl -sSLo $HOME/.sonar/build-wrapper-linux-x86.zip ${{ env.BUILD_WRAPPER_DOWNLOAD_URL }} + unzip -o $HOME/.sonar/build-wrapper-linux-x86.zip -d $HOME/.sonar/ + echo "$HOME/.sonar/build-wrapper-linux-x86" >> $GITHUB_PATH + - name: Run build-wrapper + run: | + make clean + build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} make clean all + - name: Run sonar-scanner + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: | + sonar-scanner From 10830dee3655da5f0084671d486406d3520ccb45 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Mar 2022 14:51:18 +0100 Subject: [PATCH 088/319] update build dir --- .github/workflows/sonar_check.yml | 4 +--- sonar-project.properties | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/sonar_check.yml b/.github/workflows/sonar_check.yml index e06228a1d..c0ea0e1bb 100644 --- a/.github/workflows/sonar_check.yml +++ b/.github/workflows/sonar_check.yml @@ -5,8 +5,6 @@ on: - dev pull_request: types: [opened, synchronize, reopened] - schedule: # This trigger is here only to make sure - - cron: '17 0 * * SUN' # the example itself doesn't become stale jobs: build: name: Build @@ -16,7 +14,7 @@ jobs: # SONAR_SCANNER_VERSION: 4.6.1.2450 SONAR_SCANNER_VERSION: 4.7.0.2747 SONAR_SERVER_URL: "https://sonarcloud.io" - BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed + BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory steps: - uses: actions/checkout@v2 with: diff --git a/sonar-project.properties b/sonar-project.properties index a0ce26c0b..cd8e24393 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.projectKey=emsesp_EMS-ESP32 sonar.projectName=EMS-ESP32 sonar.projectVersion=3.4 sonar.sources=./src -sonar.cfamily.build-wrapper-output=./sonar/build_wrapper_output_directory +sonar.cfamily.build-wrapper-output=build_wrapper_output_directory sonar.sourceEncoding=UTF-8 sonar.host.url=https://sonarcloud.io sonar.cfamily.threads=8 From d09e2237ee477f77bca9eff3f7b928edec574f42 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Mar 2022 16:21:00 +0100 Subject: [PATCH 089/319] sonar recommendations --- .gitignore | 1 + scripts/run_sonar.sh | 2 +- src/analogsensor.cpp | 10 +++--- src/command.cpp | 17 ++++------ src/command.h | 8 ++--- src/console.cpp | 4 +-- src/dallassensor.cpp | 6 ++-- src/dallassensor.h | 4 +-- src/devices/thermostat.cpp | 39 +++++------------------ src/emsdevice.cpp | 48 ++--------------------------- src/helpers.cpp | 4 +-- src/mqtt.cpp | 2 +- src/mqtt.h | 2 +- src/system.cpp | 6 ++-- src/system.h | 2 +- src/telegram.h | 6 ++-- src/web/WebAPIService.cpp | 2 +- src/web/WebCustomizationService.cpp | 2 +- src/web/WebDataService.cpp | 4 +-- src/web/WebLogService.cpp | 2 +- 20 files changed, 51 insertions(+), 120 deletions(-) diff --git a/.gitignore b/.gitignore index 2d76fc27d..ed0708caf 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ scripts/__pycache__ # sonar .scannerwork/ sonar/ +build_wrapper_output_directory/ diff --git a/scripts/run_sonar.sh b/scripts/run_sonar.sh index a667c6884..713fbaa9f 100755 --- a/scripts/run_sonar.sh +++ b/scripts/run_sonar.sh @@ -4,5 +4,5 @@ # export SONAR_TOKEN="" make clean -build-wrapper-linux-x86-64 --out-dir sonar/build_wrapper_output_directory make all +build-wrapper-linux-x86-64 --out-dir build_wrapper_output_directory make all sonar-scanner diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 9eeb66210..8c42fdd55 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -64,12 +64,11 @@ void AnalogSensor::reload() { // load the list of analog sensors from the customization service // and store them locally and then activate them EMSESP::webCustomizationService.read([&](WebCustomization & settings) { - auto sensors = settings.analogCustomizations; - auto it = sensors_.begin(); + auto it = sensors_.begin(); for (auto & sensor_ : sensors_) { // update existing sensors bool found = false; - for (auto & sensor : sensors) { //search customlist + for (const auto & sensor : settings.analogCustomizations) { //search customlist if (sensor_.id() == sensor.id) { // for output sensors set value to new start-value if ((sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) @@ -90,10 +89,11 @@ void AnalogSensor::reload() { } it++; } + // add new sensors from list - for (auto & sensor : sensors) { + for (const auto & sensor : settings.analogCustomizations) { bool found = false; - for (auto & sensor_ : sensors_) { + for (const auto & sensor_ : sensors_) { if (sensor_.id() == sensor.id) { found = true; } diff --git a/src/command.cpp b/src/command.cpp index 34358bbdc..75ee3ccc1 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -151,7 +151,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec return_code = Command::call(device_type, command_p, Helpers::itoa((int16_t)data.as(), data_str), is_admin, id_n, output); } else if (data.is()) { char data_str[10]; - return_code = Command::call(device_type, command_p, Helpers::render_value(data_str, (float)data.as(), 2), is_admin, id_n, output); + return_code = Command::call(device_type, command_p, Helpers::render_value(data_str, data.as(), 2), is_admin, id_n, output); } else if (data.isNull()) { return_code = Command::call(device_type, command_p, "", is_admin, id_n, output); // empty, will do a query instead } else { @@ -160,23 +160,18 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec return return_code; } -const std::string Command::return_code_string(const uint8_t return_code) { +std::string Command::return_code_string(const uint8_t return_code) { switch (return_code) { case CommandRet::ERROR: return read_flash_string(F("Error")); - break; case CommandRet::OK: return read_flash_string(F("OK")); - break; case CommandRet::NOT_FOUND: return read_flash_string(F("Not Found")); - break; case CommandRet::NOT_ALLOWED: return read_flash_string(F("Not Authorized")); - break; case CommandRet::FAIL: return read_flash_string(F("Failed")); - break; default: break; } @@ -367,7 +362,7 @@ bool Command::list(const uint8_t device_type, JsonObject & output) { } sorted_cmds.sort(); - for (auto & cl : sorted_cmds) { + for (const auto & cl : sorted_cmds) { for (const auto & cf : cmdfunctions_) { if ((cf.device_type_ == device_type) && !cf.has_flags(CommandFlag::HIDDEN) && cf.description_ && (cl == read_flash_string(cf.cmd_))) { output[cl] = cf.description_; @@ -396,7 +391,7 @@ void Command::show(uuid::console::Shell & shell, uint8_t device_type, bool verbo // if not in verbose mode, just print them on a single line if (!verbose) { - for (auto & cl : sorted_cmds) { + for (const auto & cl : sorted_cmds) { shell.print(cl); shell.print(" "); } @@ -406,7 +401,7 @@ void Command::show(uuid::console::Shell & shell, uint8_t device_type, bool verbo // verbose mode shell.println(); - for (auto & cl : sorted_cmds) { + for (const auto & cl : sorted_cmds) { // find and print the description for (const auto & cf : cmdfunctions_) { if ((cf.device_type_ == device_type) && !cf.has_flags(CommandFlag::HIDDEN) && cf.description_ && (cl == read_flash_string(cf.cmd_))) { @@ -543,7 +538,7 @@ void Command::show_all(uuid::console::Shell & shell) { // e.g. //one/two////three/// becomes /one/two/three std::string SUrlParser::path() { std::string s = "/"; // set up the beginning slash - for (std::string & f : m_folders) { + for (const std::string & f : m_folders) { s += f; s += "/"; } diff --git a/src/command.h b/src/command.h index 0da1a8a90..3ff3c3c38 100644 --- a/src/command.h +++ b/src/command.h @@ -125,7 +125,7 @@ class Command { static const char * parse_command_string(const char * command, int8_t & id); - static const std::string return_code_string(const uint8_t return_code); + static std::string return_code_string(const uint8_t return_code); private: static uuid::log::Logger logger_; @@ -134,13 +134,13 @@ class Command { inline static uint8_t message(uint8_t error_code, const char * message, const JsonObject & output) { output.clear(); - output["message"] = (const char *)message; + output["message"] = message; return error_code; } }; -typedef std::unordered_map KeyValueMap_t; -typedef std::vector Folder_t; +using KeyValueMap_t = std::unordered_map; +using Folder_t = std::vector; class SUrlParser { private: diff --git a/src/console.cpp b/src/console.cpp index 256d16fa2..9a08fe2e6 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -467,7 +467,7 @@ void Console::load_standard_commands(unsigned int context) { flash_string_vector{F("test")}, flash_string_vector{F_(name_optional), F_(data_optional)}, [](Shell & shell, const std::vector & arguments) { - if (arguments.size() == 0) { + if (arguments.empty()) { Test::run_test(shell, "default"); } else if (arguments.size() == 1) { Test::run_test(shell, arguments.front()); @@ -487,7 +487,7 @@ void Console::load_standard_commands(unsigned int context) { flash_string_vector{F_(debug)}, flash_string_vector{F_(name_optional)}, [](Shell & shell, const std::vector & arguments) { - if (arguments.size() == 0) { + if (arguments.empty()) { Test::debug(shell, "default"); } else { Test::debug(shell, arguments.front()); diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index 00dfc2251..a71c79a3d 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -354,7 +354,7 @@ bool DallasSensor::command_commands(const char * value, const int8_t id, JsonObj // creates JSON doc from values // returns false if there are no sensors bool DallasSensor::command_info(const char * value, const int8_t id, JsonObject & output) { - if (sensors_.size() == 0) { + if (sensors_.empty()) { return false; } @@ -535,8 +535,8 @@ std::string DallasSensor::Sensor::name() const { bool DallasSensor::Sensor::apply_customization() { EMSESP::webCustomizationService.read([&](WebCustomization & settings) { auto sensors = settings.sensorCustomizations; - if (sensors.size() != 0) { - for (auto & sensor : sensors) { + if (sensors.empty()) { + for (const auto & sensor : sensors) { #if defined(EMSESP_DEBUG) LOG_DEBUG(F("Loading customization for dallas sensor %s"), sensor.id_str.c_str()); #endif diff --git a/src/dallassensor.h b/src/dallassensor.h index f6add0adf..c9567e32f 100644 --- a/src/dallassensor.h +++ b/src/dallassensor.h @@ -85,7 +85,7 @@ class DallasSensor { bool get_value_info(JsonObject & output, const char * cmd, const int8_t id); // return back reference to the sensor list, used by other classes - const std::vector sensors() const { + std::vector sensors() const { return sensors_; } @@ -102,7 +102,7 @@ class DallasSensor { } bool have_sensors() { - return (sensors_.size() > 0); + return (!sensors_.empty()); } size_t no_sensors() { diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index e669d2815..561bb2a82 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -325,7 +325,7 @@ std::shared_ptr Thermostat::heating_circuit(std::sha */ // if it's the first set the status flag - if (heating_circuits_.size() == 0) { + if (heating_circuits_.empty()) { strlcpy(status_, "online", sizeof(status_)); } @@ -489,65 +489,44 @@ std::string Thermostat::mode_tostring(uint8_t mode) { switch (mode) { case HeatingCircuit::Mode::OFF: return read_flash_string(F_(off)); - break; case HeatingCircuit::Mode::MANUAL: return read_flash_string(F_(manual)); - break; case HeatingCircuit::Mode::DAY: return read_flash_string(F_(day)); - break; case HeatingCircuit::Mode::NIGHT: return read_flash_string(F_(night)); - break; case HeatingCircuit::Mode::ECO: return read_flash_string(F_(eco)); - break; case HeatingCircuit::Mode::COMFORT: return read_flash_string(F_(comfort)); - break; case HeatingCircuit::Mode::HEAT: return read_flash_string(F_(heat)); - break; case HeatingCircuit::Mode::HOLIDAY: return read_flash_string(F_(holiday)); - break; case HeatingCircuit::Mode::NOFROST: return read_flash_string(F_(nofrost)); - break; case HeatingCircuit::Mode::AUTO: return read_flash_string(F_(auto)); - break; case HeatingCircuit::Mode::SUMMER: return read_flash_string(F_(summer)); - break; case HeatingCircuit::Mode::OFFSET: return read_flash_string(F_(offset)); - break; case HeatingCircuit::Mode::DESIGN: return read_flash_string(F_(design)); - break; case HeatingCircuit::Mode::MINFLOW: return read_flash_string(F_(minflow)); - break; case HeatingCircuit::Mode::MAXFLOW: return read_flash_string(F_(maxflow)); - break; case HeatingCircuit::Mode::ROOMINFLUENCE: return read_flash_string(F_(roominfluence[0])); - break; case HeatingCircuit::Mode::FLOWOFFSET: return read_flash_string(F_(flowtempoffset[0])); - break; case HeatingCircuit::Mode::TEMPAUTO: return read_flash_string(F_(tempauto)); - break; case HeatingCircuit::Mode::NOREDUCE: return read_flash_string(F_(noreduce)); - break; default: - case HeatingCircuit::Mode::UNKNOWN: return read_flash_string(F_(unknown)); - break; } } @@ -1947,9 +1926,7 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { set_mode_value = 1; break; - default: - case HeatingCircuit::Mode::AUTO: - case HeatingCircuit::Mode::ECO: + default: // AUTO & ECO set_mode_value = 2; break; } @@ -2504,7 +2481,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co factor = 1; break; default: - case HeatingCircuit::Mode::AUTO: + // HeatingCircuit::Mode::AUTO: uint8_t mode_ = hc->get_mode(); if (mode_ == HeatingCircuit::Mode::MANUAL) { offset = 0x0A; // manual offset @@ -2543,7 +2520,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = EMS_OFFSET_RC20_2_Set_temp_day; break; default: - case HeatingCircuit::Mode::AUTO: // automatic selection, if no type is defined, we use the standard code + // automatic selection, if no type is defined, we use the standard code uint8_t mode_ = hc->get_mode(); if (mode_ == HeatingCircuit::Mode::NIGHT) { offset = EMS_OFFSET_RC20_2_Set_temp_night; @@ -2614,7 +2591,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co factor = 1; break; default: - case HeatingCircuit::Mode::AUTO: // automatic selection, if no type is defined, we use the standard code + // automatic selection, if no type is defined, we use the standard code validate_typeid = monitor_typeids[hc->hc()]; //get setpoint roomtemp back if (model == EMS_DEVICE_FLAG_RC35) { uint8_t mode_ = hc->get_mode(); @@ -2650,7 +2627,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = EMS_OFFSET_JunkersSetMessage_day_temp; break; default: - case HeatingCircuit::Mode::AUTO: // automatic selection, if no type is defined, we use the standard code + // automatic selection, if no type is defined, we use the standard code uint8_t modetype = hc->get_mode_type(); if (modetype == HeatingCircuit::Mode::NIGHT || modetype == HeatingCircuit::Mode::ECO) { offset = EMS_OFFSET_JunkersSetMessage_night_temp; @@ -2677,7 +2654,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = EMS_OFFSET_JunkersSetMessage2_heat_temp; break; default: - case HeatingCircuit::Mode::AUTO: // automatic selection, if no type is defined, we use the standard code + // automatic selection, if no type is defined, we use the standard code uint8_t modetype = hc->get_mode_type(); if (modetype == HeatingCircuit::Mode::NIGHT || modetype == HeatingCircuit::Mode::ECO) { offset = EMS_OFFSET_JunkersSetMessage2_eco_temp; @@ -2695,7 +2672,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co if (offset != -1) { // add the write command to the Tx queue. value is *2 // post validate is the corresponding monitor or set type IDs as they can differ per model - write_command(set_typeid, offset, (uint8_t)((float)temperature * (float)factor), validate_typeid); + write_command(set_typeid, offset, (uint8_t)(temperature * (float)factor), validate_typeid); return true; } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index bae306d86..1ae77187d 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -62,32 +62,21 @@ std::string EMSdevice::brand_to_string() const { switch (brand_) { case EMSdevice::Brand::BOSCH: return read_flash_string(F("Bosch")); - break; case EMSdevice::Brand::JUNKERS: return read_flash_string(F("Junkers")); - break; case EMSdevice::Brand::BUDERUS: return read_flash_string(F("Buderus")); - break; case EMSdevice::Brand::NEFIT: return read_flash_string(F("Nefit")); - break; case EMSdevice::Brand::SIEGER: return read_flash_string(F("Sieger")); - break; case EMSdevice::Brand::WORCESTER: return read_flash_string(F("Worcester")); - break; case EMSdevice::Brand::IVT: return read_flash_string(F("IVT")); - break; - case EMSdevice::Brand::NO_BRAND: default: return read_flash_string(F("")); - break; } - - return std::string{}; } // returns the name of the MQTT topic to use for a specific device, without the base @@ -95,55 +84,30 @@ std::string EMSdevice::device_type_2_device_name(const uint8_t device_type) { switch (device_type) { case DeviceType::SYSTEM: return read_flash_string(F_(system)); - break; - case DeviceType::BOILER: return read_flash_string(F_(boiler)); - break; - case DeviceType::THERMOSTAT: return read_flash_string(F_(thermostat)); - break; - case DeviceType::HEATPUMP: return read_flash_string(F_(heatpump)); - break; - case DeviceType::SOLAR: return read_flash_string(F_(solar)); - break; - case DeviceType::CONNECT: return read_flash_string(F_(connect)); - break; - case DeviceType::MIXER: return read_flash_string(F_(mixer)); - break; - case DeviceType::DALLASSENSOR: return read_flash_string(F_(dallassensor)); - break; - case DeviceType::ANALOGSENSOR: return read_flash_string(F_(analogsensor)); - break; - case DeviceType::CONTROLLER: return read_flash_string(F_(controller)); - break; - case DeviceType::SWITCH: return read_flash_string(F_(switch)); - break; - case DeviceType::GATEWAY: return read_flash_string(F_(gateway)); - break; - default: return read_flash_string(F_(unknown)); - break; } } @@ -207,28 +171,20 @@ uint8_t EMSdevice::decode_brand(uint8_t value) { switch (value) { case 1: return EMSdevice::Brand::BOSCH; - break; case 2: return EMSdevice::Brand::JUNKERS; - break; case 3: return EMSdevice::Brand::BUDERUS; - break; case 4: return EMSdevice::Brand::NEFIT; - break; case 5: return EMSdevice::Brand::SIEGER; - break; case 11: return EMSdevice::Brand::WORCESTER; - break; case 13: return EMSdevice::Brand::IVT; - break; default: return EMSdevice::Brand::NO_BRAND; - break; } } @@ -579,7 +535,6 @@ void EMSdevice::publish_value(void * value_p) const { } break; } - case DeviceValueType::USHORT: Helpers::render_value(payload, *(uint16_t *)(value_p), divider, fahrenheit); break; @@ -603,11 +558,12 @@ void EMSdevice::publish_value(void * value_p) const { Helpers::render_value(payload, *(uint32_t *)(value_p), divider); break; case DeviceValueType::STRING: - default: if (Helpers::hasValue((char *)(value_p))) { strlcpy(payload, (char *)(value_p), sizeof(payload)); } break; + default: + break; } if (payload[0] != '\0') { diff --git a/src/helpers.cpp b/src/helpers.cpp index d89facaad..279b7ba11 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -587,12 +587,12 @@ bool Helpers::value2bool(const char * v, bool & value) { std::string bool_str = toLower(v); // convert to lower case - if ((bool_str == read_flash_string(F_(on))) || (bool_str == "1") or (bool_str == "true")) { + if ((bool_str == read_flash_string(F_(on))) || (bool_str == "1") || (bool_str == "true")) { value = true; return true; // is a bool } - if ((bool_str == read_flash_string(F_(off))) || (bool_str == "0") or (bool_str == "false")) { + if ((bool_str == read_flash_string(F_(off))) || (bool_str == "0") || (bool_str == "false")) { value = false; return true; // is a bool } diff --git a/src/mqtt.cpp b/src/mqtt.cpp index bfdd28407..c58f41540 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -1313,7 +1313,7 @@ void Mqtt::publish_ha_climate_config(uint8_t tag, bool has_roomtemp, bool remove // based on the device and tag, create the MQTT topic name (without the basename) // differs based on whether MQTT nested is enabled // tag = EMSdevice::DeviceValueTAG -const std::string Mqtt::tag_to_topic(uint8_t device_type, uint8_t tag) { +std::string Mqtt::tag_to_topic(uint8_t device_type, uint8_t tag) { // the system device is treated differently. The topic is 'heartbeat' and doesn't follow the usual convention if (device_type == EMSdevice::DeviceType::SYSTEM) { return EMSdevice::tag_to_mqtt(tag); diff --git a/src/mqtt.h b/src/mqtt.h index 712f65233..743870251 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -220,7 +220,7 @@ class Mqtt { return mqtt_messages_.empty(); } - static const std::string tag_to_topic(uint8_t device_type, uint8_t tag); + static std::string tag_to_topic(uint8_t device_type, uint8_t tag); struct QueuedMqttMessage { const uint32_t id_; diff --git a/src/system.cpp b/src/system.cpp index 9ac897566..336c3ba2c 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1135,9 +1135,11 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["bus status"] = (F("connected, tx issues - try a different tx-mode")); break; case EMSESP::BUS_STATUS_CONNECTED: - default: node["bus status"] = (F("connected")); break; + default: + node["bus status"] = (F("unknown")); + break; } if (EMSESP::bus_status() != EMSESP::BUS_STATUS_OFFLINE) { @@ -1280,7 +1282,7 @@ bool System::command_restart(const char * value, const int8_t id) { return true; } -const std::string System::reset_reason(uint8_t cpu) { +std::string System::reset_reason(uint8_t cpu) const { #ifndef EMSESP_STANDALONE switch (rtc_get_reset_reason(cpu)) { case 1: diff --git a/src/system.h b/src/system.h index d87e6e737..970b77731 100644 --- a/src/system.h +++ b/src/system.h @@ -65,7 +65,7 @@ class System { static bool command_customizations(const char * value, const int8_t id, JsonObject & output); static bool command_commands(const char * value, const int8_t id, JsonObject & output); - const std::string reset_reason(uint8_t cpu); + std::string reset_reason(uint8_t cpu) const; void system_restart(); void format(uuid::console::Shell & shell); diff --git a/src/telegram.h b/src/telegram.h index 31e03167d..cf05e5076 100644 --- a/src/telegram.h +++ b/src/telegram.h @@ -270,7 +270,7 @@ class RxService : public EMSbus { } }; - const std::deque queue() const { + std::deque queue() const { return rx_telegrams_; } @@ -400,12 +400,12 @@ class TxService : public EMSbus { } }; - const std::deque queue() const { + std::deque queue() const { return tx_telegrams_; } bool tx_queue_empty() const { - return tx_telegrams_.size() == 0; + return tx_telegrams_.empty(); } #if defined(EMSESP_DEBUG) diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index f7de6d90d..3ade88792 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -49,7 +49,7 @@ void WebAPIService::webAPIService_get(AsyncWebServerRequest * request) { // POST /{device}[/{hc|id}][/{name}] void WebAPIService::webAPIService_post(AsyncWebServerRequest * request, JsonVariant & json) { // if no body then treat it as a secure GET - if (not json.is()) { + if (!json.is()) { webAPIService_get(request); return; } diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index aa3e5c2c7..7564de6e5 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -162,7 +162,7 @@ void WebCustomizationService::devices(AsyncWebServerRequest * request) { JsonObject root = response->getRoot(); JsonArray devices = root.createNestedArray("devices"); - for (auto & emsdevice : EMSESP::emsdevices) { + for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice->has_entities()) { JsonObject obj = devices.createNestedObject(); obj["i"] = emsdevice->unique_id(); // a unique id diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 7e8a34fde..7f331c9c5 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -76,7 +76,7 @@ void WebDataService::core_data(AsyncWebServerRequest * request) { // list is already sorted by device type // Ignore Contoller JsonArray devices = root.createNestedArray("devices"); - for (auto & emsdevice : EMSESP::emsdevices) { + for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice && emsdevice->device_type() != EMSdevice::DeviceType::CONTROLLER) { JsonObject obj = devices.createNestedObject(); obj["i"] = emsdevice->unique_id(); // a unique id @@ -215,7 +215,7 @@ void WebDataService::write_value(AsyncWebServerRequest * request, JsonVariant & return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 0), true, id, output); } else if (data.is()) { char s[10]; - return_code = Command::call(device_type, cmd, Helpers::render_value(s, (float)data.as(), 1), true, id, output); + return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 1), true, id, output); } else if (data.is()) { return_code = Command::call(device_type, cmd, data.as() ? "true" : "false", true, id, output); } diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 725719f1a..56c89070a 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -213,7 +213,7 @@ void WebLogService::fetchLog(AsyncWebServerRequest * request) { // sets the values like level after a POST void WebLogService::setValues(AsyncWebServerRequest * request, JsonVariant & json) { - if (not json.is()) { + if (!json.is()) { return; } From f19bf17d21b3f8507bf86f31275d9f445ab9bcdd Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 5 Mar 2022 17:27:22 +0100 Subject: [PATCH 090/319] 3.4.0b8 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index c726fbf26..3eaeb3552 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b7" +#define EMSESP_APP_VERSION "3.4.0b8" From 69dc26005a8c7a336ed951457458fd3fd475a3f1 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 6 Mar 2022 11:33:59 +0100 Subject: [PATCH 091/319] fix strcpy length --- src/helpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers.cpp b/src/helpers.cpp index 279b7ba11..5fbcb8792 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -192,7 +192,7 @@ char * Helpers::render_boolean(char * result, bool value) { // render for native char strings char * Helpers::render_value(char * result, const char * value, const int8_t format __attribute__((unused))) { - strlcpy(result, value, sizeof(result)); + strcpy(result, value); // un-safe but we don't care return result; } From 828e769b3b90c171540965f50698055bdfc91f68 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 7 Mar 2022 12:30:50 +0100 Subject: [PATCH 092/319] add bufsize to messagetime() --- src/web/WebLogService.cpp | 8 ++++---- src/web/WebLogService.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 56c89070a..949a647c9 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -156,9 +156,9 @@ void WebLogService::loop() { } // convert time to real offset -char * WebLogService::messagetime(char * out, const uint64_t t) { +char * WebLogService::messagetime(char * out, const uint64_t t, size_t bufsize) { if (!time_offset_) { - strlcpy(out, uuid::log::format_timestamp_ms(t, 3).c_str(), sizeof(out)); + strlcpy(out, uuid::log::format_timestamp_ms(t, 3).c_str(), bufsize); } else { time_t t1 = time_offset_ + t / 1000ULL; strftime(out, 25, "%F %T", localtime(&t1)); @@ -173,7 +173,7 @@ void WebLogService::transmit(const QueuedLogMessage & message) { JsonObject logEvent = jsonDocument.to(); char time_string[25]; - logEvent["t"] = messagetime(time_string, message.content_->uptime_ms); + logEvent["t"] = messagetime(time_string, message.content_->uptime_ms, sizeof(time_string)); logEvent["l"] = message.content_->level; logEvent["i"] = message.id_; logEvent["n"] = message.content_->name; @@ -200,7 +200,7 @@ void WebLogService::fetchLog(AsyncWebServerRequest * request) { JsonObject logEvent = log.createNestedObject(); char time_string[25]; - logEvent["t"] = messagetime(time_string, message.content_->uptime_ms); + logEvent["t"] = messagetime(time_string, message.content_->uptime_ms, sizeof(time_string)); logEvent["l"] = message.content_->level; logEvent["i"] = message.id_; logEvent["n"] = message.content_->name; diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index 71ec42654..4ae7b6434 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -62,7 +62,7 @@ class WebLogService : public uuid::log::Handler { void fetchLog(AsyncWebServerRequest * request); void getValues(AsyncWebServerRequest * request); - char * messagetime(char * out, const uint64_t t); + char * messagetime(char * out, const uint64_t t, size_t bufsize); void setValues(AsyncWebServerRequest * request, JsonVariant & json); AsyncCallbackJsonWebHandler setValues_; // for POSTs From 4f696a4947f4ec26c3ffdd7fe3a785e1dfc10a2a Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 7 Mar 2022 12:46:27 +0100 Subject: [PATCH 093/319] bufsize const in messagetime() --- src/web/WebLogService.cpp | 6 +++--- src/web/WebLogService.h | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 949a647c9..357ae03f3 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -156,13 +156,13 @@ void WebLogService::loop() { } // convert time to real offset -char * WebLogService::messagetime(char * out, const uint64_t t, size_t bufsize) { +char * WebLogService::messagetime(char * out, const uint64_t t, const size_t bufsize) { if (!time_offset_) { strlcpy(out, uuid::log::format_timestamp_ms(t, 3).c_str(), bufsize); } else { time_t t1 = time_offset_ + t / 1000ULL; - strftime(out, 25, "%F %T", localtime(&t1)); - snprintf(out, 25, "%s.%03d", out, (uint16_t)(t % 1000)); + strftime(out, bufsize, "%F %T", localtime(&t1)); + snprintf(out, bufsize, "%s.%03d", out, (uint16_t)(t % 1000)); } return out; } diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index 4ae7b6434..55ca039f7 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -62,9 +62,10 @@ class WebLogService : public uuid::log::Handler { void fetchLog(AsyncWebServerRequest * request); void getValues(AsyncWebServerRequest * request); - char * messagetime(char * out, const uint64_t t, size_t bufsize); + char * messagetime(char * out, const uint64_t t, const size_t bufsize); + + void setValues(AsyncWebServerRequest * request, JsonVariant & json); - void setValues(AsyncWebServerRequest * request, JsonVariant & json); AsyncCallbackJsonWebHandler setValues_; // for POSTs uint64_t last_transmit_ = 0; // Last transmit time From a2f84352040afa42e19e361754d8017287078a3b Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 8 Mar 2022 07:07:52 +0100 Subject: [PATCH 094/319] fix mDNS on network reconnect --- src/web/WebStatusService.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 8bd4b4f81..bb9dd3050 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -165,6 +165,7 @@ void WebStatusService::webStatusService(AsyncWebServerRequest * request) { // start the multicast UDP service so EMS-ESP is discoverable via .local void WebStatusService::mDNS_start() const { #ifndef EMSESP_STANDALONE + MDNS.end(); if (!MDNS.begin(EMSESP::system_.hostname().c_str())) { EMSESP::logger().warning(F("Failed to start mDNS responder service")); return; From 5a09de002ade796b9abe61d95f8bc0ed94be85e1 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 8 Mar 2022 12:02:18 +0100 Subject: [PATCH 095/319] show correct hostname in startup message --- src/emsesp.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 255c98422..54ddc1991 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -1370,7 +1370,6 @@ void EMSESP::start() { esp8266React.begin(); // loads core system services settings (network, mqtt, ap, ntp etc) webLogService.begin(); // start web log service. now we can start capturing logs to the web log - LOG_INFO(F("Starting EMS-ESP version %s (hostname: %s)"), EMSESP_APP_VERSION, system_.hostname().c_str()); // welcome message LOG_INFO(F("Last system reset reason Core0: %s, Core1: %s"), system_.reset_reason(0).c_str(), system_.reset_reason(1).c_str()); webSettingsService.begin(); // load EMS-ESP Application settings... @@ -1385,8 +1384,10 @@ void EMSESP::start() { system_.check_upgrade(); // do any system upgrades // start all the EMS-ESP services - mqtt_.start(); // mqtt init - system_.start(); // starts commands, led, adc, button, network, syslog & uart + mqtt_.start(); // mqtt init + system_.start(); // starts commands, led, adc, button, network, syslog & uart + LOG_INFO(F("Starting EMS-ESP version %s (hostname: %s)"), EMSESP_APP_VERSION, system_.hostname().c_str()); // welcome message + shower_.start(); // initialize shower timer and shower alert dallassensor_.start(); // Dallas external sensors analogsensor_.start(); // Analog external sensors From 1413bb7fbf3fb6a74b091f12fd9118bcb9080b08 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 8 Mar 2022 17:04:11 +0100 Subject: [PATCH 096/319] fix typo in loading dallas names --- src/dallassensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index a71c79a3d..3d4be1a15 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -535,7 +535,7 @@ std::string DallasSensor::Sensor::name() const { bool DallasSensor::Sensor::apply_customization() { EMSESP::webCustomizationService.read([&](WebCustomization & settings) { auto sensors = settings.sensorCustomizations; - if (sensors.empty()) { + if (!sensors.empty()) { for (const auto & sensor : sensors) { #if defined(EMSESP_DEBUG) LOG_DEBUG(F("Loading customization for dallas sensor %s"), sensor.id_str.c_str()); From b526734e4b21cfaf9199104f33c21d7e6056c085 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 8 Mar 2022 18:19:26 +0100 Subject: [PATCH 097/319] update arduinojson 6.19.3 --- interface/package-lock.json | 84 +++++++++---------- interface/package.json | 4 +- lib/ArduinoJson/CHANGELOG.md | 13 +++ lib/ArduinoJson/README.md | 4 +- .../ArduinoJson/Collection/CollectionImpl.hpp | 2 +- .../MsgPack/MsgPackDeserializer.hpp | 4 +- .../ArduinoJson/MsgPack/MsgPackSerializer.hpp | 16 ++-- .../src/ArduinoJson/Object/Pair.hpp | 6 +- .../src/ArduinoJson/Polyfills/pgmspace.hpp | 4 +- .../StringStorage/StringCopier.hpp | 4 +- .../ArduinoJson/StringStorage/StringMover.hpp | 2 +- .../Strings/Adapters/RamString.hpp | 6 +- .../src/ArduinoJson/Strings/StoragePolicy.hpp | 4 +- .../src/ArduinoJson/Strings/StoredString.hpp | 35 -------- .../src/ArduinoJson/Strings/String.hpp | 32 ++++--- .../src/ArduinoJson/Variant/ConverterImpl.hpp | 2 +- .../ArduinoJson/Variant/VariantCompare.hpp | 2 +- .../src/ArduinoJson/Variant/VariantData.hpp | 2 +- .../src/ArduinoJson/Variant/VariantImpl.hpp | 11 ++- .../src/ArduinoJson/Variant/VariantRef.hpp | 4 +- .../src/ArduinoJson/Variant/VariantSlot.hpp | 2 +- lib/ArduinoJson/src/ArduinoJson/version.hpp | 4 +- 22 files changed, 114 insertions(+), 133 deletions(-) delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/StoredString.hpp diff --git a/interface/package-lock.json b/interface/package-lock.json index cb94ea75e..e941355c2 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -11,8 +11,8 @@ "@emotion/react": "^11.8.1", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.4.4", - "@mui/material": "^5.4.4", + "@mui/icons-material": "^5.5.0", + "@mui/material": "^5.5.0", "@types/lodash": "^4.14.179", "@types/node": "^17.0.21", "@types/react": "^17.0.39", @@ -2708,14 +2708,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.70", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.70.tgz", - "integrity": "sha512-8UZWhz1JYuQnPkAbC37cl4aL1JyNWZ08wDXlp57W7fYQp5xFpBP/7p56AcWg2qG9CNJP0IlFg2Wp4md1v2l4iA==", + "version": "5.0.0-alpha.71", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.71.tgz", + "integrity": "sha512-LinacyjmZOS+roUqCyhrcbNIW7TlRf1U+15ETGwMn6biNXI9YEVgcc1Kak08CRtjM0yczxxzLWetiAjHMCVSjQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/utils": "^5.4.4", - "@popperjs/core": "^2.4.4", + "@popperjs/core": "^2.11.2", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" @@ -2739,9 +2739,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.4.tgz", - "integrity": "sha512-7zoRpjO8vsd+bPvXq6rtXu0V8Saj70X09dtTQogZmxQKabrYW3g7+Yym7SCRA7IYVF3ysz2AvdQrGD1P/sGepg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.5.0.tgz", + "integrity": "sha512-rMs5flT3INyd/m1A/x8DDlNTfHmCartX8stCuSDDMmaMV123oSwg8werJ/Hg4j1FWuVk5rE5HRY45gBf12BCGw==", "dependencies": { "@babel/runtime": "^7.17.2" }, @@ -2764,18 +2764,18 @@ } }, "node_modules/@mui/material": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.4.tgz", - "integrity": "sha512-VDJC7GzO1HTFqfMe2zwvaW/sRhABBJXFkKEv5gO3uXx7x9fdwJHQr4udU7NWZCUdOcx9Y0h3BsAILLefYq+WPw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.0.tgz", + "integrity": "sha512-E12rxqLaWBrebJCxKxBtyRrzJgpPIQSCt4MUHns2Yl9gxOx4c7vDDKuks7Qc6S36wTQf+FP4aiey72Z2WKdYgQ==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.70", - "@mui/system": "^5.4.4", + "@mui/base": "5.0.0-alpha.71", + "@mui/system": "^5.5.0", "@mui/types": "^7.1.2", "@mui/utils": "^5.4.4", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", - "csstype": "^3.0.10", + "csstype": "^3.0.11", "hoist-non-react-statics": "^3.3.2", "prop-types": "^15.7.2", "react-is": "^17.0.2", @@ -2864,9 +2864,9 @@ } }, "node_modules/@mui/system": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.4.tgz", - "integrity": "sha512-Zjbztq2o/VRuRRCWjG44juRrPKYLQMqtQpMHmMttGu5BnvK6PAPW3WOY0r1JCAwLhbd8Kug9nyhGQYKETjo+tQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.0.tgz", + "integrity": "sha512-zFOfERv3Y4m5ehwTRR9cGaPuMvlD2qVXmFKC60P0Gte3aD6vYObyNriZv+mDVGlhDxZTZhxBrNPH3ns25xSFtQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.4.4", @@ -2874,7 +2874,7 @@ "@mui/types": "^7.1.2", "@mui/utils": "^5.4.4", "clsx": "^1.1.1", - "csstype": "^3.0.10", + "csstype": "^3.0.11", "prop-types": "^15.7.2" }, "engines": { @@ -6204,9 +6204,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -19340,40 +19340,40 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.70", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.70.tgz", - "integrity": "sha512-8UZWhz1JYuQnPkAbC37cl4aL1JyNWZ08wDXlp57W7fYQp5xFpBP/7p56AcWg2qG9CNJP0IlFg2Wp4md1v2l4iA==", + "version": "5.0.0-alpha.71", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.71.tgz", + "integrity": "sha512-LinacyjmZOS+roUqCyhrcbNIW7TlRf1U+15ETGwMn6biNXI9YEVgcc1Kak08CRtjM0yczxxzLWetiAjHMCVSjQ==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/utils": "^5.4.4", - "@popperjs/core": "^2.4.4", + "@popperjs/core": "^2.11.2", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" } }, "@mui/icons-material": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.4.4.tgz", - "integrity": "sha512-7zoRpjO8vsd+bPvXq6rtXu0V8Saj70X09dtTQogZmxQKabrYW3g7+Yym7SCRA7IYVF3ysz2AvdQrGD1P/sGepg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.5.0.tgz", + "integrity": "sha512-rMs5flT3INyd/m1A/x8DDlNTfHmCartX8stCuSDDMmaMV123oSwg8werJ/Hg4j1FWuVk5rE5HRY45gBf12BCGw==", "requires": { "@babel/runtime": "^7.17.2" } }, "@mui/material": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.4.4.tgz", - "integrity": "sha512-VDJC7GzO1HTFqfMe2zwvaW/sRhABBJXFkKEv5gO3uXx7x9fdwJHQr4udU7NWZCUdOcx9Y0h3BsAILLefYq+WPw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.0.tgz", + "integrity": "sha512-E12rxqLaWBrebJCxKxBtyRrzJgpPIQSCt4MUHns2Yl9gxOx4c7vDDKuks7Qc6S36wTQf+FP4aiey72Z2WKdYgQ==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.70", - "@mui/system": "^5.4.4", + "@mui/base": "5.0.0-alpha.71", + "@mui/system": "^5.5.0", "@mui/types": "^7.1.2", "@mui/utils": "^5.4.4", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", - "csstype": "^3.0.10", + "csstype": "^3.0.11", "hoist-non-react-statics": "^3.3.2", "prop-types": "^15.7.2", "react-is": "^17.0.2", @@ -19401,9 +19401,9 @@ } }, "@mui/system": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.4.tgz", - "integrity": "sha512-Zjbztq2o/VRuRRCWjG44juRrPKYLQMqtQpMHmMttGu5BnvK6PAPW3WOY0r1JCAwLhbd8Kug9nyhGQYKETjo+tQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.0.tgz", + "integrity": "sha512-zFOfERv3Y4m5ehwTRR9cGaPuMvlD2qVXmFKC60P0Gte3aD6vYObyNriZv+mDVGlhDxZTZhxBrNPH3ns25xSFtQ==", "requires": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.4.4", @@ -19411,7 +19411,7 @@ "@mui/types": "^7.1.2", "@mui/utils": "^5.4.4", "clsx": "^1.1.1", - "csstype": "^3.0.10", + "csstype": "^3.0.11", "prop-types": "^15.7.2" } }, @@ -21865,9 +21865,9 @@ } }, "csstype": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" }, "damerau-levenshtein": { "version": "1.0.8", diff --git a/interface/package.json b/interface/package.json index e6c94e445..6cdbcb18f 100644 --- a/interface/package.json +++ b/interface/package.json @@ -7,8 +7,8 @@ "@emotion/react": "^11.8.1", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.4.4", - "@mui/material": "^5.4.4", + "@mui/icons-material": "^5.5.0", + "@mui/material": "^5.5.0", "@types/lodash": "^4.14.179", "@types/node": "^17.0.21", "@types/react": "^17.0.39", diff --git a/lib/ArduinoJson/CHANGELOG.md b/lib/ArduinoJson/CHANGELOG.md index 47dff0bf0..6a2e8a8d7 100644 --- a/lib/ArduinoJson/CHANGELOG.md +++ b/lib/ArduinoJson/CHANGELOG.md @@ -1,6 +1,19 @@ ArduinoJson: change log ======================= +v6.19.3 (2022-03-08) +------- + +* Fix `call of overloaded 'String(const char*, int)' is ambiguous` +* Fix `JsonString` operator `==` and `!=` for non-zero-terminated string +* Fix `-Wsign-conversion` on GCC 8 (issue #1715) +* MessagePack: serialize round floats as integers (issue #1718) + +v6.19.2 (2022-02-14) +------- + +* Fix `cannot convert 'pgm_p' to 'const void*'` (issue #1707) + v6.19.1 (2022-01-14) ------- diff --git a/lib/ArduinoJson/README.md b/lib/ArduinoJson/README.md index 78436e28d..a4c95cb97 100644 --- a/lib/ArduinoJson/README.md +++ b/lib/ArduinoJson/README.md @@ -7,8 +7,8 @@ [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/arduinojson.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson) [![LGTM Grade](https://img.shields.io/lgtm/grade/cpp/github/bblanchon/ArduinoJson?label=quality&logo=lgtm)](https://lgtm.com/projects/g/bblanchon/ArduinoJson/) [![Coveralls branch](https://img.shields.io/coveralls/github/bblanchon/ArduinoJson/6.x?logo=coveralls)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x) -[![Arduino Library Manager](https://img.shields.io/static/v1?label=Arduino&message=v6.19.1&logo=arduino&logoColor=white&color=blue)](https://www.ardu-badge.com/ArduinoJson/6.19.1) -[![PlatformIO Registry](https://badges.registry.platformio.org/packages/bblanchon/library/ArduinoJson.svg?version=6.19.1)](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.19.1) +[![Arduino Library Manager](https://img.shields.io/static/v1?label=Arduino&message=v6.19.3&logo=arduino&logoColor=white&color=blue)](https://www.ardu-badge.com/ArduinoJson/6.19.3) +[![PlatformIO Registry](https://badges.registry.platformio.org/packages/bblanchon/library/ArduinoJson.svg?version=6.19.3)](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.19.3) [![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat&logo=github)](https://github.com/bblanchon/ArduinoJson/stargazers) [![GitHub Sponsors](https://img.shields.io/github/sponsors/bblanchon?logo=github)](https://github.com/sponsors/bblanchon) diff --git a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp index 60f5cb11b..35678eebf 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -64,7 +64,7 @@ inline bool CollectionData::copyFrom(const CollectionData& src, for (VariantSlot* s = src._head; s; s = s->next()) { VariantData* var; if (s->key() != 0) { - String key(s->key(), !s->ownsKey()); + String key(s->key(), s->ownsKey() ? String::Copied : String::Linked); var = addMember(adaptString(key), pool, getStringStoragePolicy(key)); } else { var = addElement(pool); diff --git a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index 5916bac81..00b717a6c 100644 --- a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -40,7 +40,7 @@ class MsgPackDeserializer { template bool parseVariant(VariantData *variant, TFilter filter, NestingLimit nestingLimit) { - uint8_t code = 0; + uint8_t code = 0; // TODO: why do we need to initialize this variable? if (!readByte(code)) return false; @@ -481,7 +481,7 @@ class MsgPackDeserializer { T size; if (!readInteger(size)) return false; - return skipBytes(size + 1); + return skipBytes(size + 1U); } MemoryPool *_pool; diff --git a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp index 51e929bec..a1053f0a4 100644 --- a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp @@ -23,6 +23,11 @@ class MsgPackSerializer : public Visitor { template typename enable_if::type visitFloat(T value32) { + if (canConvertNumber(value32)) { + Integer truncatedValue = Integer(value32); + if (value32 == T(truncatedValue)) + return visitSignedInteger(truncatedValue); + } writeByte(0xCA); writeInteger(value32); return bytesWritten(); @@ -32,13 +37,10 @@ class MsgPackSerializer : public Visitor { ARDUINOJSON_NO_SANITIZE("float-cast-overflow") typename enable_if::type visitFloat(T value64) { float value32 = float(value64); - if (value32 == value64) { - writeByte(0xCA); - writeInteger(value32); - } else { - writeByte(0xCB); - writeInteger(value64); - } + if (value32 == value64) + return visitFloat(value32); + writeByte(0xCB); + writeInteger(value64); return bytesWritten(); } diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp index e9e71eb63..7e3ca32c4 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp @@ -13,7 +13,8 @@ class Pair { public: Pair(MemoryPool* pool, VariantSlot* slot) { if (slot) { - _key = String(slot->key(), !slot->ownsKey()); + _key = String(slot->key(), + slot->ownsKey() ? String::Copied : String::Linked); _value = VariantRef(pool, slot->data()); } } @@ -35,7 +36,8 @@ class PairConst { public: PairConst(const VariantSlot* slot) { if (slot) { - _key = String(slot->key(), !slot->ownsKey()); + _key = String(slot->key(), + slot->ownsKey() ? String::Copied : String::Linked); _value = VariantConstRef(slot->data()); } } diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace.hpp index 189251705..afef4ce9d 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace.hpp @@ -99,7 +99,7 @@ inline void* memcpy_P(void* dst, ARDUINOJSON_NAMESPACE::pgm_p src, size_t n) { #ifndef pgm_read_dword inline uint32_t pgm_read_dword(ARDUINOJSON_NAMESPACE::pgm_p p) { uint32_t result; - memcpy_P(&result, p, 4); + memcpy_P(&result, p.address, 4); return result; } #endif @@ -107,7 +107,7 @@ inline uint32_t pgm_read_dword(ARDUINOJSON_NAMESPACE::pgm_p p) { #ifndef pgm_read_ptr inline void* pgm_read_ptr(ARDUINOJSON_NAMESPACE::pgm_p p) { void* result; - memcpy_P(&result, p, sizeof(result)); + memcpy_P(&result, p.address, sizeof(result)); return result; } #endif diff --git a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringCopier.hpp b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringCopier.hpp index 455a155a1..f743e4ac1 100644 --- a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringCopier.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringCopier.hpp @@ -22,7 +22,7 @@ class StringCopier { String save() { ARDUINOJSON_ASSERT(_ptr); ARDUINOJSON_ASSERT(_size < _capacity); // needs room for the terminator - return String(_pool->saveStringFromFreeZone(_size), _size, false); + return String(_pool->saveStringFromFreeZone(_size), _size, String::Copied); } void append(const char* s) { @@ -52,7 +52,7 @@ class StringCopier { ARDUINOJSON_ASSERT(_ptr); ARDUINOJSON_ASSERT(_size < _capacity); _ptr[_size] = 0; - return String(_ptr, _size, false); + return String(_ptr, _size, String::Copied); } private: diff --git a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringMover.hpp b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringMover.hpp index 4ed7d92e1..f4cd1baef 100644 --- a/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringMover.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/StringStorage/StringMover.hpp @@ -33,7 +33,7 @@ class StringMover { String str() const { _writePtr[0] = 0; // terminator - return String(_startPtr, size(), true); + return String(_startPtr, size(), String::Linked); } size_t size() const { diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamString.hpp index 1d3991615..5a55552a3 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamString.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/Adapters/RamString.hpp @@ -106,13 +106,13 @@ inline SizedRamString adaptString(const char* s, size_t n) { return SizedRamString(s, n); } -template +template struct IsString : true_type {}; -template +template struct IsString : true_type {}; -template +template inline SizedRamString adaptString(char s[N]) { return SizedRamString(s, strlen(s)); } diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/StoragePolicy.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/StoragePolicy.hpp index 2a01f0d5a..d1e138c48 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/StoragePolicy.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/StoragePolicy.hpp @@ -12,7 +12,7 @@ namespace ARDUINOJSON_NAMESPACE { struct LinkStringStoragePolicy { template bool store(TAdaptedString str, MemoryPool *, TCallback callback) { - String storedString(str.data(), str.size(), true); + String storedString(str.data(), str.size(), String::Linked); callback(storedString); return !str.isNull(); } @@ -50,7 +50,7 @@ inline LinkStringStoragePolicy getStringStoragePolicy(const char *) { } inline LinkOrCopyStringStoragePolicy getStringStoragePolicy(const String &s) { - return LinkOrCopyStringStoragePolicy(s.isStatic()); + return LinkOrCopyStringStoragePolicy(s.isLinked()); } } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/StoredString.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/StoredString.hpp deleted file mode 100644 index 53e874685..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/StoredString.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -namespace ARDUINOJSON_NAMESPACE { - -template -class StoredString { - public: - StoredString() : _data(0), _size(0) {} - StoredString(const char* p, size_t n) : _data(p), _size(n) {} - - operator const char*() const { - return _data; - } - - const char* c_str() const { - return _data; - } - - size_t size() const { - return _size; - } - - private: - const char* _data; - size_t _size; -}; - -typedef StoredString LinkedString; -typedef StoredString CopiedString; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Strings/String.hpp b/lib/ArduinoJson/src/ArduinoJson/Strings/String.hpp index 1c71c67ae..1371114ec 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Strings/String.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Strings/String.hpp @@ -14,15 +14,15 @@ namespace ARDUINOJSON_NAMESPACE { class String : public SafeBoolIdom { public: - String() : _data(0), _size(0), _isStatic(true) {} + enum Ownership { Copied, Linked }; - String(const char* data, bool isStaticData = true) - : _data(data), - _size(data ? ::strlen(data) : 0), - _isStatic(isStaticData) {} + String() : _data(0), _size(0), _ownership(Linked) {} - String(const char* data, size_t sz, bool isStaticData = true) - : _data(data), _size(sz), _isStatic(isStaticData) {} + String(const char* data, Ownership ownership = Linked) + : _data(data), _size(data ? ::strlen(data) : 0), _ownership(ownership) {} + + String(const char* data, size_t sz, Ownership ownership = Linked) + : _data(data), _size(sz), _ownership(ownership) {} const char* c_str() const { return _data; @@ -32,8 +32,8 @@ class String : public SafeBoolIdom { return !_data; } - bool isStatic() const { - return _isStatic; + bool isLinked() const { + return _ownership == Linked; } size_t size() const { @@ -46,23 +46,19 @@ class String : public SafeBoolIdom { } friend bool operator==(String lhs, String rhs) { + if (lhs._size != rhs._size) + return false; if (lhs._data == rhs._data) return true; if (!lhs._data) return false; if (!rhs._data) return false; - return strcmp(lhs._data, rhs._data) == 0; + return memcmp(lhs._data, rhs._data, lhs._size) == 0; } friend bool operator!=(String lhs, String rhs) { - if (lhs._data == rhs._data) - return false; - if (!lhs._data) - return true; - if (!rhs._data) - return true; - return strcmp(lhs._data, rhs._data) != 0; + return !(lhs == rhs); } #if ARDUINOJSON_ENABLE_STD_STREAM @@ -75,7 +71,7 @@ class String : public SafeBoolIdom { private: const char* _data; size_t _size; - bool _isStatic; + Ownership _ownership; }; } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/ConverterImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/ConverterImpl.hpp index a825760c9..baf1187ae 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -208,7 +208,7 @@ class MemoryPoolPrint : public Print { String str() { ARDUINOJSON_ASSERT(_size < _capacity); - return String(_pool->saveStringFromFreeZone(_size), _size, false); + return String(_pool->saveStringFromFreeZone(_size), _size, String::Copied); } size_t write(uint8_t c) { diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp index 43ae70c93..a71f3e0d0 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp @@ -23,7 +23,7 @@ struct Comparer; template struct Comparer::value>::type> : ComparerBase { - T rhs; + T rhs; // TODO: store adapted string? explicit Comparer(T value) : rhs(value) {} diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp index 6f8076323..27128706f 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp @@ -210,7 +210,7 @@ class VariantData { void setString(String s) { ARDUINOJSON_ASSERT(s); - if (s.isStatic()) + if (s.isLinked()) setType(VALUE_IS_LINKED_STRING); else setType(VALUE_IS_OWNED_STRING); diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp index f45b2b7d0..48c45fb8f 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp @@ -73,9 +73,11 @@ inline T VariantData::asFloat() const { inline String VariantData::asString() const { switch (type()) { case VALUE_IS_LINKED_STRING: - return String(_content.asString.data, _content.asString.size, true); + return String(_content.asString.data, _content.asString.size, + String::Linked); case VALUE_IS_OWNED_STRING: - return String(_content.asString.data, _content.asString.size, false); + return String(_content.asString.data, _content.asString.size, + String::Copied); default: return String(); } @@ -166,14 +168,15 @@ inline VariantConstRef operator|(VariantConstRef preferedValue, // Out of class definition to avoid #1560 inline bool VariantRef::set(char value) const { - return set(value); + return set(static_cast(value)); } +// TODO: move somewhere else template bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool, TCallback callback) { const char *copy = pool->saveString(str); - String storedString(copy, str.size(), false); + String storedString(copy, str.size(), String::Copied); callback(storedString); return copy != 0; } diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp index 0865d6935..31fd02198 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp @@ -119,7 +119,7 @@ class VariantRef : public VariantRefBase, ARDUINOJSON_DEPRECATED( "Support for char is deprecated, use int8_t or uint8_t instead") as() const { - return as(); + return static_cast(as()); } template @@ -265,7 +265,7 @@ class VariantConstRef : public VariantRefBase, ARDUINOJSON_DEPRECATED( "Support for char is deprecated, use int8_t or uint8_t instead") as() const { - return as(); + return static_cast(as()); } template diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantSlot.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantSlot.hpp index 8f4169cc7..83ff1d78b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantSlot.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantSlot.hpp @@ -78,7 +78,7 @@ class VariantSlot { void setKey(String k) { ARDUINOJSON_ASSERT(k); - if (k.isStatic()) + if (k.isLinked()) _flags &= VALUE_MASK; else _flags |= OWNED_KEY_BIT; diff --git a/lib/ArduinoJson/src/ArduinoJson/version.hpp b/lib/ArduinoJson/src/ArduinoJson/version.hpp index 0b4b5febf..d6a23d4c8 100644 --- a/lib/ArduinoJson/src/ArduinoJson/version.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/version.hpp @@ -4,7 +4,7 @@ #pragma once -#define ARDUINOJSON_VERSION "6.19.1" +#define ARDUINOJSON_VERSION "6.19.3" #define ARDUINOJSON_VERSION_MAJOR 6 #define ARDUINOJSON_VERSION_MINOR 19 -#define ARDUINOJSON_VERSION_REVISION 1 +#define ARDUINOJSON_VERSION_REVISION 3 From daaad1ce42e6d53d0669c11181fde81bb913774d Mon Sep 17 00:00:00 2001 From: proddy Date: Thu, 10 Mar 2022 09:53:28 +0100 Subject: [PATCH 098/319] remove obsolete render function --- src/helpers.cpp | 10 +++++----- src/helpers.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/helpers.cpp b/src/helpers.cpp index 5fbcb8792..3320f5037 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -190,11 +190,11 @@ char * Helpers::render_boolean(char * result, bool value) { return result; } -// render for native char strings -char * Helpers::render_value(char * result, const char * value, const int8_t format __attribute__((unused))) { - strcpy(result, value); // un-safe but we don't care - return result; -} +// // render for native char strings +// char * Helpers::render_value(char * result, const char * value, const int8_t format __attribute__((unused))) { +// strcpy(result, value); // un-safe but we don't care +// return result; +// } // convert unsigned int (single byte) to text value and returns it // format: 255(0xFF)=boolean, 0=no formatting, otherwise divide by format diff --git a/src/helpers.h b/src/helpers.h index 2aa33ae68..06a4bb671 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -37,7 +37,7 @@ class Helpers { static char * render_value(char * result, const uint32_t value, const int8_t format, const uint8_t fahrenheit = 0); static char * render_value(char * result, const int16_t value, const int8_t format, const uint8_t fahrenheit = 0); static char * render_value(char * result, const int32_t value, const int8_t format, const uint8_t fahrenheit = 0); - static char * render_value(char * result, const char * value, const int8_t format); + // static char * render_value(char * result, const char * value, const int8_t format); static char * render_boolean(char * result, bool value); static char * hextoa(char * result, const uint8_t value); From df0da84b9fcf086e320e0ad07d9c8ef01471f036 Mon Sep 17 00:00:00 2001 From: proddy Date: Thu, 10 Mar 2022 09:53:56 +0100 Subject: [PATCH 099/319] updated packages again, why not --- interface/package-lock.json | 4650 +++++++++++++++++++---------------- interface/package.json | 4 +- 2 files changed, 2476 insertions(+), 2178 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index e941355c2..f12dff465 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -15,11 +15,11 @@ "@mui/material": "^5.5.0", "@types/lodash": "^4.14.179", "@types/node": "^17.0.21", - "@types/react": "^17.0.39", + "@types/react": "^17.0.40", "@types/react-dom": "^17.0.13", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", - "axios": "^0.26.0", + "axios": "^0.26.1", "http-proxy-middleware": "^2.0.3", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -40,6 +40,17 @@ "npm-run-all": "^4.1.5" } }, + "node_modules/@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -52,33 +63,33 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", - "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", + "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", - "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "version": "7.17.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", + "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", "dependencies": { + "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", + "@babel/generator": "^7.17.3", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.12", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.3", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -89,9 +100,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", - "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", + "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", "dependencies": { "eslint-scope": "^5.1.1", "eslint-visitor-keys": "^2.1.0", @@ -134,11 +145,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", - "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", + "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", "dependencies": { - "@babel/types": "^7.16.8", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -187,9 +198,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", - "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", + "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -207,12 +218,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz", - "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^4.7.1" + "regexpu-core": "^5.0.1" }, "engines": { "node": ">=6.9.0" @@ -319,9 +330,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", + "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -329,8 +340,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -447,13 +458,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", + "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -473,9 +484,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -545,11 +556,11 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", - "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.6", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -561,13 +572,15 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz", - "integrity": "sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz", + "integrity": "sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.1", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.16.7" + "@babel/helper-replace-supers": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.17.0", + "charcodes": "^0.2.0" }, "engines": { "node": ">=6.9.0" @@ -667,11 +680,11 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", - "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", "dependencies": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", @@ -810,9 +823,9 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz", - "integrity": "sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", + "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1097,9 +1110,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", - "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz", + "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==", "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1365,9 +1378,9 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz", - "integrity": "sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", + "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1393,15 +1406,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", - "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", + "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -1468,9 +1481,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", - "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", + "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -1751,9 +1764,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", - "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz", + "integrity": "sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==", "dependencies": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -1776,18 +1789,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", - "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", + "@babel/generator": "^7.17.3", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1796,9 +1809,9 @@ } }, "node_modules/@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1817,6 +1830,121 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.0.3.tgz", + "integrity": "sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", + "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", + "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", + "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.1.tgz", + "integrity": "sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", + "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.0.2.tgz", + "integrity": "sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.7.2", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", @@ -1954,13 +2082,13 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", + "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -1978,9 +2106,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2022,9 +2150,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -2127,15 +2255,15 @@ } }, "node_modules/@jest/console": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.6.tgz", - "integrity": "sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.4.6", - "jest-util": "^27.4.2", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", "slash": "^3.0.0" }, "engines": { @@ -2207,34 +2335,34 @@ } }, "node_modules/@jest/core": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz", - "integrity": "sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", "dependencies": { - "@jest/console": "^27.4.6", - "@jest/reporters": "^27.4.6", - "@jest/test-result": "^27.4.6", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.7", - "jest-haste-map": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.6", - "jest-resolve-dependencies": "^27.4.6", - "jest-runner": "^27.4.6", - "jest-runtime": "^27.4.6", - "jest-snapshot": "^27.4.6", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.6", - "jest-watcher": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", @@ -2317,73 +2445,73 @@ } }, "node_modules/@jest/environment": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz", - "integrity": "sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dependencies": { - "@jest/fake-timers": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^27.4.6" + "jest-mock": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz", - "integrity": "sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^27.4.6", - "jest-mock": "^27.4.6", - "jest-util": "^27.4.2" + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/globals": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz", - "integrity": "sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dependencies": { - "@jest/environment": "^27.4.6", - "@jest/types": "^27.4.2", - "expect": "^27.4.6" + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/reporters": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz", - "integrity": "sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.4.6", - "@jest/test-result": "^27.4.6", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.4.6", - "jest-resolve": "^27.4.6", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.6", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -2475,12 +2603,12 @@ } }, "node_modules/@jest/source-map": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", - "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dependencies": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "source-map": "^0.6.0" }, "engines": { @@ -2496,12 +2624,12 @@ } }, "node_modules/@jest/test-result": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz", - "integrity": "sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dependencies": { - "@jest/console": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -2510,34 +2638,34 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz", - "integrity": "sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", "dependencies": { - "@jest/test-result": "^27.4.6", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.6", - "jest-runtime": "^27.4.6" + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz", - "integrity": "sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dependencies": { "@babel/core": "^7.1.0", - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.6", - "jest-regex-util": "^27.4.0", - "jest-util": "^27.4.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2621,9 +2749,9 @@ } }, "node_modules/@jest/types": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -2699,6 +2827,28 @@ "node": ">=8" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@msgpack/msgpack": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", @@ -3036,9 +3186,9 @@ } }, "node_modules/@rollup/plugin-babel": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", - "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -3505,9 +3655,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "node_modules/@types/express": { "version": "4.17.13", @@ -3608,9 +3758,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz", - "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", + "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==" }, "node_modules/@types/prop-types": { "version": "15.7.4", @@ -3633,9 +3783,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.39", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", - "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", + "version": "17.0.40", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz", + "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3739,9 +3889,9 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, "node_modules/@types/ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.2.tgz", + "integrity": "sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw==", "dependencies": { "@types/node": "*" } @@ -3755,18 +3905,18 @@ } }, "node_modules/@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", - "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", + "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", "dependencies": { - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/type-utils": "5.10.0", - "@typescript-eslint/utils": "5.10.0", + "@typescript-eslint/scope-manager": "5.14.0", + "@typescript-eslint/type-utils": "5.14.0", + "@typescript-eslint/utils": "5.14.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -3806,11 +3956,11 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz", - "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.14.0.tgz", + "integrity": "sha512-ke48La1A/TWAn949cdgQiP3oK0NT7ArhDAOVOmNLVjT/uAXlFyrJY8dM4qqxHrATzIp8glg+G2OZjy2lRKBIUA==", "dependencies": { - "@typescript-eslint/utils": "5.10.0" + "@typescript-eslint/utils": "5.14.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3824,13 +3974,13 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", - "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", + "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", "dependencies": { - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/typescript-estree": "5.10.0", + "@typescript-eslint/scope-manager": "5.14.0", + "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/typescript-estree": "5.14.0", "debug": "^4.3.2" }, "engines": { @@ -3850,12 +4000,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", - "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", + "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", "dependencies": { - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/visitor-keys": "5.10.0" + "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/visitor-keys": "5.14.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3866,11 +4016,11 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", - "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", + "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", "dependencies": { - "@typescript-eslint/utils": "5.10.0", + "@typescript-eslint/utils": "5.14.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -3891,9 +4041,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", - "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", + "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3903,12 +4053,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", - "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", + "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", "dependencies": { - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/visitor-keys": "5.10.0", + "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/visitor-keys": "5.14.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -3943,14 +4093,14 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", - "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", + "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/typescript-estree": "5.10.0", + "@typescript-eslint/scope-manager": "5.14.0", + "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/typescript-estree": "5.14.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -3986,11 +4136,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", - "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", + "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", "dependencies": { - "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/types": "5.14.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -4154,12 +4304,12 @@ "dev": true }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -4316,9 +4466,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4343,11 +4493,6 @@ "ajv": "^6.9.1" } }, - "node_modules/alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -4572,17 +4717,17 @@ } }, "node_modules/axe-core": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", - "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", + "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", - "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "dependencies": { "follow-redirects": "^1.14.8" } @@ -4593,17 +4738,17 @@ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, "node_modules/babel-jest": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.6.tgz", - "integrity": "sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", "dependencies": { - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.4.0", + "babel-preset-jest": "^27.5.1", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { @@ -4760,9 +4905,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", - "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -4805,12 +4950,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", - "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.20.0" + "core-js-compat": "^3.21.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -4855,11 +5000,11 @@ } }, "node_modules/babel-preset-jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", - "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", "dependencies": { - "babel-plugin-jest-hoist": "^27.4.0", + "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -4967,19 +5112,19 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", + "qs": "6.9.7", + "raw-body": "2.4.3", "type-is": "~1.6.18" }, "engines": { @@ -4987,9 +5132,9 @@ } }, "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -5166,14 +5311,14 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", + "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001313", + "electron-to-chromium": "^1.4.76", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" }, "bin": { @@ -5335,9 +5480,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001301", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", - "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==", + "version": "1.0.30001314", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", + "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" @@ -5380,6 +5525,14 @@ "node": ">=10" } }, + "node_modules/charcodes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", + "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/check-types": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", @@ -5430,9 +5583,9 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "node_modules/clean-css": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", - "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", "dependencies": { "source-map": "~0.6.0" }, @@ -5705,9 +5858,9 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { "node": ">= 0.6" } @@ -5718,9 +5871,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/core-js": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", - "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", + "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5728,9 +5881,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", - "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", + "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", "dependencies": { "browserslist": "^4.19.1", "semver": "7.0.0" @@ -5749,9 +5902,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.3.tgz", - "integrity": "sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", + "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5812,11 +5965,11 @@ } }, "node_modules/css-blank-pseudo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.2.tgz", - "integrity": "sha512-hOb1LFjRR+8ocA071xUSmg5VslJ8NGo/I2qpUpdeAYyBVCgupS5O8SEVo4SxEMYyFBNodBkzG3T1iqW9HCXxew==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "dependencies": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" }, "bin": { "css-blank-pseudo": "dist/cli.cjs" @@ -5825,7 +5978,7 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/css-declaration-sorter": { @@ -5843,11 +5996,11 @@ } }, "node_modules/css-has-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.3.tgz", - "integrity": "sha512-0gDYWEKaGacwxCqvQ3Ypg6wGdD1AztbMm5h1JsactG2hP2eiflj808QITmuWBpE7sjSEVrAlZhPTVd/nNMj/hQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dependencies": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" }, "bin": { "css-has-pseudo": "dist/cli.cjs" @@ -5856,21 +6009,21 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/css-loader": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", - "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.2.15", + "postcss": "^8.4.7", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", + "postcss-value-parser": "^4.2.0", "semver": "^7.3.5" }, "engines": { @@ -5936,9 +6089,9 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -5993,9 +6146,9 @@ } }, "node_modules/css-prefers-color-scheme": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", - "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "bin": { "css-prefers-color-scheme": "dist/cli.cjs" }, @@ -6003,7 +6156,7 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/css-select": { @@ -6058,9 +6211,9 @@ } }, "node_modules/cssdb": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", - "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.4.1.tgz", + "integrity": "sha512-R70R/Q1fPlM1D6Y+Kpat0QjiY+aMsY2/8lekdVoYcJ7ZQs9kw71W78FdOMf8DFq975KHQf1089PNg1dLsbAhoA==" }, "node_modules/cssesc": { "version": "3.0.0", @@ -6074,11 +6227,11 @@ } }, "node_modules/cssnano": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.15.tgz", - "integrity": "sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.1.tgz", + "integrity": "sha512-WWfN7jBK/3Uk3oX/jsFbQApDf9DkXj6dOYull5ZaSGskcDggzg3RyDZI4GKKO+00LdfLMEZtY1cwTQUL+YMg2Q==", "dependencies": { - "cssnano-preset-default": "^5.1.10", + "cssnano-preset-default": "^5.2.1", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -6094,39 +6247,39 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.10.tgz", - "integrity": "sha512-BcpSzUVygHMOnp9uG5rfPzTOCb0GAHQkqtUQx8j1oMNF9A1Q8hziOOhiM4bdICpmrBIU85BE64RD5XGYsVQZNA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.1.tgz", + "integrity": "sha512-Y+CUCS5iZ1uzHn5KtmKIlysQVXrTtLCnYsYTOJcbdd5rghOwtw1gobvEXefBncjGO4fWwGZr9/n9hwZfo6W1Fw==", "dependencies": { "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.0.0", - "postcss-calc": "^8.2.0", - "postcss-colormin": "^5.2.3", - "postcss-convert-values": "^5.0.2", - "postcss-discard-comments": "^5.0.1", - "postcss-discard-duplicates": "^5.0.1", - "postcss-discard-empty": "^5.0.1", - "postcss-discard-overridden": "^5.0.2", - "postcss-merge-longhand": "^5.0.4", - "postcss-merge-rules": "^5.0.4", - "postcss-minify-font-values": "^5.0.2", - "postcss-minify-gradients": "^5.0.4", - "postcss-minify-params": "^5.0.3", - "postcss-minify-selectors": "^5.1.1", - "postcss-normalize-charset": "^5.0.1", - "postcss-normalize-display-values": "^5.0.2", - "postcss-normalize-positions": "^5.0.2", - "postcss-normalize-repeat-style": "^5.0.2", - "postcss-normalize-string": "^5.0.2", - "postcss-normalize-timing-functions": "^5.0.2", - "postcss-normalize-unicode": "^5.0.2", - "postcss-normalize-url": "^5.0.4", - "postcss-normalize-whitespace": "^5.0.2", - "postcss-ordered-values": "^5.0.3", - "postcss-reduce-initial": "^5.0.2", - "postcss-reduce-transforms": "^5.0.2", - "postcss-svgo": "^5.0.3", - "postcss-unique-selectors": "^5.0.2" + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.0", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.0", + "postcss-merge-rules": "^5.1.0", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.0", + "postcss-minify-params": "^5.1.0", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.0", + "postcss-ordered-values": "^5.1.0", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -6136,9 +6289,9 @@ } }, "node_modules/cssnano-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.0.tgz", - "integrity": "sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6449,9 +6602,9 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff-sequences": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -6657,9 +6810,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.51", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz", - "integrity": "sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ==" + "version": "1.4.80", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.80.tgz", + "integrity": "sha512-COsbJCGVYCc/aAY4cd94x1Js3q0r406YKGbdL8LXHg0O9dEjuFEFU/vZneRxBxKo/f1lLHi0YyAR7sbFM+i8Bg==" }, "node_modules/emittery": { "version": "0.8.1", @@ -6703,9 +6856,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6731,9 +6884,9 @@ } }, "node_modules/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", + "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", "dependencies": { "stackframe": "^1.1.1" } @@ -6903,11 +7056,11 @@ } }, "node_modules/eslint": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", - "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", + "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", "dependencies": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.2.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -6915,10 +7068,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -6998,9 +7151,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", - "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "dependencies": { "debug": "^3.2.7", "find-up": "^2.1.0" @@ -7194,21 +7347,21 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", - "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz", + "integrity": "sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg==", "dependencies": { "array-includes": "^3.1.4", "array.prototype.flatmap": "^1.2.5", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.entries": "^1.1.5", "object.fromentries": "^2.0.5", "object.hasown": "^1.1.0", "object.values": "^1.1.5", - "prop-types": "^15.7.2", + "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", "string.prototype.matchall": "^4.0.6" @@ -7255,11 +7408,11 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.4.tgz", - "integrity": "sha512-zA/NfAENCsJXujvwwiap5gsqLp2U6X7m2XA5nOksl4zzb6GpUmRNAleCll58rEP0brFVj7DZBprlIlMGIhoC7Q==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.6.tgz", + "integrity": "sha512-mMU4+slZsWKHNxtxc5TE2+bs9S//e2uFPlcpTapPhVdnctgn0+G/DaUu6VbT0JLiVMcbBjy3IcfddK+abZawbw==", "dependencies": { - "@typescript-eslint/experimental-utils": "^5.9.0" + "@typescript-eslint/utils": "^5.13.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0", @@ -7270,9 +7423,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -7307,9 +7460,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -7412,9 +7565,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dependencies": { "type-fest": "^0.20.2" }, @@ -7508,13 +7661,13 @@ } }, "node_modules/espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dependencies": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7681,30 +7834,30 @@ } }, "node_modules/expect": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz", - "integrity": "sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dependencies": { - "@jest/types": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6" + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.19.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -7719,7 +7872,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.9.7", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.17.2", @@ -7975,14 +8128,14 @@ } }, "node_modules/flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "node_modules/follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "funding": [ { "type": "individual", @@ -8175,9 +8328,9 @@ } }, "node_modules/fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "engines": { "node": "*" }, @@ -8195,9 +8348,9 @@ } }, "node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -8509,9 +8662,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -8726,9 +8879,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", - "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==" + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" }, "node_modules/http-proxy": { "version": "1.18.1", @@ -9428,9 +9581,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", - "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -9462,13 +9615,13 @@ "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" }, "node_modules/jest": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.7.tgz", - "integrity": "sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dependencies": { - "@jest/core": "^27.4.7", + "@jest/core": "^27.5.1", "import-local": "^3.0.2", - "jest-cli": "^27.4.7" + "jest-cli": "^27.5.1" }, "bin": { "jest": "bin/jest.js" @@ -9486,11 +9639,11 @@ } }, "node_modules/jest-changed-files": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", - "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "execa": "^5.0.0", "throat": "^6.0.1" }, @@ -9499,26 +9652,26 @@ } }, "node_modules/jest-circus": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.6.tgz", - "integrity": "sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", "dependencies": { - "@jest/environment": "^27.4.6", - "@jest/test-result": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.4.6", + "expect": "^27.5.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.6", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-runtime": "^27.4.6", - "jest-snapshot": "^27.4.6", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.6", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" @@ -9592,20 +9745,20 @@ } }, "node_modules/jest-cli": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.7.tgz", - "integrity": "sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", "dependencies": { - "@jest/core": "^27.4.7", - "@jest/test-result": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^27.4.7", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.6", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "prompts": "^2.0.1", "yargs": "^16.2.0" }, @@ -9689,32 +9842,34 @@ } }, "node_modules/jest-config": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.7.tgz", - "integrity": "sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", "dependencies": { "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.4.6", - "@jest/types": "^27.4.2", - "babel-jest": "^27.4.6", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.6", - "jest-environment-jsdom": "^27.4.6", - "jest-environment-node": "^27.4.6", - "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.6", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.6", - "jest-runner": "^27.4.6", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "micromatch": "^4.0.4", - "pretty-format": "^27.4.6", - "slash": "^3.0.0" + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -9793,14 +9948,14 @@ } }, "node_modules/jest-diff": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz", - "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -9871,9 +10026,9 @@ } }, "node_modules/jest-docblock": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", - "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", "dependencies": { "detect-newline": "^3.0.0" }, @@ -9882,15 +10037,15 @@ } }, "node_modules/jest-each": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.6.tgz", - "integrity": "sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.6" + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -9961,16 +10116,16 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz", - "integrity": "sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", "dependencies": { - "@jest/environment": "^27.4.6", - "@jest/fake-timers": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^27.4.6", - "jest-util": "^27.4.2", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", "jsdom": "^16.6.0" }, "engines": { @@ -9978,44 +10133,44 @@ } }, "node_modules/jest-environment-node": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.6.tgz", - "integrity": "sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", "dependencies": { - "@jest/environment": "^27.4.6", - "@jest/fake-timers": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^27.4.6", - "jest-util": "^27.4.2" + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-get-type": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-haste-map": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.6.tgz", - "integrity": "sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.4.0", - "jest-serializer": "^27.4.0", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -10027,26 +10182,26 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz", - "integrity": "sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", "dependencies": { - "@jest/environment": "^27.4.6", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.4.6", + "expect": "^27.5.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.6", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-runtime": "^27.4.6", - "jest-snapshot": "^27.4.6", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.6", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", "throat": "^6.0.1" }, "engines": { @@ -10118,26 +10273,26 @@ } }, "node_modules/jest-leak-detector": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz", - "integrity": "sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", "dependencies": { - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz", - "integrity": "sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.4.6", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10208,17 +10363,17 @@ } }, "node_modules/jest-message-util": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz", - "integrity": "sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^27.4.6", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -10291,11 +10446,11 @@ } }, "node_modules/jest-mock": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.6.tgz", - "integrity": "sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/node": "*" }, "engines": { @@ -10319,25 +10474,25 @@ } }, "node_modules/jest-regex-util": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", - "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.6.tgz", - "integrity": "sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.6", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" @@ -10347,13 +10502,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz", - "integrity": "sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", "dependencies": { - "@jest/types": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.6" + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10424,30 +10579,29 @@ } }, "node_modules/jest-runner": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.6.tgz", - "integrity": "sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", "dependencies": { - "@jest/console": "^27.4.6", - "@jest/environment": "^27.4.6", - "@jest/test-result": "^27.4.6", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.6", - "jest-environment-node": "^27.4.6", - "jest-haste-map": "^27.4.6", - "jest-leak-detector": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-resolve": "^27.4.6", - "jest-runtime": "^27.4.6", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -10520,30 +10674,30 @@ } }, "node_modules/jest-runtime": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.6.tgz", - "integrity": "sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", "dependencies": { - "@jest/environment": "^27.4.6", - "@jest/fake-timers": "^27.4.6", - "@jest/globals": "^27.4.6", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.6", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-mock": "^27.4.6", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.6", - "jest-snapshot": "^27.4.6", - "jest-util": "^27.4.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -10616,43 +10770,43 @@ } }, "node_modules/jest-serializer": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", - "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "dependencies": { "@types/node": "*", - "graceful-fs": "^4.2.4" + "graceful-fs": "^4.2.9" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-snapshot": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.6.tgz", - "integrity": "sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.4.6", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.4.6", - "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.6", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-util": "^27.4.2", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^27.4.6", + "pretty-format": "^27.5.1", "semver": "^7.3.2" }, "engines": { @@ -10738,15 +10892,15 @@ } }, "node_modules/jest-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", - "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { @@ -10818,16 +10972,16 @@ } }, "node_modules/jest-validate": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.6.tgz", - "integrity": "sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dependencies": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", + "jest-get-type": "^27.5.1", "leven": "^3.1.0", - "pretty-format": "^27.4.6" + "pretty-format": "^27.5.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10958,9 +11112,9 @@ } }, "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.0.tgz", - "integrity": "sha512-oGu2QekBMXgyQNWPDRQ001bjvDnZe4/zBTz37TMbiKz1NbNiyiH5hRkobe7npRN6GfbGbxMYFck/vQ1r9c1VMA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", "engines": { "node": ">=12.20" } @@ -11041,16 +11195,16 @@ } }, "node_modules/jest-watcher": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.6.tgz", - "integrity": "sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", "dependencies": { - "@jest/test-result": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.4.2", + "jest-util": "^27.5.1", "string-length": "^4.0.1" }, "engines": { @@ -11122,9 +11276,9 @@ } }, "node_modules/jest-worker": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", - "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -11543,11 +11697,11 @@ } }, "node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dependencies": { - "sourcemap-codec": "^1.4.4" + "sourcemap-codec": "^1.4.8" } }, "node_modules/make-dir": { @@ -11691,9 +11845,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz", - "integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", "dependencies": { "schema-utils": "^4.0.0" }, @@ -11709,9 +11863,9 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -11763,9 +11917,9 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11812,9 +11966,9 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "node_modules/nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11828,9 +11982,9 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -11869,9 +12023,9 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" }, "node_modules/nodemon": { "version": "2.0.15", @@ -12528,9 +12682,9 @@ } }, "node_modules/pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "engines": { "node": ">= 6" } @@ -12683,13 +12837,13 @@ } }, "node_modules/postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", + "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", "dependencies": { - "nanoid": "^3.1.30", + "nanoid": "^3.3.1", "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -12723,21 +12877,21 @@ } }, "node_modules/postcss-calc": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz", - "integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "dependencies": { - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.2" } }, "node_modules/postcss-color-functional-notation": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.1.tgz", - "integrity": "sha512-62OBIXCjRXpQZcFOYIXwXBlpAVWrYk8ek1rcjvMING4Q2cf0ipyN9qT+BhHA6HmftGSEnFQu2qgKO3gMscl3Rw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -12745,13 +12899,13 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-color-hex-alpha": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.2.tgz", - "integrity": "sha512-gyx8RgqSmGVK156NAdKcsfkY3KPGHhKqvHTL3hhveFrBBToguKFzhyiuk3cljH6L4fJ0Kv+JENuPXs1Wij27Zw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -12759,7 +12913,7 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-color-rebeccapurple": { @@ -12777,9 +12931,9 @@ } }, "node_modules/postcss-colormin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.3.tgz", - "integrity": "sha512-dra4xoAjub2wha6RUXAgadHEn2lGxbj8drhFcIGLOMn914Eu7DkPUurugDXgstwttCYkJtZ/+PkWRWdp3UHRIA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", @@ -12794,11 +12948,11 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", - "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", + "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", "dependencies": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -12819,9 +12973,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.3.tgz", - "integrity": "sha512-rtu3otIeY532PnEuuBrIIe+N+pcdbX/7JMZfrcL09wc78YayrHw5E8UkDfvnlOhEUrI4ptCuzXQfj+Or6spbGA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.4.tgz", + "integrity": "sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -12829,7 +12983,7 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-custom-selectors": { @@ -12847,23 +13001,23 @@ } }, "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.3.tgz", - "integrity": "sha512-qiPm+CNAlgXiMf0J5IbBBEXA9l/Q5HGsNGkL3znIwT2ZFRLGY9U2fTUpa4lqCUXQOxaLimpacHeQC80BD2qbDw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", "dependencies": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-discard-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", - "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -12872,9 +13026,9 @@ } }, "node_modules/postcss-discard-duplicates": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", - "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -12883,9 +13037,9 @@ } }, "node_modules/postcss-discard-empty": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", - "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.0.tgz", + "integrity": "sha512-782T/buGgb3HOuHOJAHpdyKzAAKsv/BxWqsutnZ+QsiHEcDkY7v+6WWdturuBiSal6XMOO1p1aJvwXdqLD5vhA==", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -12894,9 +13048,9 @@ } }, "node_modules/postcss-discard-overridden": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.2.tgz", - "integrity": "sha512-+56BLP6NSSUuWUXjRgAQuho1p5xs/hU5Sw7+xt9S3JSg+7R6+WMGnJW7Hre/6tTuZ2xiXMB42ObkiZJ2hy/Pew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -12905,23 +13059,24 @@ } }, "node_modules/postcss-double-position-gradients": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.4.tgz", - "integrity": "sha512-qz+s5vhKJlsHw8HjSs+HVk2QGFdRyC68KGRQGX3i+GcnUjhWhXQEmCXW6siOJkZ1giu0ddPwSO6I6JdVVVPoog==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", + "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-env-function": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.4.tgz", - "integrity": "sha512-0ltahRTPtXSIlEZFv7zIvdEib7HN0ZbUQxrxIKn8KbiRyhALo854I/CggU5lyZe6ZBvSTJ6Al2vkZecI2OhneQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.5.tgz", + "integrity": "sha512-gPUJc71ji9XKyl0WSzAalBeEA/89kU+XpffpPxSaaaZ1c48OL36r1Ep5R6+9XAPkIiDlSvVAwP4io12q/vTcvA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -12929,7 +13084,7 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-flexbugs-fixes": { @@ -12941,31 +13096,31 @@ } }, "node_modules/postcss-focus-visible": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.3.tgz", - "integrity": "sha512-ozOsg+L1U8S+rxSHnJJiET6dNLyADcPHhEarhhtCI9DBLGOPG/2i4ddVoFch9LzrBgb8uDaaRI4nuid2OM82ZA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "dependencies": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-focus-within": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.3.tgz", - "integrity": "sha512-fk9y2uFS6/Kpp7/A9Hz9Z4rlFQ8+tzgBcQCXAFSrXFGAbKx+4ZZOmmfHuYjCOMegPWoz0pnC6fNzi8j7Xyqp5Q==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "dependencies": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-font-variant": { @@ -12977,20 +13132,20 @@ } }, "node_modules/postcss-gap-properties": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", - "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-image-set-function": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.4.tgz", - "integrity": "sha512-BlEo9gSTj66lXjRNByvkMK9dEdEGFXRfGjKRi9fo8s0/P3oEk74cAoonl/utiM50E2OPVb/XSu+lWvdW4KtE/Q==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -12998,7 +13153,7 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-initial": { @@ -13028,23 +13183,24 @@ } }, "node_modules/postcss-lab-function": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.3.tgz", - "integrity": "sha512-MH4tymWmefdZQ7uVG/4icfLjAQmH6o2NRYyVh2mKoB4RXJp9PjsyhZwhH4ouaCQHvg+qJVj3RzeAR1EQpIlXZA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.2.tgz", + "integrity": "sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==", "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-load-config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", - "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", + "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", "dependencies": { "lilconfig": "^2.0.4", "yaml": "^1.10.2" @@ -13116,14 +13272,14 @@ } }, "node_modules/postcss-logical": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", - "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-media-minmax": { @@ -13138,12 +13294,12 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz", - "integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.0.tgz", + "integrity": "sha512-Gr46srN2tsLD8fudKYoHO56RG0BLQ2nsBRnSZGY04eNBPwTeWa9KeHrbL3tOLAHyB2aliikycPH2TMJG1U+W6g==", "dependencies": { - "postcss-value-parser": "^4.1.0", - "stylehacks": "^5.0.1" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -13153,13 +13309,13 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.4.tgz", - "integrity": "sha512-yOj7bW3NxlQxaERBB0lEY1sH5y+RzevjbdH4DBJurjKERNpknRByFNdNe+V72i5pIZL12woM9uGdS5xbSB+kDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.0.tgz", + "integrity": "sha512-NecukEJovQ0mG7h7xV8wbYAkXGTO3MPKnXvuiXzOKcxoOodfTTKYjeo8TMhAswlSkjcPIBlnKbSFcTuVSDaPyQ==", "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" }, "engines": { @@ -13170,9 +13326,9 @@ } }, "node_modules/postcss-minify-font-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.2.tgz", - "integrity": "sha512-R6MJZryq28Cw0AmnyhXrM7naqJZZLoa1paBltIzh2wM7yb4D45TLur+eubTQ4jCmZU9SGeZdWsc5KcSoqTMeTg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13184,12 +13340,12 @@ } }, "node_modules/postcss-minify-gradients": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.4.tgz", - "integrity": "sha512-RVwZA7NC4R4J76u8X0Q0j+J7ItKUWAeBUJ8oEEZWmtv3Xoh19uNJaJwzNpsydQjk6PkuhRrK+YwwMf+c+68EYg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.0.tgz", + "integrity": "sha512-J/TMLklkONn3LuL8wCwfwU8zKC1hpS6VcxFkNUNjmVt53uKqrrykR3ov11mdUYyqVMEx67slMce0tE14cE4DTg==", "dependencies": { "colord": "^2.9.1", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -13200,13 +13356,12 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.3.tgz", - "integrity": "sha512-NY92FUikE+wralaiVexFd5gwb7oJTIDhgTNeIw89i1Ymsgt4RWiPXfz3bg7hDy4NL6gepcThJwOYNtZO/eNi7Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.0.tgz", + "integrity": "sha512-q67dcts4Hct6x8+JmhBgctHkbvUsqGIg2IItenjE63iZXMbhjr7AlVZkNnKtIGt/1Wsv7p/7YzeSII6Q+KPXRg==", "dependencies": { - "alphanum-sort": "^1.0.2", "browserslist": "^4.16.6", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -13217,11 +13372,10 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.1.tgz", - "integrity": "sha512-TOzqOPXt91O2luJInaVPiivh90a2SIK5Nf1Ea7yEIM/5w+XA5BGrZGUSW8aEx9pJ/oNj7ZJBhjvigSiBV+bC1Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", "dependencies": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" }, "engines": { @@ -13305,17 +13459,17 @@ } }, "node_modules/postcss-nesting": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", - "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.3.tgz", + "integrity": "sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==", "dependencies": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-normalize": { @@ -13336,9 +13490,9 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", - "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -13347,9 +13501,9 @@ } }, "node_modules/postcss-normalize-display-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz", - "integrity": "sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13361,9 +13515,9 @@ } }, "node_modules/postcss-normalize-positions": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.2.tgz", - "integrity": "sha512-tqghWFVDp2btqFg1gYob1etPNxXLNh3uVeWgZE2AQGh6b2F8AK2Gj36v5Vhyh+APwIzNjmt6jwZ9pTBP+/OM8g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13375,9 +13529,9 @@ } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.2.tgz", - "integrity": "sha512-/rIZn8X9bBzC7KvY4iKUhXUGW3MmbXwfPF23jC9wT9xTi7kAvgj8sEgwxjixBmoL6MVa4WOgxNz2hAR6wTK8tw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13389,9 +13543,9 @@ } }, "node_modules/postcss-normalize-string": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.2.tgz", - "integrity": "sha512-zaI1yzwL+a/FkIzUWMQoH25YwCYxi917J4pYm1nRXtdgiCdnlTkx5eRzqWEC64HtRa06WCJ9TIutpb6GmW4gFw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13403,9 +13557,9 @@ } }, "node_modules/postcss-normalize-timing-functions": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz", - "integrity": "sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13417,9 +13571,9 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.2.tgz", - "integrity": "sha512-3y/V+vjZ19HNcTizeqwrbZSUsE69ZMRHfiiyLAJb7C7hJtYmM4Gsbajy7gKagu97E8q5rlS9k8FhojA8cpGhWw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", "dependencies": { "browserslist": "^4.16.6", "postcss-value-parser": "^4.2.0" @@ -13432,9 +13586,9 @@ } }, "node_modules/postcss-normalize-url": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz", - "integrity": "sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" @@ -13447,9 +13601,9 @@ } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.2.tgz", - "integrity": "sha512-CXBx+9fVlzSgbk0IXA/dcZn9lXixnQRndnsPC5ht3HxlQ1bVh77KQDL1GffJx1LTzzfae8ftMulsjYmO2yegxA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.0.tgz", + "integrity": "sha512-7O1FanKaJkpWFyCghFzIkLhehujV/frGkdofGLwhg5upbLyGsSfiTcZAdSzoPsSUgyPCkBkNMeWR8yVgPdQybg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13460,12 +13614,30 @@ "postcss": "^8.2.15" } }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", + "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^12 || ^14 || >=16" + } + }, "node_modules/postcss-ordered-values": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.3.tgz", - "integrity": "sha512-T9pDS+P9bWeFvqivXd5ACzQmrCmHjv3ZP+djn8E1UZY7iK79pFSm7i3WbKw2VSmFmdbMm8sQ12OPcNpzBo3Z2w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.0.tgz", + "integrity": "sha512-wU4Z4D4uOIH+BUKkYid36gGDJNQtkVJT7Twv8qH6UyfttbbJWyw4/xIPuVEkkCtQLAJ0EdsNSh8dlvqkXb49TA==", "dependencies": { - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -13476,14 +13648,14 @@ } }, "node_modules/postcss-overflow-shorthand": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", - "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-page-break": { @@ -13495,9 +13667,9 @@ } }, "node_modules/postcss-place": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.3.tgz", - "integrity": "sha512-tDQ3m+GYoOar+KoQgj+pwPAvGHAp/Sby6vrFiyrELrMKQJ4AejL0NcS0mm296OKKYA2SRg9ism/hlT/OLhBrdQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13505,47 +13677,56 @@ "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-preset-env": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", - "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.2.tgz", + "integrity": "sha512-AmOkb8AeNNQwE/z2fHl1iwOIt8J50V8WR0rmLagcgIDoqlJZWjV3NdtOPnLGco1oN8DZe+Ss5B9ULbBeS6HfeA==", "dependencies": { + "@csstools/postcss-color-function": "^1.0.2", + "@csstools/postcss-font-format-keywords": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.0", + "@csstools/postcss-ic-unit": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.0", + "@csstools/postcss-oklab-function": "^1.0.1", + "@csstools/postcss-progressive-custom-properties": "^1.2.0", "autoprefixer": "^10.4.2", - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001299", - "css-blank-pseudo": "^3.0.2", - "css-has-pseudo": "^3.0.3", - "css-prefers-color-scheme": "^6.0.2", - "cssdb": "^5.0.0", + "browserslist": "^4.19.3", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^6.4.0", "postcss-attribute-case-insensitive": "^5.0.0", - "postcss-color-functional-notation": "^4.2.1", - "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-functional-notation": "^4.2.2", + "postcss-color-hex-alpha": "^8.0.3", "postcss-color-rebeccapurple": "^7.0.2", "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.2", + "postcss-custom-properties": "^12.1.4", "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.3", - "postcss-double-position-gradients": "^3.0.4", - "postcss-env-function": "^4.0.4", - "postcss-focus-visible": "^6.0.3", - "postcss-focus-within": "^5.0.3", + "postcss-dir-pseudo-class": "^6.0.4", + "postcss-double-position-gradients": "^3.1.0", + "postcss-env-function": "^4.0.5", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.2", - "postcss-image-set-function": "^4.0.4", + "postcss-gap-properties": "^3.0.3", + "postcss-image-set-function": "^4.0.6", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.0.3", - "postcss-logical": "^5.0.3", + "postcss-lab-function": "^4.1.1", + "postcss-logical": "^5.0.4", "postcss-media-minmax": "^5.0.0", "postcss-nesting": "^10.1.2", - "postcss-overflow-shorthand": "^3.0.2", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.3", "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.3", - "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-place": "^7.0.4", + "postcss-pseudo-class-any-link": "^7.1.1", "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0" + "postcss-selector-not": "^5.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" @@ -13555,23 +13736,23 @@ } }, "node_modules/postcss-pseudo-class-any-link": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.2.tgz", - "integrity": "sha512-CG35J1COUH7OOBgpw5O+0koOLUd5N4vUGKUqSAuIe4GiuLHWU96Pqp+UPC8QITTd12zYAFx76pV7qWT/0Aj/TA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz", + "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==", "dependencies": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/postcss-reduce-initial": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz", - "integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0" @@ -13584,9 +13765,9 @@ } }, "node_modules/postcss-reduce-transforms": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.2.tgz", - "integrity": "sha512-25HeDeFsgiPSUx69jJXZn8I06tMxLQJJNF5h7i9gsUg8iP4KOOJ8EX8fj3seeoLt3SLU2YDD6UPnDYVGUO7DEA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13629,11 +13810,11 @@ } }, "node_modules/postcss-svgo": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", - "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dependencies": { - "postcss-value-parser": "^4.1.0", + "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" }, "engines": { @@ -13697,11 +13878,10 @@ } }, "node_modules/postcss-unique-selectors": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz", - "integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dependencies": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" }, "engines": { @@ -13754,9 +13934,9 @@ } }, "node_modules/pretty-format": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", - "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -13888,9 +14068,9 @@ } }, "node_modules/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "engines": { "node": ">=0.6" }, @@ -13953,11 +14133,11 @@ } }, "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" @@ -13967,9 +14147,9 @@ } }, "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -14460,15 +14640,26 @@ "node": ">=0.10.0" } }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dependencies": { "regenerate": "^1.4.2" }, @@ -14521,14 +14712,14 @@ } }, "node_modules/regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" }, @@ -14561,14 +14752,14 @@ } }, "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "node_modules/regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dependencies": { "jsesc": "~0.5.0" }, @@ -14773,9 +14964,9 @@ } }, "node_modules/rollup": { - "version": "2.66.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", - "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", + "version": "2.70.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.0.tgz", + "integrity": "sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==", "bin": { "rollup": "dist/bin/rollup" }, @@ -14878,9 +15069,9 @@ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, "node_modules/sass-loader": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", - "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -14896,6 +15087,7 @@ "fibers": ">= 3.1.0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "sass": "^1.3.0", + "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { @@ -14907,6 +15099,9 @@ }, "sass": { "optional": true + }, + "sass-embedded": { + "optional": true } } }, @@ -15150,9 +15345,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -15240,12 +15435,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated" - }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -15341,9 +15530,9 @@ } }, "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", + "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" }, "node_modules/statuses": { "version": "1.5.0", @@ -15557,11 +15746,11 @@ } }, "node_modules/stylehacks": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", - "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", "dependencies": { - "browserslist": "^4.16.0", + "browserslist": "^4.16.6", "postcss-selector-parser": "^6.0.4" }, "engines": { @@ -15720,30 +15909,31 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/tailwindcss": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.15.tgz", - "integrity": "sha512-bT2iy7FtjwgsXik4ZoJnHXR+SRCiGR1W95fVqpLZebr64m4ahwUwRbIAc5w5+2fzr1YF4Ct2eI7dojMRRl8sVQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", + "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", "dependencies": { "arg": "^5.0.1", "chalk": "^4.1.2", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "color-name": "^1.1.4", "cosmiconfig": "^7.0.1", "detective": "^5.2.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "normalize-path": "^3.0.0", "object-hash": "^2.2.0", + "postcss": "^8.4.6", "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.0", "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.8", + "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", - "resolve": "^1.21.0" + "resolve": "^1.22.0" }, "bin": { "tailwind": "lib/cli.js", @@ -15907,10 +16097,11 @@ } }, "node_modules/terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.0.tgz", + "integrity": "sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==", "dependencies": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", "source-map-support": "~0.5.20" @@ -15920,22 +16111,14 @@ }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "acorn": "^8.5.0" - }, - "peerDependenciesMeta": { - "acorn": { - "optional": true - } } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", - "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dependencies": { - "jest-worker": "^27.4.1", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", @@ -16108,9 +16291,9 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, "node_modules/tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz", + "integrity": "sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw==", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", @@ -16593,12 +16776,12 @@ } }, "node_modules/webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dependencies": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -16606,7 +16789,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -16639,12 +16822,12 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", - "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.2.2", + "memfs": "^3.4.1", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -16661,9 +16844,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16710,18 +16893,19 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", - "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", + "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/sockjs": "^0.3.33", "@types/ws": "^8.2.2", "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", @@ -16741,8 +16925,8 @@ "sockjs": "^0.3.21", "spdy": "^4.0.2", "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.0", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -16760,9 +16944,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16834,9 +17018,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "engines": { "node": ">=10.0.0" }, @@ -17026,26 +17210,26 @@ } }, "node_modules/workbox-background-sync": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.4.2.tgz", - "integrity": "sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.1.tgz", + "integrity": "sha512-T5a35fagLXQvV8Dr4+bDU+XYsP90jJ3eBLjZMKuCNELMQZNj+VekCODz1QK44jgoBeQk+vp94pkZV6G+e41pgg==", "dependencies": { "idb": "^6.1.4", - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/workbox-broadcast-update": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.4.2.tgz", - "integrity": "sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.1.tgz", + "integrity": "sha512-mb/oyblyEpDbw167cCTyHnC3RqCnCQHtFYuYZd+QTpuExxM60qZuBH1AuQCgvLtDcztBKdEYK2VFD9SZYgRbaQ==", "dependencies": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/workbox-build": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.4.2.tgz", - "integrity": "sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.1.tgz", + "integrity": "sha512-coDUDzHvFZ1ADOl3wKCsCSyOBvkPKlPgcQDb6LMMShN1zgF31Mev/1HzN3+9T2cjjWAgFwZKkuRyExqc1v21Zw==", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -17065,35 +17249,34 @@ "rollup": "^2.43.1", "rollup-plugin-terser": "^7.0.0", "source-map": "^0.8.0-beta.0", - "source-map-url": "^0.4.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.4.2", - "workbox-broadcast-update": "6.4.2", - "workbox-cacheable-response": "6.4.2", - "workbox-core": "6.4.2", - "workbox-expiration": "6.4.2", - "workbox-google-analytics": "6.4.2", - "workbox-navigation-preload": "6.4.2", - "workbox-precaching": "6.4.2", - "workbox-range-requests": "6.4.2", - "workbox-recipes": "6.4.2", - "workbox-routing": "6.4.2", - "workbox-strategies": "6.4.2", - "workbox-streams": "6.4.2", - "workbox-sw": "6.4.2", - "workbox-window": "6.4.2" + "workbox-background-sync": "6.5.1", + "workbox-broadcast-update": "6.5.1", + "workbox-cacheable-response": "6.5.1", + "workbox-core": "6.5.1", + "workbox-expiration": "6.5.1", + "workbox-google-analytics": "6.5.1", + "workbox-navigation-preload": "6.5.1", + "workbox-precaching": "6.5.1", + "workbox-range-requests": "6.5.1", + "workbox-recipes": "6.5.1", + "workbox-routing": "6.5.1", + "workbox-strategies": "6.5.1", + "workbox-streams": "6.5.1", + "workbox-sw": "6.5.1", + "workbox-window": "6.5.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz", - "integrity": "sha512-JdEazx7qiVqTBzzBl5rolRwl5cmhihjfIcpqRzIZjtT6b18liVmDn/VlWpqW4C/qP2hrFFMLRV1wlex8ZVBPTg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz", + "integrity": "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==", "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", @@ -17107,9 +17290,9 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -17175,118 +17358,117 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.2.tgz", - "integrity": "sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.1.tgz", + "integrity": "sha512-3TdtH/luDiytmM+Cn72HCBLZXmbeRNJqZx2yaVOfUZhj0IVwZqQXhNarlGE9/k6U5Jelb+TtpH2mLVhnzfiSMg==", "dependencies": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/workbox-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.2.tgz", - "integrity": "sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.1.tgz", + "integrity": "sha512-qObXZ39aFJ2N8X7IUbGrJHKWguliCuU1jOXM/I4MTT84u9BiKD2rHMkIzgeRP1Ixu9+cXU4/XHJq3Cy0Qqc5hw==" }, "node_modules/workbox-expiration": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.2.tgz", - "integrity": "sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.1.tgz", + "integrity": "sha512-iY/cTADAQATMmPkUBRmQdacqq0TJd2wMHimBQz+tRnPGHSMH+/BoLPABPnu7O7rT/g/s59CUYYRGxe3mEgoJCA==", "dependencies": { "idb": "^6.1.4", - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/workbox-google-analytics": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.4.2.tgz", - "integrity": "sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.1.tgz", + "integrity": "sha512-qZU46/h4dbionYT6Yk6iBkUwpiEzAfnO1W7KkI+AMmY7G9/gA03dQQ7rpTw8F4vWrG7ahTUGWDFv6fERtaw1BQ==", "dependencies": { - "workbox-background-sync": "6.4.2", - "workbox-core": "6.4.2", - "workbox-routing": "6.4.2", - "workbox-strategies": "6.4.2" + "workbox-background-sync": "6.5.1", + "workbox-core": "6.5.1", + "workbox-routing": "6.5.1", + "workbox-strategies": "6.5.1" } }, "node_modules/workbox-navigation-preload": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.4.2.tgz", - "integrity": "sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.1.tgz", + "integrity": "sha512-aKrgAbn2IMgzTowTi/ZyKdQUcES2m++9aGtpxqsX7Gn9ovCY8zcssaMEAMMwrIeveij5HiWNBrmj6MWDHi+0rg==", "dependencies": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/workbox-precaching": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.2.tgz", - "integrity": "sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.1.tgz", + "integrity": "sha512-EzlPBxvmjGfE56YZzsT/vpVkpLG1XJhoplgXa5RPyVWLUL1LbwEAxhkrENElSS/R9tgiTw80IFwysidfUqLihg==", "dependencies": { - "workbox-core": "6.4.2", - "workbox-routing": "6.4.2", - "workbox-strategies": "6.4.2" + "workbox-core": "6.5.1", + "workbox-routing": "6.5.1", + "workbox-strategies": "6.5.1" } }, "node_modules/workbox-range-requests": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.4.2.tgz", - "integrity": "sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.1.tgz", + "integrity": "sha512-57Da/qRbd9v33YlHX0rlSUVFmE4THCjKqwkmfhY3tNLnSKN2L5YBS3qhWeDO0IrMNgUj+rGve2moKYXeUqQt4A==", "dependencies": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/workbox-recipes": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.4.2.tgz", - "integrity": "sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.1.tgz", + "integrity": "sha512-DGsyKygHggcGPQpWafC/Nmbm1Ny3sB2vE9r//3UbeidXiQ+pLF14KEG1/0NNGRaY+lfOXOagq6d1H7SC8KA+rA==", "dependencies": { - "workbox-cacheable-response": "6.4.2", - "workbox-core": "6.4.2", - "workbox-expiration": "6.4.2", - "workbox-precaching": "6.4.2", - "workbox-routing": "6.4.2", - "workbox-strategies": "6.4.2" + "workbox-cacheable-response": "6.5.1", + "workbox-core": "6.5.1", + "workbox-expiration": "6.5.1", + "workbox-precaching": "6.5.1", + "workbox-routing": "6.5.1", + "workbox-strategies": "6.5.1" } }, "node_modules/workbox-routing": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.2.tgz", - "integrity": "sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.1.tgz", + "integrity": "sha512-yAAncdTwanvlR8KPjubyvFKeAok8ZcIws6UKxvIAg0I+wsf7UYi93DXNuZr6RBSQrByrN6HkCyjuhmk8P63+PA==", "dependencies": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/workbox-strategies": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.2.tgz", - "integrity": "sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.1.tgz", + "integrity": "sha512-JNaTXPy8wXzKkr+6za7/eJX9opoZk7UgY261I2kPxl80XQD8lMjz0vo9EOcBwvD72v3ZhGJbW84ZaDwFEhFvWA==", "dependencies": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/workbox-streams": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.4.2.tgz", - "integrity": "sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.1.tgz", + "integrity": "sha512-7jaTWm6HRGJ/ewECnhb+UgjTT50R42E0/uNCC4eTKQwnLO/NzNGjoXTdQgFjo4zteR+L/K6AtFAiYKH3ZJbAYw==", "dependencies": { - "workbox-core": "6.4.2", - "workbox-routing": "6.4.2" + "workbox-core": "6.5.1", + "workbox-routing": "6.5.1" } }, "node_modules/workbox-sw": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.4.2.tgz", - "integrity": "sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.1.tgz", + "integrity": "sha512-hVrQa19yo9wzN1fQQ/h2JlkzFpkuH2qzYT2/rk7CLaWt6tLnTJVFCNHlGRRPhytZSf++LoIy7zThT714sowT/Q==" }, "node_modules/workbox-webpack-plugin": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.4.2.tgz", - "integrity": "sha512-CiEwM6kaJRkx1cP5xHksn13abTzUqMHiMMlp5Eh/v4wRcedgDTyv6Uo8+Hg9MurRbHDosO5suaPyF9uwVr4/CQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.1.tgz", + "integrity": "sha512-SHtlQBpKruI16CAYhICDMkgjXE2fH5Yp+D+1UmBfRVhByZYzusVOykvnPm8ObJb9d/tXgn9yoppoxafFS7D4vQ==", "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", - "source-map-url": "^0.4.0", "upath": "^1.2.0", "webpack-sources": "^1.4.3", - "workbox-build": "6.4.2" + "workbox-build": "6.5.1" }, "engines": { "node": ">=10.0.0" @@ -17313,12 +17495,12 @@ } }, "node_modules/workbox-window": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.4.2.tgz", - "integrity": "sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.1.tgz", + "integrity": "sha512-oRlun9u7b7YEjo2fIDBqJkU2hXtrEljXcOytRhfeQRbqXxjUOpFgXSGRSAkmDx1MlKUNOSbr+zfi8h5n7In3yA==", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "node_modules/wrap-ansi": { @@ -17384,9 +17566,9 @@ } }, "node_modules/ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "engines": { "node": ">=8.3.0" }, @@ -17489,6 +17671,14 @@ } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -17498,36 +17688,36 @@ } }, "@babel/compat-data": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", - "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", + "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==" }, "@babel/core": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", - "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "version": "7.17.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", + "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", "requires": { + "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", + "@babel/generator": "^7.17.3", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.12", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.3", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "semver": "^6.3.0" } }, "@babel/eslint-parser": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", - "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", + "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", "requires": { "eslint-scope": "^5.1.1", "eslint-visitor-keys": "^2.1.0", @@ -17556,11 +17746,11 @@ } }, "@babel/generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", - "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", + "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", "requires": { - "@babel/types": "^7.16.8", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -17594,9 +17784,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", - "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", + "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -17608,12 +17798,12 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz", - "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^4.7.1" + "regexpu-core": "^5.0.1" } }, "@babel/helper-define-polyfill-provider": { @@ -17690,9 +17880,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", + "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -17700,8 +17890,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/helper-optimise-call-expression": { @@ -17785,13 +17975,13 @@ } }, "@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", + "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" } }, "@babel/highlight": { @@ -17805,9 +17995,9 @@ } }, "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -17847,23 +18037,25 @@ } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", - "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.6", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz", - "integrity": "sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz", + "integrity": "sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.1", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.16.7" + "@babel/helper-replace-supers": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.17.0", + "charcodes": "^0.2.0" } }, "@babel/plugin-proposal-dynamic-import": { @@ -17921,11 +18113,11 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", - "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", "requires": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", @@ -18013,9 +18205,9 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz", - "integrity": "sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", + "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -18198,9 +18390,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", - "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz", + "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==", "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -18358,9 +18550,9 @@ } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz", - "integrity": "sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", + "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -18374,15 +18566,15 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", - "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", + "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/plugin-transform-react-jsx-development": { @@ -18419,9 +18611,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", - "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", + "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", "requires": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -18624,9 +18816,9 @@ } }, "@babel/runtime-corejs3": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", - "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz", + "integrity": "sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==", "requires": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -18643,26 +18835,26 @@ } }, "@babel/traverse": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", - "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", + "@babel/generator": "^7.17.3", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -18678,6 +18870,73 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" }, + "@csstools/postcss-color-function": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.0.3.tgz", + "integrity": "sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", + "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", + "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", + "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.1.tgz", + "integrity": "sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", + "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.0.2.tgz", + "integrity": "sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, "@emotion/babel-plugin": { "version": "11.7.2", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", @@ -18787,13 +19046,13 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", + "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -18808,9 +19067,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "requires": { "type-fest": "^0.20.2" } @@ -18836,9 +19095,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -18913,15 +19172,15 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" }, "@jest/console": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.6.tgz", - "integrity": "sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.4.6", - "jest-util": "^27.4.2", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", "slash": "^3.0.0" }, "dependencies": { @@ -18971,34 +19230,34 @@ } }, "@jest/core": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz", - "integrity": "sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", "requires": { - "@jest/console": "^27.4.6", - "@jest/reporters": "^27.4.6", - "@jest/test-result": "^27.4.6", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.7", - "jest-haste-map": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.6", - "jest-resolve-dependencies": "^27.4.6", - "jest-runner": "^27.4.6", - "jest-runtime": "^27.4.6", - "jest-snapshot": "^27.4.6", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.6", - "jest-watcher": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", @@ -19051,64 +19310,64 @@ } }, "@jest/environment": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz", - "integrity": "sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "requires": { - "@jest/fake-timers": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^27.4.6" + "jest-mock": "^27.5.1" } }, "@jest/fake-timers": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz", - "integrity": "sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^27.4.6", - "jest-mock": "^27.4.6", - "jest-util": "^27.4.2" + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" } }, "@jest/globals": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz", - "integrity": "sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "requires": { - "@jest/environment": "^27.4.6", - "@jest/types": "^27.4.2", - "expect": "^27.4.6" + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" } }, "@jest/reporters": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz", - "integrity": "sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.4.6", - "@jest/test-result": "^27.4.6", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.4.6", - "jest-resolve": "^27.4.6", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.6", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -19167,12 +19426,12 @@ } }, "@jest/source-map": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", - "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "source-map": "^0.6.0" }, "dependencies": { @@ -19184,42 +19443,42 @@ } }, "@jest/test-result": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz", - "integrity": "sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "requires": { - "@jest/console": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz", - "integrity": "sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", "requires": { - "@jest/test-result": "^27.4.6", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.6", - "jest-runtime": "^27.4.6" + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" } }, "@jest/transform": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz", - "integrity": "sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.6", - "jest-regex-util": "^27.4.0", - "jest-util": "^27.4.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -19278,9 +19537,9 @@ } }, "@jest/types": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -19334,6 +19593,25 @@ } } }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@msgpack/msgpack": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", @@ -19485,9 +19763,9 @@ "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==" }, "@rollup/plugin-babel": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", - "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "requires": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -19816,9 +20094,9 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "@types/express": { "version": "4.17.13", @@ -19919,9 +20197,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz", - "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", + "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==" }, "@types/prop-types": { "version": "15.7.4", @@ -19944,9 +20222,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.39", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", - "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", + "version": "17.0.40", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz", + "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -20050,9 +20328,9 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, "@types/ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.2.tgz", + "integrity": "sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw==", "requires": { "@types/node": "*" } @@ -20066,18 +20344,18 @@ } }, "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", - "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", + "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", "requires": { - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/type-utils": "5.10.0", - "@typescript-eslint/utils": "5.10.0", + "@typescript-eslint/scope-manager": "5.14.0", + "@typescript-eslint/type-utils": "5.14.0", + "@typescript-eslint/utils": "5.14.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -20097,55 +20375,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz", - "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.14.0.tgz", + "integrity": "sha512-ke48La1A/TWAn949cdgQiP3oK0NT7ArhDAOVOmNLVjT/uAXlFyrJY8dM4qqxHrATzIp8glg+G2OZjy2lRKBIUA==", "requires": { - "@typescript-eslint/utils": "5.10.0" + "@typescript-eslint/utils": "5.14.0" } }, "@typescript-eslint/parser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", - "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", + "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", "requires": { - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/typescript-estree": "5.10.0", + "@typescript-eslint/scope-manager": "5.14.0", + "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/typescript-estree": "5.14.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", - "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", + "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", "requires": { - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/visitor-keys": "5.10.0" + "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/visitor-keys": "5.14.0" } }, "@typescript-eslint/type-utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", - "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", + "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", "requires": { - "@typescript-eslint/utils": "5.10.0", + "@typescript-eslint/utils": "5.14.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", - "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==" + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", + "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==" }, "@typescript-eslint/typescript-estree": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", - "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", + "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", "requires": { - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/visitor-keys": "5.10.0", + "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/visitor-keys": "5.14.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -20164,14 +20442,14 @@ } }, "@typescript-eslint/utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", - "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", + "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/typescript-estree": "5.10.0", + "@typescript-eslint/scope-manager": "5.14.0", + "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/typescript-estree": "5.14.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -20193,11 +20471,11 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", - "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", + "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", "requires": { - "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/types": "5.14.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -20354,12 +20632,12 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -20468,9 +20746,9 @@ }, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -20491,11 +20769,6 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "requires": {} }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -20656,14 +20929,14 @@ } }, "axe-core": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", - "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==" + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", + "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==" }, "axios": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", - "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "requires": { "follow-redirects": "^1.14.8" } @@ -20674,17 +20947,17 @@ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, "babel-jest": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.6.tgz", - "integrity": "sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", "requires": { - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.4.0", + "babel-preset-jest": "^27.5.1", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "dependencies": { @@ -20795,9 +21068,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", - "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -20832,12 +21105,12 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", - "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "requires": { "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.20.0" + "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { @@ -20873,11 +21146,11 @@ } }, "babel-preset-jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", - "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", "requires": { - "babel-plugin-jest-hoist": "^27.4.0", + "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -20965,26 +21238,26 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", + "qs": "6.9.7", + "raw-body": "2.4.3", "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "debug": { "version": "2.6.9", @@ -21123,14 +21396,14 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", + "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001313", + "electron-to-chromium": "^1.4.76", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" } }, @@ -21245,9 +21518,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001301", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", - "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==" + "version": "1.0.30001314", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", + "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -21276,6 +21549,11 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" }, + "charcodes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", + "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==" + }, "check-types": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", @@ -21312,9 +21590,9 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "clean-css": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", - "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", "requires": { "source-map": "~0.6.0" }, @@ -21527,9 +21805,9 @@ } }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.0.6", @@ -21537,14 +21815,14 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-js": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", - "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==" + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", + "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==" }, "core-js-compat": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", - "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", + "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", "requires": { "browserslist": "^4.19.1", "semver": "7.0.0" @@ -21558,9 +21836,9 @@ } }, "core-js-pure": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.3.tgz", - "integrity": "sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA==" + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", + "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==" }, "core-util-is": { "version": "1.0.3", @@ -21606,11 +21884,11 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, "css-blank-pseudo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.2.tgz", - "integrity": "sha512-hOb1LFjRR+8ocA071xUSmg5VslJ8NGo/I2qpUpdeAYyBVCgupS5O8SEVo4SxEMYyFBNodBkzG3T1iqW9HCXxew==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "requires": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" } }, "css-declaration-sorter": { @@ -21622,25 +21900,25 @@ } }, "css-has-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.3.tgz", - "integrity": "sha512-0gDYWEKaGacwxCqvQ3Ypg6wGdD1AztbMm5h1JsactG2hP2eiflj808QITmuWBpE7sjSEVrAlZhPTVd/nNMj/hQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "requires": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" } }, "css-loader": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", - "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.2.15", + "postcss": "^8.4.7", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", + "postcss-value-parser": "^4.2.0", "semver": "^7.3.5" }, "dependencies": { @@ -21668,9 +21946,9 @@ }, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -21710,9 +21988,9 @@ } }, "css-prefers-color-scheme": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", - "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "requires": {} }, "css-select": { @@ -21754,9 +22032,9 @@ "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" }, "cssdb": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", - "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.4.1.tgz", + "integrity": "sha512-R70R/Q1fPlM1D6Y+Kpat0QjiY+aMsY2/8lekdVoYcJ7ZQs9kw71W78FdOMf8DFq975KHQf1089PNg1dLsbAhoA==" }, "cssesc": { "version": "3.0.0", @@ -21764,55 +22042,55 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.15.tgz", - "integrity": "sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.1.tgz", + "integrity": "sha512-WWfN7jBK/3Uk3oX/jsFbQApDf9DkXj6dOYull5ZaSGskcDggzg3RyDZI4GKKO+00LdfLMEZtY1cwTQUL+YMg2Q==", "requires": { - "cssnano-preset-default": "^5.1.10", + "cssnano-preset-default": "^5.2.1", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.10.tgz", - "integrity": "sha512-BcpSzUVygHMOnp9uG5rfPzTOCb0GAHQkqtUQx8j1oMNF9A1Q8hziOOhiM4bdICpmrBIU85BE64RD5XGYsVQZNA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.1.tgz", + "integrity": "sha512-Y+CUCS5iZ1uzHn5KtmKIlysQVXrTtLCnYsYTOJcbdd5rghOwtw1gobvEXefBncjGO4fWwGZr9/n9hwZfo6W1Fw==", "requires": { "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.0.0", - "postcss-calc": "^8.2.0", - "postcss-colormin": "^5.2.3", - "postcss-convert-values": "^5.0.2", - "postcss-discard-comments": "^5.0.1", - "postcss-discard-duplicates": "^5.0.1", - "postcss-discard-empty": "^5.0.1", - "postcss-discard-overridden": "^5.0.2", - "postcss-merge-longhand": "^5.0.4", - "postcss-merge-rules": "^5.0.4", - "postcss-minify-font-values": "^5.0.2", - "postcss-minify-gradients": "^5.0.4", - "postcss-minify-params": "^5.0.3", - "postcss-minify-selectors": "^5.1.1", - "postcss-normalize-charset": "^5.0.1", - "postcss-normalize-display-values": "^5.0.2", - "postcss-normalize-positions": "^5.0.2", - "postcss-normalize-repeat-style": "^5.0.2", - "postcss-normalize-string": "^5.0.2", - "postcss-normalize-timing-functions": "^5.0.2", - "postcss-normalize-unicode": "^5.0.2", - "postcss-normalize-url": "^5.0.4", - "postcss-normalize-whitespace": "^5.0.2", - "postcss-ordered-values": "^5.0.3", - "postcss-reduce-initial": "^5.0.2", - "postcss-reduce-transforms": "^5.0.2", - "postcss-svgo": "^5.0.3", - "postcss-unique-selectors": "^5.0.2" + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.0", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.0", + "postcss-merge-rules": "^5.1.0", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.0", + "postcss-minify-params": "^5.1.0", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.0", + "postcss-ordered-values": "^5.1.0", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" } }, "cssnano-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.0.tgz", - "integrity": "sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "requires": {} }, "csso": { @@ -22052,9 +22330,9 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "diff-sequences": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==" + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" }, "dir-glob": { "version": "3.0.1", @@ -22217,9 +22495,9 @@ } }, "electron-to-chromium": { - "version": "1.4.51", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz", - "integrity": "sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ==" + "version": "1.4.80", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.80.tgz", + "integrity": "sha512-COsbJCGVYCc/aAY4cd94x1Js3q0r406YKGbdL8LXHg0O9dEjuFEFU/vZneRxBxKo/f1lLHi0YyAR7sbFM+i8Bg==" }, "emittery": { "version": "0.8.1", @@ -22251,9 +22529,9 @@ } }, "enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -22273,9 +22551,9 @@ } }, "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", + "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", "requires": { "stackframe": "^1.1.1" } @@ -22399,11 +22677,11 @@ } }, "eslint": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", - "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", + "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", "requires": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.2.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -22411,10 +22689,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -22494,9 +22772,9 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "requires": { "type-fest": "^0.20.2" } @@ -22596,9 +22874,9 @@ } }, "eslint-module-utils": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", - "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "requires": { "debug": "^3.2.7", "find-up": "^2.1.0" @@ -22737,21 +23015,21 @@ } }, "eslint-plugin-react": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", - "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz", + "integrity": "sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg==", "requires": { "array-includes": "^3.1.4", "array.prototype.flatmap": "^1.2.5", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.entries": "^1.1.5", "object.fromentries": "^2.0.5", "object.hasown": "^1.1.0", "object.values": "^1.1.5", - "prop-types": "^15.7.2", + "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", "string.prototype.matchall": "^4.0.6" @@ -22783,17 +23061,17 @@ "requires": {} }, "eslint-plugin-testing-library": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.4.tgz", - "integrity": "sha512-zA/NfAENCsJXujvwwiap5gsqLp2U6X7m2XA5nOksl4zzb6GpUmRNAleCll58rEP0brFVj7DZBprlIlMGIhoC7Q==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.6.tgz", + "integrity": "sha512-mMU4+slZsWKHNxtxc5TE2+bs9S//e2uFPlcpTapPhVdnctgn0+G/DaUu6VbT0JLiVMcbBjy3IcfddK+abZawbw==", "requires": { - "@typescript-eslint/experimental-utils": "^5.9.0" + "@typescript-eslint/utils": "^5.13.0" } }, "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -22815,9 +23093,9 @@ } }, "eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" }, "eslint-webpack-plugin": { "version": "3.1.1", @@ -22832,13 +23110,13 @@ } }, "espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "requires": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { @@ -22952,27 +23230,27 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, "expect": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz", - "integrity": "sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "requires": { - "@jest/types": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6" + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" } }, "express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.19.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -22987,7 +23265,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.9.7", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.17.2", @@ -23184,14 +23462,14 @@ } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "fork-ts-checker-webpack-plugin": { "version": "6.5.0", @@ -23308,9 +23586,9 @@ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, "fresh": { "version": "0.5.2", @@ -23318,9 +23596,9 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -23548,9 +23826,9 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", @@ -23719,9 +23997,9 @@ } }, "http-parser-js": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", - "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==" + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" }, "http-proxy": { "version": "1.18.1", @@ -24197,9 +24475,9 @@ } }, "istanbul-reports": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", - "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -24224,46 +24502,46 @@ } }, "jest": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.7.tgz", - "integrity": "sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "requires": { - "@jest/core": "^27.4.7", + "@jest/core": "^27.5.1", "import-local": "^3.0.2", - "jest-cli": "^27.4.7" + "jest-cli": "^27.5.1" } }, "jest-changed-files": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", - "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "execa": "^5.0.0", "throat": "^6.0.1" } }, "jest-circus": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.6.tgz", - "integrity": "sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", "requires": { - "@jest/environment": "^27.4.6", - "@jest/test-result": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.4.6", + "expect": "^27.5.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.6", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-runtime": "^27.4.6", - "jest-snapshot": "^27.4.6", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.6", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" @@ -24315,20 +24593,20 @@ } }, "jest-cli": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.7.tgz", - "integrity": "sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", "requires": { - "@jest/core": "^27.4.7", - "@jest/test-result": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^27.4.7", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.6", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "prompts": "^2.0.1", "yargs": "^16.2.0" }, @@ -24379,32 +24657,34 @@ } }, "jest-config": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.7.tgz", - "integrity": "sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", "requires": { "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.4.6", - "@jest/types": "^27.4.2", - "babel-jest": "^27.4.6", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.6", - "jest-environment-jsdom": "^27.4.6", - "jest-environment-node": "^27.4.6", - "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.6", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.6", - "jest-runner": "^27.4.6", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "micromatch": "^4.0.4", - "pretty-format": "^27.4.6", - "slash": "^3.0.0" + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "dependencies": { "ansi-styles": { @@ -24453,14 +24733,14 @@ } }, "jest-diff": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz", - "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", "requires": { "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "dependencies": { "ansi-styles": { @@ -24509,23 +24789,23 @@ } }, "jest-docblock": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", - "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.6.tgz", - "integrity": "sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.6" + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" }, "dependencies": { "ansi-styles": { @@ -24574,78 +24854,78 @@ } }, "jest-environment-jsdom": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz", - "integrity": "sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", "requires": { - "@jest/environment": "^27.4.6", - "@jest/fake-timers": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^27.4.6", - "jest-util": "^27.4.2", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.6.tgz", - "integrity": "sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", "requires": { - "@jest/environment": "^27.4.6", - "@jest/fake-timers": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^27.4.6", - "jest-util": "^27.4.2" + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" } }, "jest-get-type": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==" + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" }, "jest-haste-map": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.6.tgz", - "integrity": "sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.4.0", - "jest-serializer": "^27.4.0", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz", - "integrity": "sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", "requires": { - "@jest/environment": "^27.4.6", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.4.6", + "expect": "^27.5.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.6", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-runtime": "^27.4.6", - "jest-snapshot": "^27.4.6", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.6", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", "throat": "^6.0.1" }, "dependencies": { @@ -24695,23 +24975,23 @@ } }, "jest-leak-detector": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz", - "integrity": "sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", "requires": { - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" } }, "jest-matcher-utils": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz", - "integrity": "sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.4.6", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "dependencies": { "ansi-styles": { @@ -24760,17 +25040,17 @@ } }, "jest-message-util": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz", - "integrity": "sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^27.4.6", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -24821,11 +25101,11 @@ } }, "jest-mock": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.6.tgz", - "integrity": "sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/node": "*" } }, @@ -24836,22 +25116,22 @@ "requires": {} }, "jest-regex-util": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", - "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==" + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==" }, "jest-resolve": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.6.tgz", - "integrity": "sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.6", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" @@ -24903,40 +25183,39 @@ } }, "jest-resolve-dependencies": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz", - "integrity": "sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", "requires": { - "@jest/types": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.6" + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" } }, "jest-runner": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.6.tgz", - "integrity": "sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", "requires": { - "@jest/console": "^27.4.6", - "@jest/environment": "^27.4.6", - "@jest/test-result": "^27.4.6", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.6", - "jest-environment-node": "^27.4.6", - "jest-haste-map": "^27.4.6", - "jest-leak-detector": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-resolve": "^27.4.6", - "jest-runtime": "^27.4.6", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.6", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -24987,30 +25266,30 @@ } }, "jest-runtime": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.6.tgz", - "integrity": "sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", "requires": { - "@jest/environment": "^27.4.6", - "@jest/fake-timers": "^27.4.6", - "@jest/globals": "^27.4.6", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.6", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-mock": "^27.4.6", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.6", - "jest-snapshot": "^27.4.6", - "jest-util": "^27.4.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -25061,40 +25340,40 @@ } }, "jest-serializer": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", - "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "requires": { "@types/node": "*", - "graceful-fs": "^4.2.4" + "graceful-fs": "^4.2.9" } }, "jest-snapshot": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.6.tgz", - "integrity": "sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "requires": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.4.6", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.4.6", - "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.6", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6", - "jest-util": "^27.4.2", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^27.4.6", + "pretty-format": "^27.5.1", "semver": "^7.3.2" }, "dependencies": { @@ -25152,15 +25431,15 @@ } }, "jest-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", - "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "dependencies": { @@ -25210,16 +25489,16 @@ } }, "jest-validate": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.6.tgz", - "integrity": "sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "requires": { - "@jest/types": "^27.4.2", + "@jest/types": "^27.5.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", + "jest-get-type": "^27.5.1", "leven": "^3.1.0", - "pretty-format": "^27.4.6" + "pretty-format": "^27.5.1" }, "dependencies": { "ansi-styles": { @@ -25304,9 +25583,9 @@ } }, "char-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.0.tgz", - "integrity": "sha512-oGu2QekBMXgyQNWPDRQ001bjvDnZe4/zBTz37TMbiKz1NbNiyiH5hRkobe7npRN6GfbGbxMYFck/vQ1r9c1VMA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" }, "color-convert": { "version": "2.0.1", @@ -25359,16 +25638,16 @@ } }, "jest-watcher": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.6.tgz", - "integrity": "sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", "requires": { - "@jest/test-result": "^27.4.6", - "@jest/types": "^27.4.2", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.4.2", + "jest-util": "^27.5.1", "string-length": "^4.0.1" }, "dependencies": { @@ -25418,9 +25697,9 @@ } }, "jest-worker": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", - "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -25746,11 +26025,11 @@ } }, "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "requires": { - "sourcemap-codec": "^1.4.4" + "sourcemap-codec": "^1.4.8" } }, "make-dir": { @@ -25852,17 +26131,17 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz", - "integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", "requires": { "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -25902,9 +26181,9 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -25942,9 +26221,9 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" }, "natural-compare": { "version": "1.4.0", @@ -25952,9 +26231,9 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.2", @@ -25987,9 +26266,9 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" }, "nodemon": { "version": "2.0.15", @@ -26437,9 +26716,9 @@ "dev": true }, "pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" }, "pkg-dir": { "version": "4.2.0", @@ -26553,13 +26832,13 @@ } }, "postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", + "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", "requires": { - "nanoid": "^3.1.30", + "nanoid": "^3.3.1", "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.2" } }, "postcss-attribute-case-insensitive": { @@ -26577,26 +26856,26 @@ "requires": {} }, "postcss-calc": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz", - "integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "requires": { - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" } }, "postcss-color-functional-notation": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.1.tgz", - "integrity": "sha512-62OBIXCjRXpQZcFOYIXwXBlpAVWrYk8ek1rcjvMING4Q2cf0ipyN9qT+BhHA6HmftGSEnFQu2qgKO3gMscl3Rw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-color-hex-alpha": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.2.tgz", - "integrity": "sha512-gyx8RgqSmGVK156NAdKcsfkY3KPGHhKqvHTL3hhveFrBBToguKFzhyiuk3cljH6L4fJ0Kv+JENuPXs1Wij27Zw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -26610,9 +26889,9 @@ } }, "postcss-colormin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.3.tgz", - "integrity": "sha512-dra4xoAjub2wha6RUXAgadHEn2lGxbj8drhFcIGLOMn914Eu7DkPUurugDXgstwttCYkJtZ/+PkWRWdp3UHRIA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", @@ -26621,11 +26900,11 @@ } }, "postcss-convert-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", - "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", + "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", "requires": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-custom-media": { @@ -26635,9 +26914,9 @@ "requires": {} }, "postcss-custom-properties": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.3.tgz", - "integrity": "sha512-rtu3otIeY532PnEuuBrIIe+N+pcdbX/7JMZfrcL09wc78YayrHw5E8UkDfvnlOhEUrI4ptCuzXQfj+Or6spbGA==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.4.tgz", + "integrity": "sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -26651,49 +26930,50 @@ } }, "postcss-dir-pseudo-class": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.3.tgz", - "integrity": "sha512-qiPm+CNAlgXiMf0J5IbBBEXA9l/Q5HGsNGkL3znIwT2ZFRLGY9U2fTUpa4lqCUXQOxaLimpacHeQC80BD2qbDw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", "requires": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" } }, "postcss-discard-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", - "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", "requires": {} }, "postcss-discard-duplicates": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", - "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "requires": {} }, "postcss-discard-empty": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", - "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.0.tgz", + "integrity": "sha512-782T/buGgb3HOuHOJAHpdyKzAAKsv/BxWqsutnZ+QsiHEcDkY7v+6WWdturuBiSal6XMOO1p1aJvwXdqLD5vhA==", "requires": {} }, "postcss-discard-overridden": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.2.tgz", - "integrity": "sha512-+56BLP6NSSUuWUXjRgAQuho1p5xs/hU5Sw7+xt9S3JSg+7R6+WMGnJW7Hre/6tTuZ2xiXMB42ObkiZJ2hy/Pew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "requires": {} }, "postcss-double-position-gradients": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.4.tgz", - "integrity": "sha512-qz+s5vhKJlsHw8HjSs+HVk2QGFdRyC68KGRQGX3i+GcnUjhWhXQEmCXW6siOJkZ1giu0ddPwSO6I6JdVVVPoog==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", + "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-env-function": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.4.tgz", - "integrity": "sha512-0ltahRTPtXSIlEZFv7zIvdEib7HN0ZbUQxrxIKn8KbiRyhALo854I/CggU5lyZe6ZBvSTJ6Al2vkZecI2OhneQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.5.tgz", + "integrity": "sha512-gPUJc71ji9XKyl0WSzAalBeEA/89kU+XpffpPxSaaaZ1c48OL36r1Ep5R6+9XAPkIiDlSvVAwP4io12q/vTcvA==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -26705,19 +26985,19 @@ "requires": {} }, "postcss-focus-visible": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.3.tgz", - "integrity": "sha512-ozOsg+L1U8S+rxSHnJJiET6dNLyADcPHhEarhhtCI9DBLGOPG/2i4ddVoFch9LzrBgb8uDaaRI4nuid2OM82ZA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "requires": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" } }, "postcss-focus-within": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.3.tgz", - "integrity": "sha512-fk9y2uFS6/Kpp7/A9Hz9Z4rlFQ8+tzgBcQCXAFSrXFGAbKx+4ZZOmmfHuYjCOMegPWoz0pnC6fNzi8j7Xyqp5Q==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "requires": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" } }, "postcss-font-variant": { @@ -26727,15 +27007,15 @@ "requires": {} }, "postcss-gap-properties": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", - "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", "requires": {} }, "postcss-image-set-function": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.4.tgz", - "integrity": "sha512-BlEo9gSTj66lXjRNByvkMK9dEdEGFXRfGjKRi9fo8s0/P3oEk74cAoonl/utiM50E2OPVb/XSu+lWvdW4KtE/Q==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -26755,17 +27035,18 @@ } }, "postcss-lab-function": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.3.tgz", - "integrity": "sha512-MH4tymWmefdZQ7uVG/4icfLjAQmH6o2NRYyVh2mKoB4RXJp9PjsyhZwhH4ouaCQHvg+qJVj3RzeAR1EQpIlXZA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.2.tgz", + "integrity": "sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==", "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-load-config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", - "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", + "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", "requires": { "lilconfig": "^2.0.4", "yaml": "^1.10.2" @@ -26804,9 +27085,9 @@ } }, "postcss-logical": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", - "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "requires": {} }, "postcss-media-minmax": { @@ -26816,60 +27097,58 @@ "requires": {} }, "postcss-merge-longhand": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz", - "integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.0.tgz", + "integrity": "sha512-Gr46srN2tsLD8fudKYoHO56RG0BLQ2nsBRnSZGY04eNBPwTeWa9KeHrbL3tOLAHyB2aliikycPH2TMJG1U+W6g==", "requires": { - "postcss-value-parser": "^4.1.0", - "stylehacks": "^5.0.1" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" } }, "postcss-merge-rules": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.4.tgz", - "integrity": "sha512-yOj7bW3NxlQxaERBB0lEY1sH5y+RzevjbdH4DBJurjKERNpknRByFNdNe+V72i5pIZL12woM9uGdS5xbSB+kDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.0.tgz", + "integrity": "sha512-NecukEJovQ0mG7h7xV8wbYAkXGTO3MPKnXvuiXzOKcxoOodfTTKYjeo8TMhAswlSkjcPIBlnKbSFcTuVSDaPyQ==", "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.2.tgz", - "integrity": "sha512-R6MJZryq28Cw0AmnyhXrM7naqJZZLoa1paBltIzh2wM7yb4D45TLur+eubTQ4jCmZU9SGeZdWsc5KcSoqTMeTg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.4.tgz", - "integrity": "sha512-RVwZA7NC4R4J76u8X0Q0j+J7ItKUWAeBUJ8oEEZWmtv3Xoh19uNJaJwzNpsydQjk6PkuhRrK+YwwMf+c+68EYg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.0.tgz", + "integrity": "sha512-J/TMLklkONn3LuL8wCwfwU8zKC1hpS6VcxFkNUNjmVt53uKqrrykR3ov11mdUYyqVMEx67slMce0tE14cE4DTg==", "requires": { "colord": "^2.9.1", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.3.tgz", - "integrity": "sha512-NY92FUikE+wralaiVexFd5gwb7oJTIDhgTNeIw89i1Ymsgt4RWiPXfz3bg7hDy4NL6gepcThJwOYNtZO/eNi7Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.0.tgz", + "integrity": "sha512-q67dcts4Hct6x8+JmhBgctHkbvUsqGIg2IItenjE63iZXMbhjr7AlVZkNnKtIGt/1Wsv7p/7YzeSII6Q+KPXRg==", "requires": { - "alphanum-sort": "^1.0.2", "browserslist": "^4.16.6", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.1.tgz", - "integrity": "sha512-TOzqOPXt91O2luJInaVPiivh90a2SIK5Nf1Ea7yEIM/5w+XA5BGrZGUSW8aEx9pJ/oNj7ZJBhjvigSiBV+bC1Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", "requires": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" } }, @@ -26914,11 +27193,11 @@ } }, "postcss-nesting": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", - "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.3.tgz", + "integrity": "sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==", "requires": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" } }, "postcss-normalize": { @@ -26932,90 +27211,95 @@ } }, "postcss-normalize-charset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", - "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "requires": {} }, "postcss-normalize-display-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz", - "integrity": "sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.2.tgz", - "integrity": "sha512-tqghWFVDp2btqFg1gYob1etPNxXLNh3uVeWgZE2AQGh6b2F8AK2Gj36v5Vhyh+APwIzNjmt6jwZ9pTBP+/OM8g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.2.tgz", - "integrity": "sha512-/rIZn8X9bBzC7KvY4iKUhXUGW3MmbXwfPF23jC9wT9xTi7kAvgj8sEgwxjixBmoL6MVa4WOgxNz2hAR6wTK8tw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.2.tgz", - "integrity": "sha512-zaI1yzwL+a/FkIzUWMQoH25YwCYxi917J4pYm1nRXtdgiCdnlTkx5eRzqWEC64HtRa06WCJ9TIutpb6GmW4gFw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz", - "integrity": "sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.2.tgz", - "integrity": "sha512-3y/V+vjZ19HNcTizeqwrbZSUsE69ZMRHfiiyLAJb7C7hJtYmM4Gsbajy7gKagu97E8q5rlS9k8FhojA8cpGhWw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", "requires": { "browserslist": "^4.16.6", "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-url": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz", - "integrity": "sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "requires": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-whitespace": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.2.tgz", - "integrity": "sha512-CXBx+9fVlzSgbk0IXA/dcZn9lXixnQRndnsPC5ht3HxlQ1bVh77KQDL1GffJx1LTzzfae8ftMulsjYmO2yegxA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.0.tgz", + "integrity": "sha512-7O1FanKaJkpWFyCghFzIkLhehujV/frGkdofGLwhg5upbLyGsSfiTcZAdSzoPsSUgyPCkBkNMeWR8yVgPdQybg==", "requires": { "postcss-value-parser": "^4.2.0" } }, + "postcss-opacity-percentage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", + "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==" + }, "postcss-ordered-values": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.3.tgz", - "integrity": "sha512-T9pDS+P9bWeFvqivXd5ACzQmrCmHjv3ZP+djn8E1UZY7iK79pFSm7i3WbKw2VSmFmdbMm8sQ12OPcNpzBo3Z2w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.0.tgz", + "integrity": "sha512-wU4Z4D4uOIH+BUKkYid36gGDJNQtkVJT7Twv8qH6UyfttbbJWyw4/xIPuVEkkCtQLAJ0EdsNSh8dlvqkXb49TA==", "requires": { - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } }, "postcss-overflow-shorthand": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", - "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", "requires": {} }, "postcss-page-break": { @@ -27025,74 +27309,83 @@ "requires": {} }, "postcss-place": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.3.tgz", - "integrity": "sha512-tDQ3m+GYoOar+KoQgj+pwPAvGHAp/Sby6vrFiyrELrMKQJ4AejL0NcS0mm296OKKYA2SRg9ism/hlT/OLhBrdQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-preset-env": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", - "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.2.tgz", + "integrity": "sha512-AmOkb8AeNNQwE/z2fHl1iwOIt8J50V8WR0rmLagcgIDoqlJZWjV3NdtOPnLGco1oN8DZe+Ss5B9ULbBeS6HfeA==", "requires": { + "@csstools/postcss-color-function": "^1.0.2", + "@csstools/postcss-font-format-keywords": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.0", + "@csstools/postcss-ic-unit": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.0", + "@csstools/postcss-oklab-function": "^1.0.1", + "@csstools/postcss-progressive-custom-properties": "^1.2.0", "autoprefixer": "^10.4.2", - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001299", - "css-blank-pseudo": "^3.0.2", - "css-has-pseudo": "^3.0.3", - "css-prefers-color-scheme": "^6.0.2", - "cssdb": "^5.0.0", + "browserslist": "^4.19.3", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^6.4.0", "postcss-attribute-case-insensitive": "^5.0.0", - "postcss-color-functional-notation": "^4.2.1", - "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-functional-notation": "^4.2.2", + "postcss-color-hex-alpha": "^8.0.3", "postcss-color-rebeccapurple": "^7.0.2", "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.2", + "postcss-custom-properties": "^12.1.4", "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.3", - "postcss-double-position-gradients": "^3.0.4", - "postcss-env-function": "^4.0.4", - "postcss-focus-visible": "^6.0.3", - "postcss-focus-within": "^5.0.3", + "postcss-dir-pseudo-class": "^6.0.4", + "postcss-double-position-gradients": "^3.1.0", + "postcss-env-function": "^4.0.5", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.2", - "postcss-image-set-function": "^4.0.4", + "postcss-gap-properties": "^3.0.3", + "postcss-image-set-function": "^4.0.6", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.0.3", - "postcss-logical": "^5.0.3", + "postcss-lab-function": "^4.1.1", + "postcss-logical": "^5.0.4", "postcss-media-minmax": "^5.0.0", "postcss-nesting": "^10.1.2", - "postcss-overflow-shorthand": "^3.0.2", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.3", "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.3", - "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-place": "^7.0.4", + "postcss-pseudo-class-any-link": "^7.1.1", "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0" + "postcss-selector-not": "^5.0.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-pseudo-class-any-link": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.2.tgz", - "integrity": "sha512-CG35J1COUH7OOBgpw5O+0koOLUd5N4vUGKUqSAuIe4GiuLHWU96Pqp+UPC8QITTd12zYAFx76pV7qWT/0Aj/TA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz", + "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==", "requires": { - "postcss-selector-parser": "^6.0.8" + "postcss-selector-parser": "^6.0.9" } }, "postcss-reduce-initial": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz", - "integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0" } }, "postcss-reduce-transforms": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.2.tgz", - "integrity": "sha512-25HeDeFsgiPSUx69jJXZn8I06tMxLQJJNF5h7i9gsUg8iP4KOOJ8EX8fj3seeoLt3SLU2YDD6UPnDYVGUO7DEA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -27121,11 +27414,11 @@ } }, "postcss-svgo": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", - "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "requires": { - "postcss-value-parser": "^4.1.0", + "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" }, "dependencies": { @@ -27170,11 +27463,10 @@ } }, "postcss-unique-selectors": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz", - "integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "requires": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" } }, @@ -27209,9 +27501,9 @@ } }, "pretty-format": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", - "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "requires": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -27321,9 +27613,9 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" }, "queue-microtask": { "version": "1.2.3", @@ -27357,20 +27649,20 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "iconv-lite": { "version": "0.4.24", @@ -27736,6 +28028,16 @@ "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "requires": { "minimatch": "3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "regenerate": { @@ -27744,9 +28046,9 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "requires": { "regenerate": "^1.4.2" } @@ -27784,14 +28086,14 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, "regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", "requires": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" } @@ -27815,14 +28117,14 @@ } }, "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "requires": { "jsesc": "~0.5.0" }, @@ -27962,9 +28264,9 @@ } }, "rollup": { - "version": "2.66.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", - "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", + "version": "2.70.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.0.tgz", + "integrity": "sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==", "requires": { "fsevents": "~2.3.2" } @@ -28037,9 +28339,9 @@ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" }, "sass-loader": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", - "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", "requires": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -28251,9 +28553,9 @@ } }, "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sisteransi": { "version": "1.0.5", @@ -28321,11 +28623,6 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -28414,9 +28711,9 @@ } }, "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", + "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" }, "statuses": { "version": "1.5.0", @@ -28565,11 +28862,11 @@ "requires": {} }, "stylehacks": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", - "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", "requires": { - "browserslist": "^4.16.0", + "browserslist": "^4.16.6", "postcss-selector-parser": "^6.0.4" } }, @@ -28697,30 +28994,31 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "tailwindcss": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.15.tgz", - "integrity": "sha512-bT2iy7FtjwgsXik4ZoJnHXR+SRCiGR1W95fVqpLZebr64m4ahwUwRbIAc5w5+2fzr1YF4Ct2eI7dojMRRl8sVQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", + "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", "requires": { "arg": "^5.0.1", "chalk": "^4.1.2", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "color-name": "^1.1.4", "cosmiconfig": "^7.0.1", "detective": "^5.2.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "normalize-path": "^3.0.0", "object-hash": "^2.2.0", + "postcss": "^8.4.6", "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.0", "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.8", + "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", - "resolve": "^1.21.0" + "resolve": "^1.22.0" }, "dependencies": { "ansi-styles": { @@ -28826,10 +29124,11 @@ } }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.0.tgz", + "integrity": "sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==", "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", "source-map-support": "~0.5.20" @@ -28848,11 +29147,11 @@ } }, "terser-webpack-plugin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", - "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "requires": { - "jest-worker": "^27.4.1", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", @@ -28965,9 +29264,9 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, "tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz", + "integrity": "sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw==", "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", @@ -29333,12 +29632,12 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -29346,7 +29645,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -29380,21 +29679,21 @@ } }, "webpack-dev-middleware": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", - "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", "requires": { "colorette": "^2.0.10", - "memfs": "^3.2.2", + "memfs": "^3.4.1", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -29429,18 +29728,19 @@ } }, "webpack-dev-server": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", - "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", + "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/sockjs": "^0.3.33", "@types/ws": "^8.2.2", "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", @@ -29460,14 +29760,14 @@ "sockjs": "^0.3.21", "spdy": "^4.0.2", "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.0", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "dependencies": { "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -29513,9 +29813,9 @@ } }, "ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "requires": {} } } @@ -29638,26 +29938,26 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workbox-background-sync": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.4.2.tgz", - "integrity": "sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.1.tgz", + "integrity": "sha512-T5a35fagLXQvV8Dr4+bDU+XYsP90jJ3eBLjZMKuCNELMQZNj+VekCODz1QK44jgoBeQk+vp94pkZV6G+e41pgg==", "requires": { "idb": "^6.1.4", - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "workbox-broadcast-update": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.4.2.tgz", - "integrity": "sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.1.tgz", + "integrity": "sha512-mb/oyblyEpDbw167cCTyHnC3RqCnCQHtFYuYZd+QTpuExxM60qZuBH1AuQCgvLtDcztBKdEYK2VFD9SZYgRbaQ==", "requires": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "workbox-build": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.4.2.tgz", - "integrity": "sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.1.tgz", + "integrity": "sha512-coDUDzHvFZ1ADOl3wKCsCSyOBvkPKlPgcQDb6LMMShN1zgF31Mev/1HzN3+9T2cjjWAgFwZKkuRyExqc1v21Zw==", "requires": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -29677,32 +29977,31 @@ "rollup": "^2.43.1", "rollup-plugin-terser": "^7.0.0", "source-map": "^0.8.0-beta.0", - "source-map-url": "^0.4.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.4.2", - "workbox-broadcast-update": "6.4.2", - "workbox-cacheable-response": "6.4.2", - "workbox-core": "6.4.2", - "workbox-expiration": "6.4.2", - "workbox-google-analytics": "6.4.2", - "workbox-navigation-preload": "6.4.2", - "workbox-precaching": "6.4.2", - "workbox-range-requests": "6.4.2", - "workbox-recipes": "6.4.2", - "workbox-routing": "6.4.2", - "workbox-strategies": "6.4.2", - "workbox-streams": "6.4.2", - "workbox-sw": "6.4.2", - "workbox-window": "6.4.2" + "workbox-background-sync": "6.5.1", + "workbox-broadcast-update": "6.5.1", + "workbox-cacheable-response": "6.5.1", + "workbox-core": "6.5.1", + "workbox-expiration": "6.5.1", + "workbox-google-analytics": "6.5.1", + "workbox-navigation-preload": "6.5.1", + "workbox-precaching": "6.5.1", + "workbox-range-requests": "6.5.1", + "workbox-recipes": "6.5.1", + "workbox-routing": "6.5.1", + "workbox-strategies": "6.5.1", + "workbox-streams": "6.5.1", + "workbox-sw": "6.5.1", + "workbox-window": "6.5.1" }, "dependencies": { "@apideck/better-ajv-errors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz", - "integrity": "sha512-JdEazx7qiVqTBzzBl5rolRwl5cmhihjfIcpqRzIZjtT6b18liVmDn/VlWpqW4C/qP2hrFFMLRV1wlex8ZVBPTg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz", + "integrity": "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==", "requires": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", @@ -29710,9 +30009,9 @@ } }, "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -29770,118 +30069,117 @@ } }, "workbox-cacheable-response": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.2.tgz", - "integrity": "sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.1.tgz", + "integrity": "sha512-3TdtH/luDiytmM+Cn72HCBLZXmbeRNJqZx2yaVOfUZhj0IVwZqQXhNarlGE9/k6U5Jelb+TtpH2mLVhnzfiSMg==", "requires": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "workbox-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.2.tgz", - "integrity": "sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.1.tgz", + "integrity": "sha512-qObXZ39aFJ2N8X7IUbGrJHKWguliCuU1jOXM/I4MTT84u9BiKD2rHMkIzgeRP1Ixu9+cXU4/XHJq3Cy0Qqc5hw==" }, "workbox-expiration": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.2.tgz", - "integrity": "sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.1.tgz", + "integrity": "sha512-iY/cTADAQATMmPkUBRmQdacqq0TJd2wMHimBQz+tRnPGHSMH+/BoLPABPnu7O7rT/g/s59CUYYRGxe3mEgoJCA==", "requires": { "idb": "^6.1.4", - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "workbox-google-analytics": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.4.2.tgz", - "integrity": "sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.1.tgz", + "integrity": "sha512-qZU46/h4dbionYT6Yk6iBkUwpiEzAfnO1W7KkI+AMmY7G9/gA03dQQ7rpTw8F4vWrG7ahTUGWDFv6fERtaw1BQ==", "requires": { - "workbox-background-sync": "6.4.2", - "workbox-core": "6.4.2", - "workbox-routing": "6.4.2", - "workbox-strategies": "6.4.2" + "workbox-background-sync": "6.5.1", + "workbox-core": "6.5.1", + "workbox-routing": "6.5.1", + "workbox-strategies": "6.5.1" } }, "workbox-navigation-preload": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.4.2.tgz", - "integrity": "sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.1.tgz", + "integrity": "sha512-aKrgAbn2IMgzTowTi/ZyKdQUcES2m++9aGtpxqsX7Gn9ovCY8zcssaMEAMMwrIeveij5HiWNBrmj6MWDHi+0rg==", "requires": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "workbox-precaching": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.2.tgz", - "integrity": "sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.1.tgz", + "integrity": "sha512-EzlPBxvmjGfE56YZzsT/vpVkpLG1XJhoplgXa5RPyVWLUL1LbwEAxhkrENElSS/R9tgiTw80IFwysidfUqLihg==", "requires": { - "workbox-core": "6.4.2", - "workbox-routing": "6.4.2", - "workbox-strategies": "6.4.2" + "workbox-core": "6.5.1", + "workbox-routing": "6.5.1", + "workbox-strategies": "6.5.1" } }, "workbox-range-requests": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.4.2.tgz", - "integrity": "sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.1.tgz", + "integrity": "sha512-57Da/qRbd9v33YlHX0rlSUVFmE4THCjKqwkmfhY3tNLnSKN2L5YBS3qhWeDO0IrMNgUj+rGve2moKYXeUqQt4A==", "requires": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "workbox-recipes": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.4.2.tgz", - "integrity": "sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.1.tgz", + "integrity": "sha512-DGsyKygHggcGPQpWafC/Nmbm1Ny3sB2vE9r//3UbeidXiQ+pLF14KEG1/0NNGRaY+lfOXOagq6d1H7SC8KA+rA==", "requires": { - "workbox-cacheable-response": "6.4.2", - "workbox-core": "6.4.2", - "workbox-expiration": "6.4.2", - "workbox-precaching": "6.4.2", - "workbox-routing": "6.4.2", - "workbox-strategies": "6.4.2" + "workbox-cacheable-response": "6.5.1", + "workbox-core": "6.5.1", + "workbox-expiration": "6.5.1", + "workbox-precaching": "6.5.1", + "workbox-routing": "6.5.1", + "workbox-strategies": "6.5.1" } }, "workbox-routing": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.2.tgz", - "integrity": "sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.1.tgz", + "integrity": "sha512-yAAncdTwanvlR8KPjubyvFKeAok8ZcIws6UKxvIAg0I+wsf7UYi93DXNuZr6RBSQrByrN6HkCyjuhmk8P63+PA==", "requires": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "workbox-strategies": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.2.tgz", - "integrity": "sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.1.tgz", + "integrity": "sha512-JNaTXPy8wXzKkr+6za7/eJX9opoZk7UgY261I2kPxl80XQD8lMjz0vo9EOcBwvD72v3ZhGJbW84ZaDwFEhFvWA==", "requires": { - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "workbox-streams": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.4.2.tgz", - "integrity": "sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.1.tgz", + "integrity": "sha512-7jaTWm6HRGJ/ewECnhb+UgjTT50R42E0/uNCC4eTKQwnLO/NzNGjoXTdQgFjo4zteR+L/K6AtFAiYKH3ZJbAYw==", "requires": { - "workbox-core": "6.4.2", - "workbox-routing": "6.4.2" + "workbox-core": "6.5.1", + "workbox-routing": "6.5.1" } }, "workbox-sw": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.4.2.tgz", - "integrity": "sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.1.tgz", + "integrity": "sha512-hVrQa19yo9wzN1fQQ/h2JlkzFpkuH2qzYT2/rk7CLaWt6tLnTJVFCNHlGRRPhytZSf++LoIy7zThT714sowT/Q==" }, "workbox-webpack-plugin": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.4.2.tgz", - "integrity": "sha512-CiEwM6kaJRkx1cP5xHksn13abTzUqMHiMMlp5Eh/v4wRcedgDTyv6Uo8+Hg9MurRbHDosO5suaPyF9uwVr4/CQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.1.tgz", + "integrity": "sha512-SHtlQBpKruI16CAYhICDMkgjXE2fH5Yp+D+1UmBfRVhByZYzusVOykvnPm8ObJb9d/tXgn9yoppoxafFS7D4vQ==", "requires": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", - "source-map-url": "^0.4.0", "upath": "^1.2.0", "webpack-sources": "^1.4.3", - "workbox-build": "6.4.2" + "workbox-build": "6.5.1" }, "dependencies": { "source-map": { @@ -29901,12 +30199,12 @@ } }, "workbox-window": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.4.2.tgz", - "integrity": "sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.1.tgz", + "integrity": "sha512-oRlun9u7b7YEjo2fIDBqJkU2hXtrEljXcOytRhfeQRbqXxjUOpFgXSGRSAkmDx1MlKUNOSbr+zfi8h5n7In3yA==", "requires": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.4.2" + "workbox-core": "6.5.1" } }, "wrap-ansi": { @@ -29959,9 +30257,9 @@ } }, "ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "requires": {} }, "xdg-basedir": { diff --git a/interface/package.json b/interface/package.json index 6cdbcb18f..0e12b96a5 100644 --- a/interface/package.json +++ b/interface/package.json @@ -11,11 +11,11 @@ "@mui/material": "^5.5.0", "@types/lodash": "^4.14.179", "@types/node": "^17.0.21", - "@types/react": "^17.0.39", + "@types/react": "^17.0.40", "@types/react-dom": "^17.0.13", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", - "axios": "^0.26.0", + "axios": "^0.26.1", "http-proxy-middleware": "^2.0.3", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", From 52a9e500dfad845ee48e7d2b1fea0adc8f637de0 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 11 Mar 2022 07:20:52 +0100 Subject: [PATCH 100/319] fix #390, fetching summer2_ids --- src/devices/thermostat.cpp | 5 ++++- src/emsdevice.cpp | 8 ++++---- src/emsdevice.h | 2 +- src/system.cpp | 8 ++++---- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 561bb2a82..689690e67 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -138,7 +138,7 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i register_telegram_type(set_typeids[i], F("RC300Set"), false, MAKE_PF_CB(process_RC300Set)); register_telegram_type(summer_typeids[i], F("RC300Summer"), false, MAKE_PF_CB(process_RC300Summer)); register_telegram_type(curve_typeids[i], F("RC300Curves"), false, MAKE_PF_CB(process_RC300Curve)); - register_telegram_type(summer2_typeids[i], F("RC300Summer2"), true, MAKE_PF_CB(process_RC300Summer2)); + register_telegram_type(summer2_typeids[i], F("RC300Summer2"), false, MAKE_PF_CB(process_RC300Summer2)); } register_telegram_type(0x2F5, F("RC300WWmode"), true, MAKE_PF_CB(process_RC300WWmode)); register_telegram_type(0x31B, F("RC300WWtemp"), true, MAKE_PF_CB(process_RC300WWtemp)); @@ -365,6 +365,9 @@ std::shared_ptr Thermostat::heating_circuit(std::sha if (timer2_typeids.size()) { toggle_fetch(timer2_typeids[hc_num - 1], toggle_); } + if (summer2_typeids.size()) { + toggle_fetch(summer2_typeids[hc_num - 1], toggle_); + } return new_hc; // return back point to new HC object } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 1ae77187d..f82bafb46 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -314,10 +314,10 @@ void EMSdevice::show_telegram_handlers(uuid::console::Shell & shell) const { } // list all the telegram type IDs for this device, outputting to a string (max size 200) -char * EMSdevice::show_telegram_handlers(char * result, uint8_t handlers) { +char * EMSdevice::show_telegram_handlers(char * result, const size_t len, const uint8_t handlers) { uint8_t size = telegram_functions_.size(); - strlcpy(result, "", 200); + strlcpy(result, "", len); if (!size) { return result; @@ -328,9 +328,9 @@ char * EMSdevice::show_telegram_handlers(char * result, uint8_t handlers) { if (handlers == Handlers::ALL || (handlers == Handlers::RECEIVED && tf.received_ && !tf.fetch_) || (handlers == Handlers::FETCHED && tf.received_ && tf.fetch_) || (handlers == Handlers::PENDING && !tf.received_ && !tf.fetch_)) { if (i++ > 0) { - strlcat(result, " ", 200); + strlcat(result, " ", len); } - strlcat(result, Helpers::hextoa(tf.telegram_type_id_, true).c_str(), 200); + strlcat(result, Helpers::hextoa(tf.telegram_type_id_, true).c_str(), len); } } diff --git a/src/emsdevice.h b/src/emsdevice.h index 5c385a3c7..f538a7d28 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -180,7 +180,7 @@ class EMSdevice { enum Handlers : uint8_t { ALL, RECEIVED, FETCHED, PENDING }; void show_telegram_handlers(uuid::console::Shell & shell) const; - char * show_telegram_handlers(char * result, uint8_t handlers); + char * show_telegram_handlers(char * result, const size_t len, const uint8_t handlers); void show_mqtt_handlers(uuid::console::Shell & shell) const; void list_device_entries(JsonObject & output) const; void exclude_entity(uint8_t entity_id); diff --git a/src/system.cpp b/src/system.cpp index 336c3ba2c..d6e62c559 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1193,16 +1193,16 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp obj["product id"] = emsdevice->product_id(); obj["version"] = emsdevice->version(); obj["entities"] = emsdevice->count_entities(); - char result[200]; - (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::RECEIVED); + char result[250]; + (void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::RECEIVED); if (result[0] != '\0') { obj["handlers received"] = result; // don't show handlers if there aren't any } - (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::FETCHED); + (void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::FETCHED); if (result[0] != '\0') { obj["handlers fetched"] = result; } - (void)emsdevice->show_telegram_handlers(result, EMSdevice::Handlers::PENDING); + (void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::PENDING); if (result[0] != '\0') { obj["handlers pending"] = result; } From 657914db26fae6feef9635439a7e2ec0809aa66a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 11 Mar 2022 13:04:47 +0100 Subject: [PATCH 101/319] add devices #393 --- src/device_library.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/device_library.h b/src/device_library.h index 9d56e4602..8d89f7591 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -90,6 +90,7 @@ {165, DeviceType::THERMOSTAT, F("RC100/Moduline 1000/1010"), DeviceFlags::EMS_DEVICE_FLAG_RC100}, // 0x18, 0x38 {172, DeviceType::THERMOSTAT, F("Rego 2000/3000"), DeviceFlags::EMS_DEVICE_FLAG_RC300}, // 0x10 {216, DeviceType::THERMOSTAT, F("CRF200S"), DeviceFlags::EMS_DEVICE_FLAG_CRF | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18 +{246, DeviceType::THERMOSTAT, F("Comfort+2RF"), DeviceFlags::EMS_DEVICE_FLAG_CRF | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18 // Thermostat - Sieger - 0x10 / 0x17 { 66, DeviceType::THERMOSTAT, F("ES72/RC20"), DeviceFlags::EMS_DEVICE_FLAG_RC20_N}, // 0x17 or remote @@ -134,6 +135,7 @@ // Wireless sensor base - 0x50 {236, DeviceType::CONNECT, F("Wireless sensor base"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{238, DeviceType::CONNECT, F("Wireless sensor base"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Switches - 0x11 { 71, DeviceType::SWITCH, F("WM10"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, From d56cdeec77adf20ff2511943effaa821ecba246c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 11 Mar 2022 13:05:20 +0100 Subject: [PATCH 102/319] add burner stage 2 working time, #392 --- src/devices/boiler.cpp | 15 +++++++++------ src/devices/boiler.h | 1 + src/locale_DE.h | 1 + src/locale_EN.h | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 3f3165410..21597f4bf 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -168,6 +168,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &curBurnPow_, DeviceValueType::UINT, nullptr, FL_(curBurnPow), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &burnStarts_, DeviceValueType::ULONG, nullptr, FL_(burnStarts), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &burnWorkMin_, DeviceValueType::TIME, nullptr, FL_(burnWorkMin), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &burn2WorkMin_, DeviceValueType::TIME, nullptr, FL_(burn2WorkMin), DeviceValueUOM::MINUTES); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatWorkMin_, DeviceValueType::TIME, nullptr, FL_(heatWorkMin), DeviceValueUOM::MINUTES); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &UBAuptime_, DeviceValueType::TIME, nullptr, FL_(UBAuptime), DeviceValueUOM::MINUTES); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &lastCode_, DeviceValueType::STRING, nullptr, FL_(lastCode), DeviceValueUOM::NONE); @@ -629,9 +630,10 @@ void Boiler::process_UBAMonitorSlow(std::shared_ptr telegram) { has_update(telegram, exhaustTemp_, 4); has_update(telegram, switchTemp_, 25); // only if there is a mixer module present has_update(telegram, heatingPumpMod_, 9); - has_update(telegram, burnStarts_, 10, 3); // force to 3 bytes - has_update(telegram, burnWorkMin_, 13, 3); // force to 3 bytes - has_update(telegram, heatWorkMin_, 19, 3); // force to 3 bytes + has_update(telegram, burnStarts_, 10, 3); // force to 3 bytes + has_update(telegram, burnWorkMin_, 13, 3); // force to 3 bytes + has_update(telegram, burn2WorkMin_, 16, 3); // force to 3 bytes + has_update(telegram, heatWorkMin_, 19, 3); // force to 3 bytes } /* @@ -653,9 +655,10 @@ void Boiler::process_UBAMonitorSlowPlus(std::shared_ptr telegram has_bitupdate(telegram, heatingPump_, 2, 5); has_bitupdate(telegram, wwCirc_, 2, 7); has_update(telegram, exhaustTemp_, 6); - has_update(telegram, burnStarts_, 10, 3); // force to 3 bytes - has_update(telegram, burnWorkMin_, 13, 3); // force to 3 bytes - has_update(telegram, heatWorkMin_, 19, 3); // force to 3 bytes + has_update(telegram, burnStarts_, 10, 3); // force to 3 bytes + has_update(telegram, burnWorkMin_, 13, 3); // force to 3 bytes + has_update(telegram, burn2WorkMin_, 16, 3); // force to 3 bytes + has_update(telegram, heatWorkMin_, 19, 3); // force to 3 bytes has_update(telegram, heatingPumpMod_, 25); // temperature measurements at 4, see #620 } diff --git a/src/devices/boiler.h b/src/devices/boiler.h index d83973260..a6e90b44f 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -125,6 +125,7 @@ class Boiler : public EMSdevice { uint8_t setBurnPow_; // max output power in % uint32_t burnStarts_; // burner restarts uint32_t burnWorkMin_; // Total burner operating time + uint32_t burn2WorkMin_; // burner stage 2 operating time uint32_t heatWorkMin_; // Total heat operating time uint32_t UBAuptime_; // Total UBA working hours char lastCode_[75]; // last error code diff --git a/src/locale_DE.h b/src/locale_DE.h index 8f9108c65..bbc2908cb 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -454,6 +454,7 @@ MAKE_PSTR_LIST(setBurnPow, F("setburnpow"), F("Sollwert Brennerleistung")) MAKE_PSTR_LIST(curBurnPow, F("curburnpow"), F("Brennerleistung")) MAKE_PSTR_LIST(burnStarts, F("burnstarts"), F("Brenner # starts")) MAKE_PSTR_LIST(burnWorkMin, F("burnworkmin"), F("Brenner Laufzeit")) +MAKE_PSTR_LIST(burn2WorkMin, F("burn2workmin"), F("Brenner Stufe 2 Laufzeit")) MAKE_PSTR_LIST(heatWorkMin, F("heatworkmin"), F("Heizung Laufzeit")) MAKE_PSTR_LIST(UBAuptime, F("ubauptime"), F("gesamte Laufzeit")) MAKE_PSTR_LIST(lastCode, F("lastcode"), F("Fehlerspeicher")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 00b02ad7c..001bdd596 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -443,6 +443,7 @@ MAKE_PSTR_LIST(setBurnPow, F("setburnpow"), F("burner set power")) MAKE_PSTR_LIST(curBurnPow, F("curburnpow"), F("burner current power")) MAKE_PSTR_LIST(burnStarts, F("burnstarts"), F("burner starts")) MAKE_PSTR_LIST(burnWorkMin, F("burnworkmin"), F("total burner operating time")) +MAKE_PSTR_LIST(burn2WorkMin, F("burn2workmin"), F("burner stage 2 operating time")) MAKE_PSTR_LIST(heatWorkMin, F("heatworkmin"), F("total heat operating time")) MAKE_PSTR_LIST(UBAuptime, F("ubauptime"), F("total UBA operating time")) MAKE_PSTR_LIST(lastCode, F("lastcode"), F("last error code")) From 0aa5c736350385bad2a7752ad952f4fea33167cd Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 11 Mar 2022 17:00:09 +0100 Subject: [PATCH 103/319] Update README.md added sonarcloud badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 88bc0d6e1..4f3893c9c 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ This project is the specifically for the ESP32. Compared with the previous ESP82 [![version](https://img.shields.io/github/release/emsesp/EMS-ESP32.svg?label=Latest%20Release)](https://github.com/emsesp/EMS-ESP32/blob/main/CHANGELOG.md) [![release-date](https://img.shields.io/github/release-date/emsesp/EMS-ESP32.svg?label=Released)](https://github.com/emsesp/EMS-ESP32/commits/main) [![license](https://img.shields.io/github/license/emsesp/EMS-ESP32.svg)](LICENSE) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=emsesp_EMS-ESP32&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=emsesp_EMS-ESP32) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/9441142f49424ef891e8f5251866ee6b)](https://www.codacy.com/gh/emsesp/EMS-ESP32/dashboard?utm_source=github.com&utm_medium=referral&utm_content=emsesp/EMS-ESP32&utm_campaign=Badge_Grade) [![downloads](https://img.shields.io/github/downloads/emsesp/EMS-ESP32/total.svg)](https://github.com/emsesp/EMS-ESP32/releases) [![chat](https://img.shields.io/discord/816637840644505620.svg?style=flat-square&color=blueviolet)](https://discord.gg/3J3GgnzpyT) From 1227772696c7c4cd36808befc90c37641ba8a62f Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 12 Mar 2022 17:40:51 +0100 Subject: [PATCH 104/319] remove comments --- src/helpers.cpp | 6 ------ src/helpers.h | 1 - 2 files changed, 7 deletions(-) diff --git a/src/helpers.cpp b/src/helpers.cpp index 3320f5037..09c8792ee 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -190,12 +190,6 @@ char * Helpers::render_boolean(char * result, bool value) { return result; } -// // render for native char strings -// char * Helpers::render_value(char * result, const char * value, const int8_t format __attribute__((unused))) { -// strcpy(result, value); // un-safe but we don't care -// return result; -// } - // convert unsigned int (single byte) to text value and returns it // format: 255(0xFF)=boolean, 0=no formatting, otherwise divide by format char * Helpers::render_value(char * result, uint8_t value, int8_t format, const uint8_t fahrenheit) { diff --git a/src/helpers.h b/src/helpers.h index 06a4bb671..7068954fe 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -37,7 +37,6 @@ class Helpers { static char * render_value(char * result, const uint32_t value, const int8_t format, const uint8_t fahrenheit = 0); static char * render_value(char * result, const int16_t value, const int8_t format, const uint8_t fahrenheit = 0); static char * render_value(char * result, const int32_t value, const int8_t format, const uint8_t fahrenheit = 0); - // static char * render_value(char * result, const char * value, const int8_t format); static char * render_boolean(char * result, bool value); static char * hextoa(char * result, const uint8_t value); From 508e98e3b671fbd046fe513945104078d23ce24c Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 12 Mar 2022 17:40:59 +0100 Subject: [PATCH 105/319] update packages again --- interface/package-lock.json | 16 +++++++--------- interface/package.json | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index f12dff465..8d3c1aa80 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -8,7 +8,7 @@ "name": "EMS-ESP", "version": "3.4.0", "dependencies": { - "@emotion/react": "^11.8.1", + "@emotion/react": "^11.8.2", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.5.0", @@ -1998,15 +1998,14 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "node_modules/@emotion/react": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.1.tgz", - "integrity": "sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==", + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.2.tgz", + "integrity": "sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==", "dependencies": { "@babel/runtime": "^7.13.10", "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", "@emotion/serialize": "^1.0.2", - "@emotion/sheet": "^1.1.0", "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" @@ -18987,15 +18986,14 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "@emotion/react": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.1.tgz", - "integrity": "sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==", + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.2.tgz", + "integrity": "sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==", "requires": { "@babel/runtime": "^7.13.10", "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", "@emotion/serialize": "^1.0.2", - "@emotion/sheet": "^1.1.0", "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" diff --git a/interface/package.json b/interface/package.json index 0e12b96a5..31df2bbad 100644 --- a/interface/package.json +++ b/interface/package.json @@ -4,7 +4,7 @@ "private": true, "proxy": "http://localhost:3080", "dependencies": { - "@emotion/react": "^11.8.1", + "@emotion/react": "^11.8.2", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.5.0", From d0aa601301f74d8fac134b854a79a139b6330dd4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 13 Mar 2022 13:29:07 +0100 Subject: [PATCH 106/319] add RC35 values #398 --- CHANGELOG_LATEST.md | 1 + src/devices/thermostat.cpp | 66 ++++++++++++++++++++++++++++++++++++-- src/devices/thermostat.h | 17 ++++++++++ src/locale_DE.h | 5 +++ src/locale_EN.h | 5 +++ 5 files changed, 91 insertions(+), 3 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 74ecb6350..c449bc8ce 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -26,6 +26,7 @@ - remove MQTT retained configs if discovery is disabled - timeout 10 min for MQTT-QoS wait - Moduline 300 auto-temperatures T1-T4, RC300 romminfluencefactor +- RC35 parameters [#392](https://github.com/emsesp/EMS-ESP32/issues/392)[#398](https://github.com/emsesp/EMS-ESP32/issues/398) ### Fixed diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 689690e67..a57248c5e 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1102,12 +1102,16 @@ void Thermostat::process_RC35Set(std::shared_ptr telegram) { has_update(telegram, hc->wwprio, 21); // 0xFF for on has_update(telegram, hc->summertemp, 22); // is * 1 has_update(telegram, hc->nofrosttemp, 23); // is * 1 + has_update(telegram, hc->nofrostmode, 28); // 0-off, 1-outdoor, 2-roomtemp 5°C has_update(telegram, hc->flowtempoffset, 24); // is * 1, only in mixed circuits has_update(telegram, hc->reducemode, 25); // 0-nofrost, 1-reduce, 2-roomhold, 3-outdoorhold has_update(telegram, hc->control, 26); // 0-off, 1-RC20 (remote), 2-RC35 has_update(telegram, hc->controlmode, 33); // 0-outdoortemp, 1-roomtemp has_update(telegram, hc->tempautotemp, 37); - has_update(telegram, hc->noreducetemp, 38); // outdoor temperature for no reduce + has_update(telegram, hc->noreducetemp, 38); // outdoor temperature for no reduce + has_update(telegram, hc->reducetemp, 39); // temperature for off/reduce + has_update(telegram, hc->vacreducetemp, 40); // temperature for off/reduce in vacations + has_update(telegram, hc->vacreducemode, 41); // vacations reduce mode has_update(telegram, hc->minflowtemp, 16); if (hc->heatingtype == 3) { // floor heating @@ -1427,7 +1431,7 @@ bool Thermostat::set_control(const char * value, const int8_t id) { return true; } } else if (Helpers::value2enum(value, ctrl, FL_(enum_control))) { - write_command(set_typeids[hc->hc()], 26, ctrl); + write_command(set_typeids[hc->hc()], EMS_OFFSET_RC35Set_control, ctrl); return true; } @@ -2053,7 +2057,41 @@ bool Thermostat::set_reducemode(const char * value, const int8_t id) { return false; } - write_command(set_typeids[hc->hc()], 25, set, set_typeids[hc->hc()]); + write_command(set_typeids[hc->hc()], EMS_OFFSET_RC35Set_reducemode, set, set_typeids[hc->hc()]); + return true; +} + +// sets the thermostat reducemode for RC35 vacations +bool Thermostat::set_vacreducemode(const char * value, const int8_t id) { + uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; + std::shared_ptr hc = heating_circuit(hc_num); + if (hc == nullptr) { + return false; + } + + uint8_t set = 0xFF; + if (!Helpers::value2enum(value, set, FL_(enum_reducemode))) { + return false; + } + + write_command(set_typeids[hc->hc()], EMS_OFFSET_RC35Set_vacreducemode, set, set_typeids[hc->hc()]); + return true; +} + +// sets the thermostat nofrost mode for RC35 +bool Thermostat::set_nofrostmode(const char * value, const int8_t id) { + uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; + std::shared_ptr hc = heating_circuit(hc_num); + if (hc == nullptr) { + return false; + } + + uint8_t set = 0xFF; + if (!Helpers::value2enum(value, set, FL_(enum_nofrostmode))) { + return false; + } + + write_command(set_typeids[hc->hc()], EMS_OFFSET_RC35Set_nofrostmode, set, set_typeids[hc->hc()]); return true; } @@ -2578,6 +2616,14 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = EMS_OFFSET_RC35Set_noreducetemp; factor = 1; break; + case HeatingCircuit::Mode::REDUCE: + offset = EMS_OFFSET_RC35Set_reducetemp; + factor = 1; + break; + case HeatingCircuit::Mode::VACREDUCE: + offset = EMS_OFFSET_RC35Set_vacreducetemp; + factor = 1; + break; case HeatingCircuit::Mode::TEMPAUTO: offset = EMS_OFFSET_RC35Set_seltemp; break; @@ -2756,6 +2802,14 @@ bool Thermostat::set_noreducetemp(const char * value, const int8_t id) { return set_temperature_value(value, id, HeatingCircuit::Mode::NOREDUCE); } +bool Thermostat::set_reducetemp(const char * value, const int8_t id) { + return set_temperature_value(value, id, HeatingCircuit::Mode::REDUCE); +} + +bool Thermostat::set_vacreducetemp(const char * value, const int8_t id) { + return set_temperature_value(value, id, HeatingCircuit::Mode::VACREDUCE); +} + bool Thermostat::set_flowtempoffset(const char * value, const int8_t id) { return set_temperature_value(value, id, HeatingCircuit::Mode::FLOWOFFSET, true); } @@ -3303,6 +3357,8 @@ void Thermostat::register_device_values_hc(std::shared_ptrsummermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); register_device_value(tag, &hc->holidaymode, DeviceValueType::BOOL, nullptr, FL_(holidaymode), DeviceValueUOM::NONE); register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, nullptr, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); + register_device_value( + tag, &hc->nofrostmode, DeviceValueType::ENUM, FL_(enum_nofrostmode), FL_(nofrostmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_nofrostmode)); register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, nullptr, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence)); register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); @@ -3321,6 +3377,10 @@ void Thermostat::register_device_values_hc(std::shared_ptrparty, DeviceValueType::UINT, nullptr, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party)); register_device_value(tag, &hc->tempautotemp, DeviceValueType::UINT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp)); register_device_value(tag, &hc->noreducetemp, DeviceValueType::INT, nullptr, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp)); + register_device_value(tag, &hc->reducetemp, DeviceValueType::INT, nullptr, FL_(reducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_reducetemp)); + register_device_value(tag, &hc->vacreducetemp, DeviceValueType::INT, nullptr, FL_(vacreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_vacreducetemp)); + register_device_value( + tag, &hc->vacreducemode, DeviceValueType::ENUM, FL_(enum_reducemode), FL_(vacreducemode), DeviceValueUOM::NONE, MAKE_CF_CB(set_vacreducemode)); register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_remotetemp)); register_device_value(tag, &hc->wwprio, DeviceValueType::BOOL, nullptr, FL_(wwprio), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwprio)); register_device_value( diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 8bd467b46..9793d1645 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -62,12 +62,16 @@ class Thermostat : public EMSdevice { uint8_t minflowtemp; uint8_t maxflowtemp; uint8_t reducemode; + uint8_t nofrostmode; uint8_t program; uint8_t controlmode; uint8_t control; uint8_t pause; uint8_t party; int8_t noreducetemp; // signed -20°C to +10°C + int8_t reducetemp; + int8_t vacreducetemp; + uint8_t vacreducemode; uint8_t wwprio; uint8_t fastHeatup; char holiday[26]; @@ -120,6 +124,8 @@ class Thermostat : public EMSdevice { ROOMINFLUENCE, TEMPAUTO, NOREDUCE, + REDUCE, + VACREDUCE, ON, DAYLOW, DAYMID, @@ -245,6 +251,12 @@ class Thermostat : public EMSdevice { static constexpr uint8_t EMS_OFFSET_RC35Set_targetflowtemp = 14; // target flow temperature static constexpr uint8_t EMS_OFFSET_RC35Set_seltemp = 37; // selected temp static constexpr uint8_t EMS_OFFSET_RC35Set_noreducetemp = 38; // temp to stop reducing + static constexpr uint8_t EMS_OFFSET_RC35Set_reducetemp = 39; // temp reducing/hold + static constexpr uint8_t EMS_OFFSET_RC35Set_vacreducetemp = 40; // temp reducing/hold in vacations + static constexpr uint8_t EMS_OFFSET_RC35Set_vacreducemode = 41; // reduce mode in vacations + static constexpr uint8_t EMS_OFFSET_RC35Set_reducemode = 25; // reduce mode in normal operation + static constexpr uint8_t EMS_OFFSET_RC35Set_nofrostmode = 28; // 0-off, 1-room, 2-outdoor + static constexpr uint8_t EMS_OFFSET_RC35Set_control = 26; // 0-off, 1-RC20, 2-RC3x static constexpr uint8_t EMS_OFFSET_RC35Set_temp_offset = 6; static constexpr uint8_t EMS_OFFSET_RC35Set_temp_flowoffset = 24; static constexpr uint8_t EMS_OFFSET_RC35Set_temp_design = 17; @@ -368,6 +380,11 @@ class Thermostat : public EMSdevice { bool set_manualtemp(const char * value, const int8_t id); bool set_tempautotemp(const char * value, const int8_t id); bool set_noreducetemp(const char * value, const int8_t id); + bool set_reducetemp(const char * value, const int8_t id); + bool set_vacreducetemp(const char * value, const int8_t id); + bool set_vacreducemode(const char * value, const int8_t id); + bool set_nofrostmode(const char * value, const int8_t id); + bool set_remotetemp(const char * value, const int8_t id); bool set_roominfluence(const char * value, const int8_t id); bool set_roominfl_factor(const char * value, const int8_t id); diff --git a/src/locale_DE.h b/src/locale_DE.h index bbc2908cb..f32464a03 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -372,6 +372,7 @@ MAKE_PSTR_LIST(enum_modetype4, F_(nofrost), F_(eco), F_(heat)) MAKE_PSTR_LIST(enum_modetype5, F_(off), F_(on)) MAKE_PSTR_LIST(enum_reducemode, F_(nofrost), F_(reduce), F_(room), F_(outdoor)) +MAKE_PSTR_LIST(enum_nofrostmode, F_(off), F_(room), F_(outdoor)) MAKE_PSTR_LIST(enum_controlmode, F_(off), F_(optimized), F_(simple), F_(mpc), F_(room), F_(power), F_(constant)) MAKE_PSTR_LIST(enum_controlmode2, F_(outdoor), F_(room)) @@ -636,6 +637,10 @@ MAKE_PSTR_LIST(holidaymode, F("holidaymode"), F("Urlaubsbetrieb")) MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("Flusstemperaturanhebung")) MAKE_PSTR_LIST(reducemode, F("reducemode"), F("Absenkmodus")) MAKE_PSTR_LIST(noreducetemp, F("noreducetemp"), F("Absenkung unterbrechen unter Temperatur")) +MAKE_PSTR_LIST(reducetemp, F("reducetemp"), F("Absenkmodus unter Temperatur")) +MAKE_PSTR_LIST(vacreducetemp, F("vacreducetemp"), F("Urlaub Absenkmodus unter Temperatur")) +MAKE_PSTR_LIST(vacreducemode, F("vacreducemode"), F("Urlaub Absenkmodus")) +MAKE_PSTR_LIST(nofrostmode, F("nofrostmode"), F("Frostschutz Modus")) MAKE_PSTR_LIST(remotetemp, F("remotetemp"), F("Raumtemperatur der Fernsteuerung")) MAKE_PSTR_LIST(reducehours, F("reducehours"), F("duration for nighttemp")) MAKE_PSTR_LIST(reduceminutes, F("reduceminutes"), F("remaining time for nightmode")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 001bdd596..2939a63f7 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -372,6 +372,7 @@ MAKE_PSTR_LIST(enum_modetype4, F_(nofrost), F_(eco), F_(heat)) MAKE_PSTR_LIST(enum_modetype5, F_(off), F_(on)) MAKE_PSTR_LIST(enum_reducemode, F_(nofrost), F_(reduce), F_(room), F_(outdoor)) +MAKE_PSTR_LIST(enum_nofrostmode, F_(off), F_(room), F_(outdoor)) MAKE_PSTR_LIST(enum_controlmode, F_(off), F_(optimized), F_(simple), F_(mpc), F_(room), F_(power), F_(constant)) MAKE_PSTR_LIST(enum_controlmode2, F_(outdoor), F_(room)) @@ -626,6 +627,10 @@ MAKE_PSTR_LIST(holidaymode, F("holidaymode"), F("holiday mode")) MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("flow temperature offset for mixer")) MAKE_PSTR_LIST(reducemode, F("reducemode"), F("reduce mode")) MAKE_PSTR_LIST(noreducetemp, F("noreducetemp"), F("no reduce below temperature")) +MAKE_PSTR_LIST(reducetemp, F("reducetemp"), F("off/reduce switch temperature")) +MAKE_PSTR_LIST(vacreducetemp, F("vacreducetemp"), F("vacations off/reduce switch temperature")) +MAKE_PSTR_LIST(vacreducemode, F("vacreducemode"), F("vacations reduce mode")) +MAKE_PSTR_LIST(nofrostmode, F("nofrostmode"), F("nofrost mode")) MAKE_PSTR_LIST(remotetemp, F("remotetemp"), F("room temperature from remote")) MAKE_PSTR_LIST(reducehours, F("reducehours"), F("duration for nighttemp")) MAKE_PSTR_LIST(reduceminutes, F("reduceminutes"), F("remaining time for nightmode")) From 0351f4fbb39d5e626cf952c243aed30400bd39c5 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 19 Mar 2022 12:05:38 +0100 Subject: [PATCH 107/319] update packages --- interface/package-lock.json | 152 ++++++++++++++++++------------------ interface/package.json | 12 +-- 2 files changed, 82 insertions(+), 82 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 8d3c1aa80..4975cac20 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -11,16 +11,16 @@ "@emotion/react": "^11.8.2", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.5.0", - "@mui/material": "^5.5.0", - "@types/lodash": "^4.14.179", + "@mui/icons-material": "^5.5.1", + "@mui/material": "^5.5.1", + "@types/lodash": "^4.14.180", "@types/node": "^17.0.21", - "@types/react": "^17.0.40", - "@types/react-dom": "^17.0.13", + "@types/react": "^17.0.41", + "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", "axios": "^0.26.1", - "http-proxy-middleware": "^2.0.3", + "http-proxy-middleware": "^2.0.4", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "notistack": "^2.0.3", @@ -2857,14 +2857,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.71", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.71.tgz", - "integrity": "sha512-LinacyjmZOS+roUqCyhrcbNIW7TlRf1U+15ETGwMn6biNXI9YEVgcc1Kak08CRtjM0yczxxzLWetiAjHMCVSjQ==", + "version": "5.0.0-alpha.72", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.72.tgz", + "integrity": "sha512-WCAooa9eqbsC68LhyKtDBRumH4hV1eRZ0A3SDKFHSwYG9fCOdsFv/H1dIYRJM0rwD45bMnuDiG3Qmx7YsTiptw==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/utils": "^5.4.4", - "@popperjs/core": "^2.11.2", + "@popperjs/core": "^2.11.3", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" @@ -2888,9 +2888,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.5.0.tgz", - "integrity": "sha512-rMs5flT3INyd/m1A/x8DDlNTfHmCartX8stCuSDDMmaMV123oSwg8werJ/Hg4j1FWuVk5rE5HRY45gBf12BCGw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.5.1.tgz", + "integrity": "sha512-40f68p5+Yhq3dCn3QYHqQt5RETPyR3AkDw+fma8PtcjqvZ+d+jF84kFmT6NqwA3he7TlwluEtkyAmPzUE4uPdA==", "dependencies": { "@babel/runtime": "^7.17.2" }, @@ -2913,14 +2913,14 @@ } }, "node_modules/@mui/material": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.0.tgz", - "integrity": "sha512-E12rxqLaWBrebJCxKxBtyRrzJgpPIQSCt4MUHns2Yl9gxOx4c7vDDKuks7Qc6S36wTQf+FP4aiey72Z2WKdYgQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.1.tgz", + "integrity": "sha512-bJSYgymgSZ7btPTNnWFrr2EmGoVQc4A/0WLfP/ESY2dxnhnbFDwt7twiOKmJp3u84YXriEDt5v9EZQLf7A+y0Q==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.71", - "@mui/system": "^5.5.0", - "@mui/types": "^7.1.2", + "@mui/base": "5.0.0-alpha.72", + "@mui/system": "^5.5.1", + "@mui/types": "^7.1.3", "@mui/utils": "^5.4.4", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", @@ -3013,14 +3013,14 @@ } }, "node_modules/@mui/system": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.0.tgz", - "integrity": "sha512-zFOfERv3Y4m5ehwTRR9cGaPuMvlD2qVXmFKC60P0Gte3aD6vYObyNriZv+mDVGlhDxZTZhxBrNPH3ns25xSFtQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.1.tgz", + "integrity": "sha512-2hynI4hN8304hOCT8sc4knJviwUUYJ7XK3mXwQ0nagVGOPnWSOad/nYADm7K0vdlCeUXLIbDbe7oNN3Kaiu2kA==", "dependencies": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.4.4", "@mui/styled-engine": "^5.4.4", - "@mui/types": "^7.1.2", + "@mui/types": "^7.1.3", "@mui/utils": "^5.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -3052,9 +3052,9 @@ } }, "node_modules/@mui/types": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.2.tgz", - "integrity": "sha512-SD7O1nVzqG+ckQpFjDhXPZjRceB8HQFHEvdLLrPhlJy4lLbwEBbxK74Tj4t6Jgk0fTvLJisuwOutrtYe9P/xBQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", + "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==", "peerDependencies": { "@types/react": "*" }, @@ -3176,9 +3176,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", - "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.4.tgz", + "integrity": "sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -3737,9 +3737,9 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "node_modules/@types/lodash": { - "version": "4.14.179", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.179.tgz", - "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==" + "version": "4.14.180", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.180.tgz", + "integrity": "sha512-XOKXa1KIxtNXgASAnwj7cnttJxS4fksBRywK/9LzRV5YxrF80BXZIGeQSuoESQ/VkUj30Ae0+YcuHc15wJCB2g==" }, "node_modules/@types/mime": { "version": "1.3.2", @@ -3782,9 +3782,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.40", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz", - "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==", + "version": "17.0.41", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.41.tgz", + "integrity": "sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3792,9 +3792,9 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz", - "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==", + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.14.tgz", + "integrity": "sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==", "dependencies": { "@types/react": "*" } @@ -8909,9 +8909,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", - "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -19616,36 +19616,36 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.71", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.71.tgz", - "integrity": "sha512-LinacyjmZOS+roUqCyhrcbNIW7TlRf1U+15ETGwMn6biNXI9YEVgcc1Kak08CRtjM0yczxxzLWetiAjHMCVSjQ==", + "version": "5.0.0-alpha.72", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.72.tgz", + "integrity": "sha512-WCAooa9eqbsC68LhyKtDBRumH4hV1eRZ0A3SDKFHSwYG9fCOdsFv/H1dIYRJM0rwD45bMnuDiG3Qmx7YsTiptw==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/utils": "^5.4.4", - "@popperjs/core": "^2.11.2", + "@popperjs/core": "^2.11.3", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" } }, "@mui/icons-material": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.5.0.tgz", - "integrity": "sha512-rMs5flT3INyd/m1A/x8DDlNTfHmCartX8stCuSDDMmaMV123oSwg8werJ/Hg4j1FWuVk5rE5HRY45gBf12BCGw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.5.1.tgz", + "integrity": "sha512-40f68p5+Yhq3dCn3QYHqQt5RETPyR3AkDw+fma8PtcjqvZ+d+jF84kFmT6NqwA3he7TlwluEtkyAmPzUE4uPdA==", "requires": { "@babel/runtime": "^7.17.2" } }, "@mui/material": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.0.tgz", - "integrity": "sha512-E12rxqLaWBrebJCxKxBtyRrzJgpPIQSCt4MUHns2Yl9gxOx4c7vDDKuks7Qc6S36wTQf+FP4aiey72Z2WKdYgQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.1.tgz", + "integrity": "sha512-bJSYgymgSZ7btPTNnWFrr2EmGoVQc4A/0WLfP/ESY2dxnhnbFDwt7twiOKmJp3u84YXriEDt5v9EZQLf7A+y0Q==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.71", - "@mui/system": "^5.5.0", - "@mui/types": "^7.1.2", + "@mui/base": "5.0.0-alpha.72", + "@mui/system": "^5.5.1", + "@mui/types": "^7.1.3", "@mui/utils": "^5.4.4", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", @@ -19677,14 +19677,14 @@ } }, "@mui/system": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.0.tgz", - "integrity": "sha512-zFOfERv3Y4m5ehwTRR9cGaPuMvlD2qVXmFKC60P0Gte3aD6vYObyNriZv+mDVGlhDxZTZhxBrNPH3ns25xSFtQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.1.tgz", + "integrity": "sha512-2hynI4hN8304hOCT8sc4knJviwUUYJ7XK3mXwQ0nagVGOPnWSOad/nYADm7K0vdlCeUXLIbDbe7oNN3Kaiu2kA==", "requires": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.4.4", "@mui/styled-engine": "^5.4.4", - "@mui/types": "^7.1.2", + "@mui/types": "^7.1.3", "@mui/utils": "^5.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -19692,9 +19692,9 @@ } }, "@mui/types": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.2.tgz", - "integrity": "sha512-SD7O1nVzqG+ckQpFjDhXPZjRceB8HQFHEvdLLrPhlJy4lLbwEBbxK74Tj4t6Jgk0fTvLJisuwOutrtYe9P/xBQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", + "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==", "requires": {} }, "@mui/utils": { @@ -19756,9 +19756,9 @@ } }, "@popperjs/core": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", - "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==" + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.4.tgz", + "integrity": "sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg==" }, "@rollup/plugin-babel": { "version": "5.3.1", @@ -20175,9 +20175,9 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "@types/lodash": { - "version": "4.14.179", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.179.tgz", - "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==" + "version": "4.14.180", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.180.tgz", + "integrity": "sha512-XOKXa1KIxtNXgASAnwj7cnttJxS4fksBRywK/9LzRV5YxrF80BXZIGeQSuoESQ/VkUj30Ae0+YcuHc15wJCB2g==" }, "@types/mime": { "version": "1.3.2", @@ -20220,9 +20220,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.40", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz", - "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==", + "version": "17.0.41", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.41.tgz", + "integrity": "sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -20230,9 +20230,9 @@ } }, "@types/react-dom": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz", - "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==", + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.14.tgz", + "integrity": "sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==", "requires": { "@types/react": "*" } @@ -24020,9 +24020,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", - "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", diff --git a/interface/package.json b/interface/package.json index 31df2bbad..da1455693 100644 --- a/interface/package.json +++ b/interface/package.json @@ -7,16 +7,16 @@ "@emotion/react": "^11.8.2", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.5.0", - "@mui/material": "^5.5.0", - "@types/lodash": "^4.14.179", + "@mui/icons-material": "^5.5.1", + "@mui/material": "^5.5.1", + "@types/lodash": "^4.14.180", "@types/node": "^17.0.21", - "@types/react": "^17.0.40", - "@types/react-dom": "^17.0.13", + "@types/react": "^17.0.41", + "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", "axios": "^0.26.1", - "http-proxy-middleware": "^2.0.3", + "http-proxy-middleware": "^2.0.4", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "notistack": "^2.0.3", From 3b5560b74105ea0741193055f9d6e07a7ec72e8f Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 19 Mar 2022 12:23:28 +0100 Subject: [PATCH 108/319] fix console `show` with empty full name --- src/emsdevice.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index f82bafb46..c2ea986f0 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1030,14 +1030,11 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // check conditions: // 1. it must have a valid value (state is active) - // 2. it must have a visible, unless the output_target is MQTT + // 2. it must have be visible and have a full name // 3. it must match the given tag filter or have an empty tag bool conditions = ((tag_filter == DeviceValueTAG::TAG_NONE) || (tag_filter == dv.tag)) && dv.has_state(DeviceValueState::DV_ACTIVE); - // 4. for MQTT we want to always show the special HA entities (they have an empty fullname) - bool visible = ((dv.has_state(DeviceValueState::DV_VISIBLE)) || ((output_target == OUTPUT_TARGET::MQTT) && (!dv.full_name))); - conditions &= visible; - - if (conditions) { + bool visible = dv.has_state(DeviceValueState::DV_VISIBLE) && dv.full_name; + if (conditions && visible) { has_values = true; // flagged if we actually have data // we have a tag if it matches the filter given, and that the tag name is not empty/"" From 786110359a98eb0a499086ac374c99ebf2009892 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 21 Mar 2022 13:44:40 +0100 Subject: [PATCH 109/319] fix #339 maxJsonBuffrSize --- lib/ESPAsyncWebServer/AsyncJson.h | 9 ++++++--- src/web/WebCustomizationService.cpp | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/ESPAsyncWebServer/AsyncJson.h b/lib/ESPAsyncWebServer/AsyncJson.h index f7e0682b4..429ff648f 100644 --- a/lib/ESPAsyncWebServer/AsyncJson.h +++ b/lib/ESPAsyncWebServer/AsyncJson.h @@ -173,7 +173,7 @@ class AsyncCallbackJsonWebHandler : public AsyncWebHandler { ArJsonRequestHandlerFunction _onRequest; size_t _contentLength; #ifndef ARDUINOJSON_5_COMPATIBILITY - const size_t maxJsonBufferSize; + size_t _maxJsonBufferSize; #endif size_t _maxContentLength; @@ -182,7 +182,7 @@ class AsyncCallbackJsonWebHandler : public AsyncWebHandler { : _uri(uri) , _method(HTTP_POST | HTTP_PUT | HTTP_PATCH) , _onRequest(onRequest) - , maxJsonBufferSize(maxJsonBufferSize) + , _maxJsonBufferSize(maxJsonBufferSize) , _maxContentLength(16384) { } @@ -192,6 +192,9 @@ class AsyncCallbackJsonWebHandler : public AsyncWebHandler { void setMaxContentLength(int maxContentLength) { _maxContentLength = maxContentLength; } + void setMaxJsonBufferSize(size_t maxJsonBufferSize) { + _maxJsonBufferSize = maxJsonBufferSize; + } void onRequest(ArJsonRequestHandlerFunction fn) { _onRequest = fn; } @@ -216,7 +219,7 @@ class AsyncCallbackJsonWebHandler : public AsyncWebHandler { virtual void handleRequest(AsyncWebServerRequest * request) override final { if (_onRequest) { if (request->_tempObject != NULL) { - DynamicJsonDocument jsonBuffer(this->maxJsonBufferSize); + DynamicJsonDocument jsonBuffer(this->_maxJsonBufferSize); DeserializationError error = deserializeJson(jsonBuffer, (uint8_t *)(request->_tempObject)); if (!error) { JsonVariant json = jsonBuffer.as(); diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 7564de6e5..98e060ed3 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -46,7 +46,8 @@ WebCustomizationService::WebCustomizationService(AsyncWebServer * server, FS * f securityManager->wrapRequest(std::bind(&WebCustomizationService::reset_customization, this, _1), AuthenticationPredicates::IS_ADMIN)); _exclude_entities_handler.setMethod(HTTP_POST); - _exclude_entities_handler.setMaxContentLength(1024); + _exclude_entities_handler.setMaxContentLength(2048); + _exclude_entities_handler.setMaxJsonBufferSize(2048); server->addHandler(&_exclude_entities_handler); _device_entities_handler.setMethod(HTTP_POST); From 4a132e769c0a6072e0ba7884259d0857ec2ca3c7 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 21 Mar 2022 13:50:54 +0100 Subject: [PATCH 110/319] fix publish `reset` --- src/devices/boiler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 21597f4bf..f52c5fd3d 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -1478,12 +1478,12 @@ bool Boiler::set_reset(const char * value, const int8_t id) { if (num == 1) { // LOG_INFO(F("Reset boiler maintenance message")); write_command(0x05, 0x08, 0xFF, 0x1C); - has_update(reset_); + has_update(&reset_); return true; } else if (num == 2) { // LOG_INFO(F("Reset boiler error message")); write_command(0x05, 0x00, 0x5A); // error reset - has_update(reset_); + has_update(&reset_); return true; } return false; From 8d172e0b571d80d7fc29dfe0d43ccd61051a0399 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 21 Mar 2022 13:55:01 +0100 Subject: [PATCH 111/319] set mode in advance after command, #395 --- src/devices/thermostat.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index a57248c5e..6e3f10e0b 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -2001,6 +2001,14 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { // post validate is the corresponding monitor or set type IDs as they can differ per model write_command(set_typeid, offset, set_mode_value, validate_typeid); + // set hc->mode temporary until validate is received + if (model() == EMSdevice::EMS_DEVICE_FLAG_RC10) { + hc->mode = set_mode_value >> 1; + } else { + hc->mode = set_mode_value; + } + has_update(&hc->mode); + return true; } From 51f2009a2ce44706d22f003dc97f2326b2b3b59c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 21 Mar 2022 14:56:41 +0100 Subject: [PATCH 112/319] npm update --- interface/package-lock.json | 1238 +++++++++++++++++++---------------- 1 file changed, 690 insertions(+), 548 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 4975cac20..114cb4843 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -63,25 +63,25 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", - "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.2", - "@babel/parser": "^7.17.3", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", @@ -145,9 +145,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -181,11 +181,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dependencies": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" @@ -308,11 +308,11 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -330,13 +330,13 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", @@ -395,11 +395,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -458,12 +458,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", + "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" }, "engines": { @@ -484,9 +484,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -572,11 +572,11 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz", - "integrity": "sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz", + "integrity": "sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.1", + "@babel/helper-create-class-features-plugin": "^7.17.6", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/plugin-syntax-decorators": "^7.17.0", @@ -1110,9 +1110,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz", - "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1257,13 +1257,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", + "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1274,12 +1274,12 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -1753,9 +1753,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", + "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1764,9 +1764,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz", - "integrity": "sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", + "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", "dependencies": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -2081,15 +2081,15 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", - "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", @@ -2105,9 +2105,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2118,14 +2118,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "engines": { - "node": ">= 4" - } - }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3259,9 +3251,9 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz", - "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz", + "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==" }, "node_modules/@sindresorhus/is": { "version": "0.14.0", @@ -3565,9 +3557,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -3727,9 +3719,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", + "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -3888,9 +3880,9 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, "node_modules/@types/ws": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.2.tgz", - "integrity": "sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dependencies": { "@types/node": "*" } @@ -3909,13 +3901,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz", + "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==", "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/type-utils": "5.15.0", + "@typescript-eslint/utils": "5.15.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -3955,11 +3947,11 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.14.0.tgz", - "integrity": "sha512-ke48La1A/TWAn949cdgQiP3oK0NT7ArhDAOVOmNLVjT/uAXlFyrJY8dM4qqxHrATzIp8glg+G2OZjy2lRKBIUA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.15.0.tgz", + "integrity": "sha512-AJOOaBrVqKYWaYDBtgMi9XVDB3YHXlffto/3A4VQ39VVaNqosSOp/nW09G4N/ej8WlzHQB2jTnSfP5wWsXSQJA==", "dependencies": { - "@typescript-eslint/utils": "5.14.0" + "@typescript-eslint/utils": "5.15.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3973,13 +3965,13 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz", + "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==", "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/typescript-estree": "5.15.0", "debug": "^4.3.2" }, "engines": { @@ -3999,12 +3991,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz", + "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==", "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/visitor-keys": "5.15.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4015,11 +4007,11 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz", + "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==", "dependencies": { - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/utils": "5.15.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -4040,9 +4032,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz", + "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4052,12 +4044,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz", + "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==", "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/visitor-keys": "5.15.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -4092,14 +4084,14 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz", + "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/typescript-estree": "5.15.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4135,11 +4127,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz", + "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==", "dependencies": { - "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/types": "5.15.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -4690,13 +4682,23 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4707,10 +4709,6 @@ "engines": { "node": "^10 || ^12 || >=14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.1.0" } @@ -5310,12 +5308,22 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" @@ -5325,10 +5333,6 @@ }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bser": { @@ -5479,13 +5483,19 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001314", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", - "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001319", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", + "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -6210,9 +6220,9 @@ } }, "node_modules/cssdb": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.4.1.tgz", - "integrity": "sha512-R70R/Q1fPlM1D6Y+Kpat0QjiY+aMsY2/8lekdVoYcJ7ZQs9kw71W78FdOMf8DFq975KHQf1089PNg1dLsbAhoA==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", + "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==" }, "node_modules/cssesc": { "version": "3.0.0", @@ -6226,11 +6236,11 @@ } }, "node_modules/cssnano": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.1.tgz", - "integrity": "sha512-WWfN7jBK/3Uk3oX/jsFbQApDf9DkXj6dOYull5ZaSGskcDggzg3RyDZI4GKKO+00LdfLMEZtY1cwTQUL+YMg2Q==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.4.tgz", + "integrity": "sha512-hbfhVZreEPyzl+NbvRsjNo54JOX80b+j6nqG2biLVLaZHJEiqGyMh4xDGHtwhUKd5p59mj2GlDqlUBwJUuIu5A==", "dependencies": { - "cssnano-preset-default": "^5.2.1", + "cssnano-preset-default": "^*", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -6246,39 +6256,39 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.1.tgz", - "integrity": "sha512-Y+CUCS5iZ1uzHn5KtmKIlysQVXrTtLCnYsYTOJcbdd5rghOwtw1gobvEXefBncjGO4fWwGZr9/n9hwZfo6W1Fw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.4.tgz", + "integrity": "sha512-w1Gg8xsebln6/axZ6qDFQHuglrGfbIHOIx0g4y9+etRlRab8CGpSpe6UMsrgJe4zhCaJ0LwLmc+PhdLRTwnhIA==", "dependencies": { "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^*", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.0", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.0", - "postcss-merge-rules": "^5.1.0", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.0", - "postcss-minify-params": "^5.1.0", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.0", - "postcss-ordered-values": "^5.1.0", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" + "postcss-colormin": "^*", + "postcss-convert-values": "^*", + "postcss-discard-comments": "^*", + "postcss-discard-duplicates": "^*", + "postcss-discard-empty": "^*", + "postcss-discard-overridden": "^*", + "postcss-merge-longhand": "^*", + "postcss-merge-rules": "^*", + "postcss-minify-font-values": "^*", + "postcss-minify-gradients": "^*", + "postcss-minify-params": "^*", + "postcss-minify-selectors": "^*", + "postcss-normalize-charset": "^*", + "postcss-normalize-display-values": "^*", + "postcss-normalize-positions": "^*", + "postcss-normalize-repeat-style": "^*", + "postcss-normalize-string": "^*", + "postcss-normalize-timing-functions": "^*", + "postcss-normalize-unicode": "^*", + "postcss-normalize-url": "^*", + "postcss-normalize-whitespace": "^*", + "postcss-ordered-values": "^*", + "postcss-reduce-initial": "^*", + "postcss-reduce-transforms": "^*", + "postcss-svgo": "^*", + "postcss-unique-selectors": "^*" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -6379,9 +6389,9 @@ } }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -6718,9 +6728,9 @@ } }, "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dependencies": { "domelementtype": "^2.2.0" }, @@ -6809,9 +6819,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.80", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.80.tgz", - "integrity": "sha512-COsbJCGVYCc/aAY4cd94x1Js3q0r406YKGbdL8LXHg0O9dEjuFEFU/vZneRxBxKo/f1lLHi0YyAR7sbFM+i8Bg==" + "version": "1.4.88", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.88.tgz", + "integrity": "sha512-oA7mzccefkvTNi9u7DXmT0LqvhnOiN2BhSrKerta7HeUC1cLoIwtbf2wL+Ah2ozh5KQd3/1njrGrwDBXx6d14Q==" }, "node_modules/emittery": { "version": "0.8.1", @@ -7055,11 +7065,11 @@ } }, "node_modules/eslint": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", - "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", + "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", "dependencies": { - "@eslint/eslintrc": "^1.2.0", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -7346,9 +7356,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz", - "integrity": "sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", + "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", "dependencies": { "array-includes": "^3.1.4", "array.prototype.flatmap": "^1.2.5", @@ -7407,9 +7417,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.6.tgz", - "integrity": "sha512-mMU4+slZsWKHNxtxc5TE2+bs9S//e2uFPlcpTapPhVdnctgn0+G/DaUu6VbT0JLiVMcbBjy3IcfddK+abZawbw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.1.0.tgz", + "integrity": "sha512-YSNzasJUbyhOTe14ZPygeOBvcPvcaNkwHwrj4vdf+uirr2D32JTDaKi6CP5Os2aWtOcvt4uBSPXp9h5xGoqvWQ==", "dependencies": { "@typescript-eslint/utils": "^5.13.0" }, @@ -7564,9 +7574,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dependencies": { "type-fest": "^0.20.2" }, @@ -9592,12 +9602,12 @@ } }, "node_modules/jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz", + "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==", "dependencies": { "async": "0.9.x", - "chalk": "^2.4.2", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, @@ -9605,7 +9615,21 @@ "jake": "bin/cli.js" }, "engines": { - "node": "*" + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jake/node_modules/async": { @@ -9613,6 +9637,56 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", @@ -11808,19 +11882,19 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -12009,9 +12083,9 @@ } }, "node_modules/node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "engines": { "node": ">= 6.13.0" } @@ -12836,9 +12910,19 @@ } }, "node_modules/postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { "nanoid": "^3.3.1", "picocolors": "^1.0.0", @@ -12846,10 +12930,6 @@ }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-attribute-case-insensitive": { @@ -12887,6 +12967,20 @@ "postcss": "^8.2.2" } }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, "node_modules/postcss-color-functional-notation": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", @@ -12972,9 +13066,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.4.tgz", - "integrity": "sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==", + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz", + "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13036,9 +13130,9 @@ } }, "node_modules/postcss-discard-empty": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.0.tgz", - "integrity": "sha512-782T/buGgb3HOuHOJAHpdyKzAAKsv/BxWqsutnZ+QsiHEcDkY7v+6WWdturuBiSal6XMOO1p1aJvwXdqLD5vhA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -13073,9 +13167,9 @@ } }, "node_modules/postcss-env-function": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.5.tgz", - "integrity": "sha512-gPUJc71ji9XKyl0WSzAalBeEA/89kU+XpffpPxSaaaZ1c48OL36r1Ep5R6+9XAPkIiDlSvVAwP4io12q/vTcvA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13293,12 +13387,12 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.0.tgz", - "integrity": "sha512-Gr46srN2tsLD8fudKYoHO56RG0BLQ2nsBRnSZGY04eNBPwTeWa9KeHrbL3tOLAHyB2aliikycPH2TMJG1U+W6g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.2.tgz", + "integrity": "sha512-18/bp9DZnY1ai9RlahOfLBbmIUKfKFPASxRCiZ1vlpZqWPCn8qWPFlEozqmWL+kBtcEQmG8W9YqGCstDImvp/Q==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^*" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -13355,9 +13449,9 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.0.tgz", - "integrity": "sha512-q67dcts4Hct6x8+JmhBgctHkbvUsqGIg2IItenjE63iZXMbhjr7AlVZkNnKtIGt/1Wsv7p/7YzeSII6Q+KPXRg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.1.tgz", + "integrity": "sha512-WCpr+J9Uz8XzMpAfg3UL8z5rde6MifBbh5L8bn8S2F5hq/YDJJzASYCnCHvAB4Fqb94ys8v95ULQkW2EhCFvNg==", "dependencies": { "browserslist": "^4.16.6", "cssnano-utils": "^3.1.0", @@ -13600,9 +13694,9 @@ } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.0.tgz", - "integrity": "sha512-7O1FanKaJkpWFyCghFzIkLhehujV/frGkdofGLwhg5upbLyGsSfiTcZAdSzoPsSUgyPCkBkNMeWR8yVgPdQybg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13680,44 +13774,45 @@ } }, "node_modules/postcss-preset-env": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.2.tgz", - "integrity": "sha512-AmOkb8AeNNQwE/z2fHl1iwOIt8J50V8WR0rmLagcgIDoqlJZWjV3NdtOPnLGco1oN8DZe+Ss5B9ULbBeS6HfeA==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", + "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", "dependencies": { - "@csstools/postcss-color-function": "^1.0.2", + "@csstools/postcss-color-function": "^1.0.3", "@csstools/postcss-font-format-keywords": "^1.0.0", "@csstools/postcss-hwb-function": "^1.0.0", "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.1", "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.1", - "@csstools/postcss-progressive-custom-properties": "^1.2.0", - "autoprefixer": "^10.4.2", - "browserslist": "^4.19.3", + "@csstools/postcss-oklab-function": "^1.0.2", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "autoprefixer": "^10.4.4", + "browserslist": "^4.20.2", "css-blank-pseudo": "^3.0.3", "css-has-pseudo": "^3.0.4", "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.4.0", + "cssdb": "^6.5.0", "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^4.2.2", "postcss-color-hex-alpha": "^8.0.3", "postcss-color-rebeccapurple": "^7.0.2", "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.4", + "postcss-custom-properties": "^12.1.5", "postcss-custom-selectors": "^6.0.0", "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.0", - "postcss-env-function": "^4.0.5", + "postcss-double-position-gradients": "^3.1.1", + "postcss-env-function": "^4.0.6", "postcss-focus-visible": "^6.0.4", "postcss-focus-within": "^5.0.4", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^3.0.3", "postcss-image-set-function": "^4.0.6", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.1", + "postcss-lab-function": "^4.1.2", "postcss-logical": "^5.0.4", "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.2", + "postcss-nesting": "^10.1.3", "postcss-opacity-percentage": "^1.1.2", "postcss-overflow-shorthand": "^3.0.3", "postcss-page-break": "^3.0.4", @@ -14963,9 +15058,9 @@ } }, "node_modules/rollup": { - "version": "2.70.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.0.tgz", - "integrity": "sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==", + "version": "2.70.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", + "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", "bin": { "rollup": "dist/bin/rollup" }, @@ -15604,17 +15699,17 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string.prototype.matchall": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", - "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" }, "funding": { @@ -16096,9 +16191,9 @@ } }, "node_modules/terser": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.0.tgz", - "integrity": "sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dependencies": { "acorn": "^8.5.0", "commander": "^2.20.0", @@ -16290,9 +16385,9 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, "node_modules/tsconfig-paths": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz", - "integrity": "sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz", + "integrity": "sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g==", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", @@ -17687,22 +17782,22 @@ } }, "@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==" + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" }, "@babel/core": { - "version": "7.17.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", - "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.2", - "@babel/parser": "^7.17.3", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", @@ -17745,9 +17840,9 @@ } }, "@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -17772,11 +17867,11 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "requires": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" @@ -17863,11 +17958,11 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-module-imports": { @@ -17879,13 +17974,13 @@ } }, "@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", @@ -17929,11 +18024,11 @@ } }, "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -17974,12 +18069,12 @@ } }, "@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", + "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" } }, @@ -17994,9 +18089,9 @@ } }, "@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==" + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -18046,11 +18141,11 @@ } }, "@babel/plugin-proposal-decorators": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz", - "integrity": "sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz", + "integrity": "sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.1", + "@babel/helper-create-class-features-plugin": "^7.17.6", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/plugin-syntax-decorators": "^7.17.0", @@ -18389,9 +18484,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz", - "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -18476,23 +18571,23 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", + "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", "requires": { - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -18807,17 +18902,17 @@ } }, "@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", + "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz", - "integrity": "sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", + "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", "requires": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -19044,15 +19139,15 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", - "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", @@ -19065,18 +19160,13 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "requires": { "type-fest": "^0.20.2" } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -19809,9 +19899,9 @@ } }, "@rushstack/eslint-patch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz", - "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz", + "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==" }, "@sindresorhus/is": { "version": "0.14.0", @@ -20003,9 +20093,9 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -20165,9 +20255,9 @@ } }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", + "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==" }, "@types/json5": { "version": "0.0.29", @@ -20326,9 +20416,9 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" }, "@types/ws": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.2.tgz", - "integrity": "sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "requires": { "@types/node": "*" } @@ -20347,13 +20437,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz", + "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==", "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/type-utils": "5.15.0", + "@typescript-eslint/utils": "5.15.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -20373,55 +20463,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.14.0.tgz", - "integrity": "sha512-ke48La1A/TWAn949cdgQiP3oK0NT7ArhDAOVOmNLVjT/uAXlFyrJY8dM4qqxHrATzIp8glg+G2OZjy2lRKBIUA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.15.0.tgz", + "integrity": "sha512-AJOOaBrVqKYWaYDBtgMi9XVDB3YHXlffto/3A4VQ39VVaNqosSOp/nW09G4N/ej8WlzHQB2jTnSfP5wWsXSQJA==", "requires": { - "@typescript-eslint/utils": "5.14.0" + "@typescript-eslint/utils": "5.15.0" } }, "@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz", + "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==", "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/typescript-estree": "5.15.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz", + "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==", "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/visitor-keys": "5.15.0" } }, "@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz", + "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==", "requires": { - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/utils": "5.15.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==" + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz", + "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==" }, "@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz", + "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==", "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/visitor-keys": "5.15.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -20440,14 +20530,14 @@ } }, "@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz", + "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.15.0", + "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/typescript-estree": "5.15.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -20469,11 +20559,11 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz", + "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==", "requires": { - "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/types": "5.15.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -20914,13 +21004,13 @@ "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" }, "autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", "requires": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -21394,12 +21484,12 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" @@ -21516,9 +21606,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001314", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", - "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==" + "version": "1.0.30001319", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", + "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -22030,9 +22120,9 @@ "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" }, "cssdb": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.4.1.tgz", - "integrity": "sha512-R70R/Q1fPlM1D6Y+Kpat0QjiY+aMsY2/8lekdVoYcJ7ZQs9kw71W78FdOMf8DFq975KHQf1089PNg1dLsbAhoA==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", + "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==" }, "cssesc": { "version": "3.0.0", @@ -22040,49 +22130,49 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.1.tgz", - "integrity": "sha512-WWfN7jBK/3Uk3oX/jsFbQApDf9DkXj6dOYull5ZaSGskcDggzg3RyDZI4GKKO+00LdfLMEZtY1cwTQUL+YMg2Q==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.4.tgz", + "integrity": "sha512-hbfhVZreEPyzl+NbvRsjNo54JOX80b+j6nqG2biLVLaZHJEiqGyMh4xDGHtwhUKd5p59mj2GlDqlUBwJUuIu5A==", "requires": { - "cssnano-preset-default": "^5.2.1", + "cssnano-preset-default": "^*", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.1.tgz", - "integrity": "sha512-Y+CUCS5iZ1uzHn5KtmKIlysQVXrTtLCnYsYTOJcbdd5rghOwtw1gobvEXefBncjGO4fWwGZr9/n9hwZfo6W1Fw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.4.tgz", + "integrity": "sha512-w1Gg8xsebln6/axZ6qDFQHuglrGfbIHOIx0g4y9+etRlRab8CGpSpe6UMsrgJe4zhCaJ0LwLmc+PhdLRTwnhIA==", "requires": { "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^*", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.0", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.0", - "postcss-merge-rules": "^5.1.0", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.0", - "postcss-minify-params": "^5.1.0", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.0", - "postcss-ordered-values": "^5.1.0", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" + "postcss-colormin": "^*", + "postcss-convert-values": "^*", + "postcss-discard-comments": "^*", + "postcss-discard-duplicates": "^*", + "postcss-discard-empty": "^*", + "postcss-discard-overridden": "^*", + "postcss-merge-longhand": "^*", + "postcss-merge-rules": "^*", + "postcss-minify-font-values": "^*", + "postcss-minify-gradients": "^*", + "postcss-minify-params": "^*", + "postcss-minify-selectors": "^*", + "postcss-normalize-charset": "^*", + "postcss-normalize-display-values": "^*", + "postcss-normalize-positions": "^*", + "postcss-normalize-repeat-style": "^*", + "postcss-normalize-string": "^*", + "postcss-normalize-timing-functions": "^*", + "postcss-normalize-unicode": "^*", + "postcss-normalize-url": "^*", + "postcss-normalize-whitespace": "^*", + "postcss-ordered-values": "^*", + "postcss-reduce-initial": "^*", + "postcss-reduce-transforms": "^*", + "postcss-svgo": "^*", + "postcss-unique-selectors": "^*" } }, "cssnano-utils": { @@ -22161,9 +22251,9 @@ } }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -22423,9 +22513,9 @@ } }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { "domelementtype": "^2.2.0" } @@ -22493,9 +22583,9 @@ } }, "electron-to-chromium": { - "version": "1.4.80", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.80.tgz", - "integrity": "sha512-COsbJCGVYCc/aAY4cd94x1Js3q0r406YKGbdL8LXHg0O9dEjuFEFU/vZneRxBxKo/f1lLHi0YyAR7sbFM+i8Bg==" + "version": "1.4.88", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.88.tgz", + "integrity": "sha512-oA7mzccefkvTNi9u7DXmT0LqvhnOiN2BhSrKerta7HeUC1cLoIwtbf2wL+Ah2ozh5KQd3/1njrGrwDBXx6d14Q==" }, "emittery": { "version": "0.8.1", @@ -22675,11 +22765,11 @@ } }, "eslint": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", - "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", + "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", "requires": { - "@eslint/eslintrc": "^1.2.0", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -22770,9 +22860,9 @@ } }, "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "requires": { "type-fest": "^0.20.2" } @@ -23013,9 +23103,9 @@ } }, "eslint-plugin-react": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz", - "integrity": "sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", + "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", "requires": { "array-includes": "^3.1.4", "array.prototype.flatmap": "^1.2.5", @@ -23059,9 +23149,9 @@ "requires": {} }, "eslint-plugin-testing-library": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.6.tgz", - "integrity": "sha512-mMU4+slZsWKHNxtxc5TE2+bs9S//e2uFPlcpTapPhVdnctgn0+G/DaUu6VbT0JLiVMcbBjy3IcfddK+abZawbw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.1.0.tgz", + "integrity": "sha512-YSNzasJUbyhOTe14ZPygeOBvcPvcaNkwHwrj4vdf+uirr2D32JTDaKi6CP5Os2aWtOcvt4uBSPXp9h5xGoqvWQ==", "requires": { "@typescript-eslint/utils": "^5.13.0" } @@ -24482,20 +24572,63 @@ } }, "jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz", + "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==", "requires": { "async": "0.9.x", - "chalk": "^2.4.2", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -26105,16 +26238,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -26254,9 +26387,9 @@ } }, "node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==" }, "node-int64": { "version": "0.4.0", @@ -26830,9 +26963,9 @@ } }, "postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "requires": { "nanoid": "^3.3.1", "picocolors": "^1.0.0", @@ -26862,6 +26995,14 @@ "postcss-value-parser": "^4.2.0" } }, + "postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, "postcss-color-functional-notation": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", @@ -26912,9 +27053,9 @@ "requires": {} }, "postcss-custom-properties": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.4.tgz", - "integrity": "sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==", + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz", + "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -26948,9 +27089,9 @@ "requires": {} }, "postcss-discard-empty": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.0.tgz", - "integrity": "sha512-782T/buGgb3HOuHOJAHpdyKzAAKsv/BxWqsutnZ+QsiHEcDkY7v+6WWdturuBiSal6XMOO1p1aJvwXdqLD5vhA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "requires": {} }, "postcss-discard-overridden": { @@ -26969,9 +27110,9 @@ } }, "postcss-env-function": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.5.tgz", - "integrity": "sha512-gPUJc71ji9XKyl0WSzAalBeEA/89kU+XpffpPxSaaaZ1c48OL36r1Ep5R6+9XAPkIiDlSvVAwP4io12q/vTcvA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -27095,12 +27236,12 @@ "requires": {} }, "postcss-merge-longhand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.0.tgz", - "integrity": "sha512-Gr46srN2tsLD8fudKYoHO56RG0BLQ2nsBRnSZGY04eNBPwTeWa9KeHrbL3tOLAHyB2aliikycPH2TMJG1U+W6g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.2.tgz", + "integrity": "sha512-18/bp9DZnY1ai9RlahOfLBbmIUKfKFPASxRCiZ1vlpZqWPCn8qWPFlEozqmWL+kBtcEQmG8W9YqGCstDImvp/Q==", "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^*" } }, "postcss-merge-rules": { @@ -27133,9 +27274,9 @@ } }, "postcss-minify-params": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.0.tgz", - "integrity": "sha512-q67dcts4Hct6x8+JmhBgctHkbvUsqGIg2IItenjE63iZXMbhjr7AlVZkNnKtIGt/1Wsv7p/7YzeSII6Q+KPXRg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.1.tgz", + "integrity": "sha512-WCpr+J9Uz8XzMpAfg3UL8z5rde6MifBbh5L8bn8S2F5hq/YDJJzASYCnCHvAB4Fqb94ys8v95ULQkW2EhCFvNg==", "requires": { "browserslist": "^4.16.6", "cssnano-utils": "^3.1.0", @@ -27273,9 +27414,9 @@ } }, "postcss-normalize-whitespace": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.0.tgz", - "integrity": "sha512-7O1FanKaJkpWFyCghFzIkLhehujV/frGkdofGLwhg5upbLyGsSfiTcZAdSzoPsSUgyPCkBkNMeWR8yVgPdQybg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -27315,44 +27456,45 @@ } }, "postcss-preset-env": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.2.tgz", - "integrity": "sha512-AmOkb8AeNNQwE/z2fHl1iwOIt8J50V8WR0rmLagcgIDoqlJZWjV3NdtOPnLGco1oN8DZe+Ss5B9ULbBeS6HfeA==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", + "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", "requires": { - "@csstools/postcss-color-function": "^1.0.2", + "@csstools/postcss-color-function": "^1.0.3", "@csstools/postcss-font-format-keywords": "^1.0.0", "@csstools/postcss-hwb-function": "^1.0.0", "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.1", "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.1", - "@csstools/postcss-progressive-custom-properties": "^1.2.0", - "autoprefixer": "^10.4.2", - "browserslist": "^4.19.3", + "@csstools/postcss-oklab-function": "^1.0.2", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "autoprefixer": "^10.4.4", + "browserslist": "^4.20.2", "css-blank-pseudo": "^3.0.3", "css-has-pseudo": "^3.0.4", "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.4.0", + "cssdb": "^6.5.0", "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^4.2.2", "postcss-color-hex-alpha": "^8.0.3", "postcss-color-rebeccapurple": "^7.0.2", "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.4", + "postcss-custom-properties": "^12.1.5", "postcss-custom-selectors": "^6.0.0", "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.0", - "postcss-env-function": "^4.0.5", + "postcss-double-position-gradients": "^3.1.1", + "postcss-env-function": "^4.0.6", "postcss-focus-visible": "^6.0.4", "postcss-focus-within": "^5.0.4", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^3.0.3", "postcss-image-set-function": "^4.0.6", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.1", + "postcss-lab-function": "^4.1.2", "postcss-logical": "^5.0.4", "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.2", + "postcss-nesting": "^10.1.3", "postcss-opacity-percentage": "^1.1.2", "postcss-overflow-shorthand": "^3.0.3", "postcss-page-break": "^3.0.4", @@ -28262,9 +28404,9 @@ } }, "rollup": { - "version": "2.70.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.0.tgz", - "integrity": "sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==", + "version": "2.70.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", + "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", "requires": { "fsevents": "~2.3.2" } @@ -28765,17 +28907,17 @@ } }, "string.prototype.matchall": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", - "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" } }, @@ -29122,9 +29264,9 @@ } }, "terser": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.0.tgz", - "integrity": "sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "requires": { "acorn": "^8.5.0", "commander": "^2.20.0", @@ -29262,9 +29404,9 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, "tsconfig-paths": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz", - "integrity": "sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz", + "integrity": "sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g==", "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", From 4ae406b3e18e2f753c7e45c3c9232ed54f807dd1 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 21 Mar 2022 19:24:11 +0100 Subject: [PATCH 113/319] Customizations to names with more options --- .../src/project/SettingsCustomization.tsx | 2 +- interface/src/project/types.ts | 2 +- src/command.cpp | 2 +- src/devices/thermostat.cpp | 4 +- src/emsdevice.cpp | 90 ++++++++++++------- src/emsdevice.h | 10 ++- src/emsdevicevalue.h | 10 ++- src/emsesp.cpp | 11 ++- src/emsesp.h | 1 + src/system.cpp | 10 +-- src/web/WebCustomizationService.cpp | 14 +-- src/web/WebCustomizationService.h | 6 +- 12 files changed, 103 insertions(+), 59 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index e503a8362..7e4daf26d 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -138,7 +138,7 @@ const SettingsCustomization: FC = () => { const saveCustomization = async () => { if (deviceEntities && selectedDevice) { - const exclude_entities = deviceEntities.filter((de) => de.x).map((new_de) => new_de.i); + const exclude_entities = deviceEntities.filter((de) => de.x).map((new_de) => "07" + new_de.s); try { const response = await EMSESP.writeExcludeEntities({ id: selectedDevice, diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 2da66b4a3..f1c32c030 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -150,7 +150,7 @@ export interface DeviceEntity { export interface ExcludeEntities { id: number; - entity_ids: number[]; + entity_ids: string[]; } export interface UniqueID { diff --git a/src/command.cpp b/src/command.cpp index 75ee3ccc1..43d3d24b6 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -281,7 +281,7 @@ uint8_t Command::call(const uint8_t device_type, const char * cmd, const char * return_code = ((cf->cmdfunction_json_)(value, id, output)) ? CommandRet::OK : CommandRet::ERROR; } - if (cf->cmdfunction_) { + if (cf->cmdfunction_ && !EMSESP::cmd_is_readonly(device_type, cmd, id)) { return_code = ((cf->cmdfunction_)(value, id)) ? CommandRet::OK : CommandRet::ERROR; } diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 6e3f10e0b..dcd3b633f 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -379,8 +379,8 @@ void Thermostat::add_ha_climate(std::shared_ptr hc) const { return; } - if (Helpers::hasValue(hc->selTemp) && is_visible(&hc->selTemp)) { - if (Helpers::hasValue(hc->roomTemp) && is_visible(&hc->roomTemp)) { + if (Helpers::hasValue(hc->selTemp) && is_readable(&hc->selTemp)) { + if (Helpers::hasValue(hc->roomTemp) && is_readable(&hc->roomTemp)) { hc->climate = 1; } else { hc->climate = 0; diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index c2ea986f0..d7a4a84b3 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -26,7 +26,7 @@ namespace emsesp { uint8_t EMSdevice::count_entities() { uint8_t count = 0; for (auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.hasValue()) { + if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.hasValue()) { count++; } } @@ -248,7 +248,7 @@ bool EMSdevice::is_fetch(uint16_t telegram_id) const { // called from the command 'entities' void EMSdevice::list_device_entries(JsonObject & output) const { for (const auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.type != DeviceValueType::CMD && dv.full_name) { + if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.type != DeviceValueType::CMD && dv.full_name) { // if we have a tag prefix it char key[50]; if (!EMSdevice::tag_to_mqtt(dv.tag).empty()) { @@ -399,15 +399,17 @@ void EMSdevice::register_device_value(uint8_t tag, uint8_t dv_id = get_next_dv_id(); // determine state - uint8_t state = DeviceValueState::DV_VISIBLE; // default to visible + uint8_t state = DeviceValueState::DV_DEFAULT; // scan through customizations to see if it's on the exclusion list by matching the productID and deviceID EMSESP::webCustomizationService.read([&](WebCustomization & settings) { for (EntityCustomization entityCustomization : settings.entityCustomizations) { if ((entityCustomization.product_id == product_id()) && (entityCustomization.device_id == device_id())) { - for (uint8_t entity_id : entityCustomization.entity_ids) { - if (entity_id == dv_id) { - state = DeviceValueState::DV_DEFAULT; // it's on the exclude list, turn off active and visible flags + std::string entity = tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(short_name) : tag_to_string(tag) + "/" + read_flash_string(short_name); + for (std::string entity_id : entityCustomization.entity_ids) { + uint8_t flag = Helpers::hextoint(entity_id.substr(0, 2).c_str()); + if (entity_id.substr(2) == entity) { + state = flag << 4; // set state high bits to flag, turn off active and ha flags break; } } @@ -476,11 +478,33 @@ void EMSdevice::register_device_value(uint8_t tag, register_device_value(tag, value_p, type, options, name, uom, nullptr, 0, 0); } -// check if value is visible -bool EMSdevice::is_visible(const void * value_p) const { +// check if value is readable via mqtt/api +bool EMSdevice::is_readable(const void * value_p) const { for (const auto & dv : devicevalues_) { if (dv.value_p == value_p) { - return dv.has_state(DeviceValueState::DV_VISIBLE); + return !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE); + } + } + return false; +} + +// check if value/command is readonly +bool EMSdevice::is_readonly(const std::string cmd, const int8_t id) const { + uint8_t tag = id > 0 ? DeviceValueTAG::TAG_HC1 + id - 1 : DeviceValueTAG::TAG_NONE; + for (const auto & dv : devicevalues_) { + // check command name and tag, id -1 is default hc and only checks name + if (dv.has_cmd && read_flash_string(dv.short_name) == cmd && (dv.tag < DeviceValueTAG::TAG_HC1 || dv.tag == tag || id == -1)) { + return dv.has_state(DeviceValueState::DV_READONLY); + } + } + return true; // not found, no write +} + +// check if value has a registered command +bool EMSdevice::has_command(const void * value_p) const { + for (const auto & dv : devicevalues_) { + if (dv.value_p == value_p) { + return dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY); } } return false; @@ -493,7 +517,7 @@ void EMSdevice::publish_value(void * value_p) const { } for (const auto & dv : devicevalues_) { - if (dv.value_p == value_p && dv.has_state(DeviceValueState::DV_VISIBLE)) { + if (dv.value_p == value_p && !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE)) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; if (Mqtt::publish_single2cmd()) { if (dv.tag >= DeviceValueTAG::TAG_HC1 && dv.tag <= DeviceValueTAG::TAG_WWC4) { @@ -593,7 +617,7 @@ std::string EMSdevice::get_value_uom(const char * key) const { // look up key in our device value list for (const auto & dv : devicevalues_) { - if ((dv.has_state(DeviceValueState::DV_VISIBLE) && dv.full_name) && (read_flash_string(dv.full_name) == key_p)) { + if ((!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name) && (read_flash_string(dv.full_name) == key_p)) { // ignore TIME since "minutes" is already added to the string value if ((dv.uom == DeviceValueUOM::NONE) || (dv.uom == DeviceValueUOM::MINUTES)) { break; @@ -618,7 +642,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { // 1. full_name cannot be empty // 2. it must have a valid value, if it is not a command like 'reset' - if (dv.has_state(DeviceValueState::DV_VISIBLE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { + if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { JsonObject obj = data.createNestedObject(); // create the object, we know there is a value uint8_t fahrenheit = 0; @@ -682,7 +706,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { } // add commands and options - if (dv.has_cmd) { + if (dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY)) { // add the name of the Command function if (dv.tag >= DeviceValueTAG::TAG_HC1) { obj["c"] = tag_to_mqtt(dv.tag) + "/" + read_flash_string(dv.short_name); @@ -725,21 +749,24 @@ void EMSdevice::generate_values_web(JsonObject & output) { // reset all entities to being visible // this is called before loading in the exclude entities list from the customization service -void EMSdevice::reset_exclude_entities() { +void EMSdevice::reset_entity_masks() { for (auto & dv : devicevalues_) { - dv.add_state(DeviceValueState::DV_VISIBLE); + dv.state &= 0x0F; } } -// disable/exclude a device entity based on its unique id -void EMSdevice::exclude_entity(uint8_t id) { +// disable/exclude/mask_out a device entity based on the id +void EMSdevice::mask_entity(std::string entity_id) { + // first character contains mask flags + uint8_t flag = Helpers::hextoint(entity_id.substr(0, 2).c_str()); for (auto & dv : devicevalues_) { - if (dv.id == id) { + std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); + if (entity == entity_id.substr(2)) { #if defined(EMSESP_USE_SERIAL) Serial.print("exclude_entity() Removing Visible for device value: "); Serial.println(read_flash_string(dv.full_name).c_str()); #endif - dv.remove_state(DeviceValueState::DV_VISIBLE); // this will remove from MQTT payloads and showing in web & console + dv.state = (dv.state & 0x0F) | (flag << 4); // set state high bits to flag, turn off active and ha flags return; } } @@ -830,7 +857,7 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { } // is it marked as excluded? - obj["x"] = !dv.has_state(DeviceValueState::DV_VISIBLE); + obj["x"] = dv.has_state(DeviceValueState::DV_WEB_EXCLUDE); // add the unique ID obj["i"] = dv.id; @@ -985,8 +1012,9 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 json["uom"] = uom_to_string(dv.uom); } - json["writeable"] = dv.has_cmd; - json["visible"] = dv.has_state(DeviceValueState::DV_VISIBLE); + json["readable"] = !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE); + json["writeable"] = dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY); + json["visible"] = !dv.has_state(DeviceValueState::DV_WEB_EXCLUDE); // if there is no value, mention it if (!json.containsKey(value)) { @@ -1030,11 +1058,11 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // check conditions: // 1. it must have a valid value (state is active) - // 2. it must have be visible and have a full name + // 2. it must have a visible flag // 3. it must match the given tag filter or have an empty tag - bool conditions = ((tag_filter == DeviceValueTAG::TAG_NONE) || (tag_filter == dv.tag)) && dv.has_state(DeviceValueState::DV_ACTIVE); - bool visible = dv.has_state(DeviceValueState::DV_VISIBLE) && dv.full_name; - if (conditions && visible) { + // 4. it must not have the exclude flag set or outputs to console + if (dv.has_state(DeviceValueState::DV_ACTIVE) && dv.full_name && (tag_filter == DeviceValueTAG::TAG_NONE || tag_filter == dv.tag) + && (output_target == OUTPUT_TARGET::CONSOLE || !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE))) { has_values = true; // flagged if we actually have data // we have a tag if it matches the filter given, and that the tag name is not empty/"" @@ -1042,7 +1070,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // create the name for the JSON key char name[80]; - if (output_target == OUTPUT_TARGET::API_VERBOSE) { + if (output_target == OUTPUT_TARGET::API_VERBOSE || output_target == OUTPUT_TARGET::CONSOLE) { if (have_tag) { snprintf(name, 80, "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); // prefix the tag } else { @@ -1155,7 +1183,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { uint32_t time_value = *(uint32_t *)(dv.value_p); time_value = Helpers::round2(time_value, divider); // sometimes we need to divide by 60 - if (output_target == EMSdevice::OUTPUT_TARGET::API_VERBOSE) { + if (output_target == OUTPUT_TARGET::API_VERBOSE || output_target == OUTPUT_TARGET::CONSOLE) { char time_s[40]; snprintf(time_s, sizeof(time_s), @@ -1187,7 +1215,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c void EMSdevice::mqtt_ha_entity_config_remove() { for (auto & dv : devicevalues_) { if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) - && ((!dv.has_state(DeviceValueState::DV_VISIBLE)) || (!dv.has_state(DeviceValueState::DV_ACTIVE)))) { + && ((dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE)) || (!dv.has_state(DeviceValueState::DV_ACTIVE)))) { dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); if (dv.short_name == FL_(climate)[0]) { Mqtt::publish_ha_climate_config(dv.tag, false, true); // delete topic (remove = true) @@ -1207,7 +1235,7 @@ void EMSdevice::mqtt_ha_entity_config_create() { // create climate if roomtemp is visible // create the discovery topic if if hasn't already been created, not a command (like reset) and is active and visible for (auto & dv : devicevalues_) { - if ((dv.short_name == FL_(climate)[0]) && dv.has_state(DeviceValueState::DV_VISIBLE) && dv.has_state(DeviceValueState::DV_ACTIVE)) { + if ((dv.short_name == FL_(climate)[0]) && !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE) && dv.has_state(DeviceValueState::DV_ACTIVE)) { if (*(int8_t *)(dv.value_p) == 1 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); @@ -1220,7 +1248,7 @@ void EMSdevice::mqtt_ha_entity_config_create() { } } if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && (dv.type != DeviceValueType::CMD) && dv.has_state(DeviceValueState::DV_ACTIVE) - && dv.has_state(DeviceValueState::DV_VISIBLE)) { + && !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE)) { // create_device_config is only done once for the EMS device. It can added to any entity, so we take the first Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); diff --git a/src/emsdevice.h b/src/emsdevice.h index f538a7d28..d95f92862 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -183,8 +183,8 @@ class EMSdevice { char * show_telegram_handlers(char * result, const size_t len, const uint8_t handlers); void show_mqtt_handlers(uuid::console::Shell & shell) const; void list_device_entries(JsonObject & output) const; - void exclude_entity(uint8_t entity_id); - void reset_exclude_entities(); + void mask_entity(std::string entity_id); + void reset_entity_masks(); using process_function_p = std::function)>; @@ -195,7 +195,7 @@ class EMSdevice { bool get_value_info(JsonObject & root, const char * cmd, const int8_t id); void get_dv_info(JsonObject & json); - enum OUTPUT_TARGET : uint8_t { API_VERBOSE, API_SHORTNAMES, MQTT }; + enum OUTPUT_TARGET : uint8_t { API_VERBOSE, API_SHORTNAMES, MQTT, CONSOLE }; bool generate_values(JsonObject & output, const uint8_t tag_filter, const bool nested, const uint8_t output_target); void generate_values_web(JsonObject & output); void generate_values_web_all(JsonArray & output); @@ -242,7 +242,9 @@ class EMSdevice { void read_command(const uint16_t type_id, uint8_t offset = 0, uint8_t length = 0) const; - bool is_visible(const void * value_p) const; + bool is_readable(const void * value_p) const; + bool is_readonly(const std::string cmd, const int8_t id) const; + bool has_command(const void * value_p) const; void publish_value(void * value_p) const; void publish_all_values(); diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index e41533fd4..526490789 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -112,9 +112,13 @@ class DeviceValue { enum DeviceValueState : uint8_t { DV_DEFAULT = 0, // 0 - does not yet have a value DV_ACTIVE = (1 << 0), // 1 - has a validated real value - DV_VISIBLE = (1 << 1), // 2 - shown on web, console and on MQTT payload. Otherwise hidden - DV_HA_CONFIG_CREATED = (1 << 2), // 4 - set if the HA config topic has been created - DV_HA_CLIMATE_NO_RT = (1 << 3) // 8 - climate created without roomTemp + DV_HA_CONFIG_CREATED = (1 << 1), // 2 - set if the HA config topic has been created + DV_HA_CLIMATE_NO_RT = (1 << 2), // 3 - climate created without roomTemp + // high nibble as mask for exclusions + DV_WEB_EXCLUDE = (1 << 4), // 16 - not shown on web + DV_API_MQTT_EXCLUDE = (1 << 5), // 32 - not shown on mqtt, API + DV_READONLY = (1 << 6), // 64 - read only + DV_FAVORITE = (1 << 7) // 128 - sort to front }; uint8_t device_type; // EMSdevice::DeviceType diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 54ddc1991..d367b677a 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -106,6 +106,15 @@ void EMSESP::fetch_device_values_type(const uint8_t device_type) { } } +bool EMSESP::cmd_is_readonly(const uint8_t device_type, const char * cmd, const int8_t id) { + for (const auto & emsdevice : emsdevices) { + if (emsdevice && (emsdevice->device_type() == device_type)) { + return emsdevice->is_readonly(cmd, id); + } + } + return false; +} + // clears list of recognized devices void EMSESP::clear_all_devices() { // temporarily removed: clearing the list causes a crash, the associated commands and mqtt should also be removed. @@ -366,7 +375,7 @@ void EMSESP::show_device_values(uuid::console::Shell & shell) { DynamicJsonDocument doc(EMSESP_JSON_SIZE_XXLARGE_DYN); // use max size JsonObject json = doc.to(); - emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::API_VERBOSE); // verbose mode and nested + emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::CONSOLE); // verbose mode and nested // print line uint8_t id = 0; diff --git a/src/emsesp.h b/src/emsesp.h index 3395824d5..37d6053d8 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -128,6 +128,7 @@ class EMSESP { static void send_raw_telegram(const char * data); static bool device_exists(const uint8_t device_id); + static bool cmd_is_readonly(const uint8_t device_type, const char * cmd, const int8_t id); static uint8_t count_devices(const uint8_t device_type); static uint8_t count_devices(); diff --git a/src/system.cpp b/src/system.cpp index d6e62c559..ab29b4a68 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1054,15 +1054,15 @@ bool System::command_customizations(const char * value, const int8_t id, JsonObj } // exclude entities - JsonArray exclude_entitiesJson = node.createNestedArray("exclude_entities"); + JsonArray mask_entitiesJson = node.createNestedArray("masked_entities"); for (const auto & entityCustomization : settings.entityCustomizations) { - JsonObject entityJson = exclude_entitiesJson.createNestedObject(); + JsonObject entityJson = mask_entitiesJson.createNestedObject(); entityJson["product_id"] = entityCustomization.product_id; entityJson["device_id"] = entityCustomization.device_id; - JsonArray exclude_entityJson = entityJson.createNestedArray("entity_ids"); - for (uint8_t entity_id : entityCustomization.entity_ids) { - exclude_entityJson.add(entity_id); + JsonArray mask_entityJson = entityJson.createNestedArray("entities"); + for (std::string entity_id : entityCustomization.entity_ids) { + mask_entityJson.add(entity_id); } } }); diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 98e060ed3..44301e2a6 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -86,7 +86,7 @@ void WebCustomization::read(WebCustomization & settings, JsonObject & root) { entityJson["device_id"] = entityCustomization.device_id; JsonArray exclude_entityJson = entityJson.createNestedArray("entity_ids"); - for (uint8_t entity_id : entityCustomization.entity_ids) { + for (std::string entity_id : entityCustomization.entity_ids) { exclude_entityJson.add(entity_id); } } @@ -133,7 +133,7 @@ StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & new_entry.device_id = exclude_entities["device_id"]; for (const JsonVariant exclude_entity_id : exclude_entities["entity_ids"].as()) { - new_entry.entity_ids.push_back(exclude_entity_id.as()); // add entity list + new_entry.entity_ids.push_back(exclude_entity_id.as()); // add entity list } settings.entityCustomizations.push_back(new_entry); // save the new object } @@ -216,14 +216,14 @@ void WebCustomizationService::exclude_entities(AsyncWebServerRequest * request, uint8_t unique_device_id = json["id"]; if (emsdevice->unique_id() == unique_device_id) { // first reset all the entity ids - emsdevice->reset_exclude_entities(); + emsdevice->reset_entity_masks(); // build a list of entities to exclude and then set the flag to non-visible - JsonArray entity_ids_json = json["entity_ids"]; - std::vector entity_ids; + JsonArray entity_ids_json = json["entity_ids"]; + std::vector entity_ids; for (JsonVariant id : entity_ids_json) { - uint8_t entity_id = id.as(); - emsdevice->exclude_entity(entity_id); // this will have immediate affect + std::string entity_id = id.as(); + emsdevice->mask_entity(entity_id); // this will have immediate affect entity_ids.push_back(entity_id); } diff --git a/src/web/WebCustomizationService.h b/src/web/WebCustomizationService.h index b2bd869da..1c34ac80d 100644 --- a/src/web/WebCustomizationService.h +++ b/src/web/WebCustomizationService.h @@ -61,9 +61,9 @@ class AnalogCustomization { // we use product_id and device_id to make the device unique class EntityCustomization { public: - uint8_t product_id; // device's product id - uint8_t device_id; // device's device id - std::vector entity_ids; // array of entity ids to exclude + uint8_t product_id; // device's product id + uint8_t device_id; // device's device id + std::vector entity_ids; // array of entity ids to exclude }; class WebCustomization { From a0a3d8ef3af0cc5b60876c202be7be9f8da6d550 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 21 Mar 2022 20:21:55 +0100 Subject: [PATCH 114/319] min/max to web value edit --- interface/src/project/DashboardData.tsx | 2 +- interface/src/project/types.ts | 2 ++ src/emsdevice.cpp | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index ea56a2668..d53ebe68e 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -239,7 +239,7 @@ const DashboardData: FC = () => { sx={{ width: '30ch' }} type={deviceValue.u ? 'number' : 'text'} onChange={updateValue(setDeviceValue)} - inputProps={{ step: deviceValue.s }} + inputProps={deviceValue.u ? { min: deviceValue.m, max: deviceValue.x, step: deviceValue.s } : {}} InputProps={{ startAdornment: {DeviceValueUOM_s[deviceValue.u]} }} diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index f1c32c030..226873bdd 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -133,6 +133,8 @@ export interface DeviceValue { l: string[]; // list h?: string; // help text s?: string; // steps for up/down + m?: string; // min + x?: string; // max } export interface DeviceData { diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index d7a4a84b3..47fc3f442 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -741,6 +741,11 @@ void EMSdevice::generate_values_web(JsonObject & output) { } else if (divider < 0) { obj["s"] = Helpers::render_value(s, (-1) * divider, 0); } + int16_t dv_set_min, dv_set_max; + if (dv.get_min_max(dv_set_min, dv_set_max)) { + obj["m"] = Helpers::render_value(s, dv_set_min, 0); + obj["x"] = Helpers::render_value(s, dv_set_max, 0); + } } } } From 9b70985d324183a29c241b4c7e7b39324c3bb07d Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 23 Mar 2022 12:22:49 +0100 Subject: [PATCH 115/319] readonly to HA config --- src/mqtt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index c58f41540..284cf9748 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -925,7 +925,7 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, dv.short_name, dv.uom, remove, - dv.has_cmd, + dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY), dv.options, dv.options_size, dv_set_min, From 9bef53c16cda800e40b5f38ee4915b0afe0f6f6c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 23 Mar 2022 12:36:54 +0100 Subject: [PATCH 116/319] add #386 and #408, sync time with thermostat --- src/devices/thermostat.cpp | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index dcd3b633f..e4452581f 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1205,14 +1205,14 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { return; } - if (telegram->message_data[7] & 0x0C) { // date and time not valid - set_datetime("ntp", -1); // set from NTP + if ((telegram->message_data[7] & 0x0C) && has_command(&dateTime_)) { // date and time not valid + set_datetime("ntp", -1); // set from NTP return; } // render date to HH:MM:SS DD/MM/YYYY // had to create separate buffers because of how printf works - char date[25]; + char date[sizeof(dateTime_)]; char buf1[6]; char buf2[6]; char buf3[6]; @@ -1231,6 +1231,31 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { Helpers::itoa((telegram->message_data[0] & 0x7F) + 2000, buf6) // year ); has_update(dateTime_, date, sizeof(dateTime_)); + + // check clock + time_t now = time(nullptr); + tm * tm_ = localtime(&now); + bool ntp_ = tm_->tm_year > 110; // year 2010 and up, time is valid + tm_->tm_year = telegram->message_data[0] + 100; + tm_->tm_mon = telegram->message_data[1] - 1; + tm_->tm_mday = telegram->message_data[3]; + tm_->tm_hour = telegram->message_data[2]; + tm_->tm_min = telegram->message_data[4]; + tm_->tm_sec = telegram->message_data[5]; + tm_->tm_isdst = telegram->message_data[7] & 0x01; + time_t ttime = mktime(tm_); // thermostat time + if (ntp_ && has_command(&dateTime_)) { // have NTP time and command + double difference = difftime(now, ttime); + if (difference > 15 || difference < -15) { + set_datetime("ntp", -1); // set from NTP + LOG_INFO(F("thermostat time correction from ntp")); + } + } + if (!ntp_ && tm_->tm_year > 110) { // emsesp clock not set, but thermostat clock + struct timeval newnow = {.tv_sec = ttime}; + settimeofday(&newnow, nullptr); + LOG_INFO(F("ems-esp time set from thermostat")); + } } // process_RCError - type 0xA2 - error message - 14 bytes long From 24f6fcd2d4edaab1c5ca8f366d4dbc76af6de4c8 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 23 Mar 2022 12:56:47 +0100 Subject: [PATCH 117/319] version b9, update changelog --- CHANGELOG_LATEST.md | 8 +++++++- src/version.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index c449bc8ce..a9088aebd 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -26,7 +26,10 @@ - remove MQTT retained configs if discovery is disabled - timeout 10 min for MQTT-QoS wait - Moduline 300 auto-temperatures T1-T4, RC300 romminfluencefactor -- RC35 parameters [#392](https://github.com/emsesp/EMS-ESP32/issues/392)[#398](https://github.com/emsesp/EMS-ESP32/issues/398) +- RC35 parameters [#392](https://github.com/emsesp/EMS-ESP32/issues/392), [#398](https://github.com/emsesp/EMS-ESP32/issues/398) +- sync time with thermostat [#386](https://github.com/emsesp/EMS-ESP32/issues/386), [#408](https://github.com/emsesp/EMS-ESP32/issues/408) +- set mode has immediate effect [#395](https://github.com/emsesp/EMS-ESP32/issues/395) +- min/max in web value setting ### Fixed @@ -44,6 +47,7 @@ - Non-nested MQTT would corrupt the json [#354](https://github.com/emsesp/EMS-ESP32/issues/354) - Burner selected max power can have a value higher than 100% [#314](https://github.com/emsesp/EMS-ESP32/issues/314) - some missing fahrenheit calculations +- limited number of exclusions [#339](https://github.com/emsesp/EMS-ESP32/issues/339) ### Changed @@ -59,6 +63,7 @@ - Wired renamed to Ethernet - removed system/pin command, new commands in analogsensors - system/info device-info split to name/version/brand +- exclude list uses short-names, possible flags for web/api/mqtt excludes, readonly and favorite (selection not yet implemented) ## **BREAKING CHANGES:** @@ -70,3 +75,4 @@ - Boiler `ww` tag renamed to `dhw`. Any custom Home Assistant lovelace dashboards will need updating. - Renamed description of `wwtapactivated` to "turn on/off DHW". Otherwise would have looked like "boiler_dhw_turn_on_off_dhw" in HA. - `/api/system/info` endpoint has updated keys. Now lowercase, no underscores and not capitalized. Replace "handlers" with "handlers received", "handlers fetched" and "handlers pending". + - exclude list changed from 3.4.0b8 to 3.4.0b9 and has to be updated by user. diff --git a/src/version.h b/src/version.h index 3eaeb3552..d5f57b3ce 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b8" +#define EMSESP_APP_VERSION "3.4.0b9" From be0d5557a68e74dbdae70af678934b9e3e162c54 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 26 Mar 2022 22:17:10 +0100 Subject: [PATCH 118/319] update packages --- interface/package-lock.json | 108 ++++++++++++++++++------------------ interface/package.json | 8 +-- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 114cb4843..fe89c4fac 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -12,10 +12,10 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.5.1", - "@mui/material": "^5.5.1", + "@mui/material": "^5.5.2", "@types/lodash": "^4.14.180", - "@types/node": "^17.0.21", - "@types/react": "^17.0.41", + "@types/node": "^17.0.23", + "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", @@ -33,7 +33,7 @@ "react-router-dom": "^6.2.2", "react-scripts": "5.0.0", "sockette": "^2.0.6", - "typescript": "^4.6.2" + "typescript": "^4.6.3" }, "devDependencies": { "nodemon": "^2.0.15", @@ -2849,14 +2849,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.72", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.72.tgz", - "integrity": "sha512-WCAooa9eqbsC68LhyKtDBRumH4hV1eRZ0A3SDKFHSwYG9fCOdsFv/H1dIYRJM0rwD45bMnuDiG3Qmx7YsTiptw==", + "version": "5.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.73.tgz", + "integrity": "sha512-TEUCIIEAWrngAqpIa+dY3nofGSNj70LC3KC9WcCzyXPK3M4AG2GNi7ndd/g/0DtC55kbxrudzlV8TG3vrB2Vjw==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/utils": "^5.4.4", - "@popperjs/core": "^2.11.3", + "@popperjs/core": "^2.11.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" @@ -2905,13 +2905,13 @@ } }, "node_modules/@mui/material": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.1.tgz", - "integrity": "sha512-bJSYgymgSZ7btPTNnWFrr2EmGoVQc4A/0WLfP/ESY2dxnhnbFDwt7twiOKmJp3u84YXriEDt5v9EZQLf7A+y0Q==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.2.tgz", + "integrity": "sha512-r4p1u9eDlSqW3TS/Iq9yolifWHpuW6e0BSeqEJW3EEIcKfPVVk4WNUNJ+s8DtN7dBoDcveXxcQVVjYXTIv1d9g==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.72", - "@mui/system": "^5.5.1", + "@mui/base": "5.0.0-alpha.73", + "@mui/system": "^5.5.2", "@mui/types": "^7.1.3", "@mui/utils": "^5.4.4", "@types/react-transition-group": "^4.4.4", @@ -2975,9 +2975,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.4.tgz", - "integrity": "sha512-AKx3rSgB6dmt5f7iP4K18mLFlE5/9EfJe/5EH9Pyqez8J/CPkTgYhJ/Va6qtlrcunzpui+uG/vfuf04yAZekSg==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.5.2.tgz", + "integrity": "sha512-jkz5AHHbA43akBo5L3y1X1/X0f+RvXvCp3eXKt+iOf3qnKSAausbtlVz7gBbC4xIWDnP1Jb/6T+t/0/7gObRYA==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -3005,13 +3005,13 @@ } }, "node_modules/@mui/system": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.1.tgz", - "integrity": "sha512-2hynI4hN8304hOCT8sc4knJviwUUYJ7XK3mXwQ0nagVGOPnWSOad/nYADm7K0vdlCeUXLIbDbe7oNN3Kaiu2kA==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.2.tgz", + "integrity": "sha512-OATYFI36nliud8xh0u+ZNqDo0jWjxpO0vZLlzqNB+ZtkR5Q/+1X3GgboA9ruiB8Rq+udnJlMBQNGW0qqjvAOHQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.4.4", - "@mui/styled-engine": "^5.4.4", + "@mui/styled-engine": "^5.5.2", "@mui/types": "^7.1.3", "@mui/utils": "^5.4.4", "clsx": "^1.1.1", @@ -3739,9 +3739,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3774,9 +3774,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.41", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.41.tgz", - "integrity": "sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==", + "version": "17.0.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.43.tgz", + "integrity": "sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -16489,9 +16489,9 @@ } }, "node_modules/typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19706,14 +19706,14 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.72", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.72.tgz", - "integrity": "sha512-WCAooa9eqbsC68LhyKtDBRumH4hV1eRZ0A3SDKFHSwYG9fCOdsFv/H1dIYRJM0rwD45bMnuDiG3Qmx7YsTiptw==", + "version": "5.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.73.tgz", + "integrity": "sha512-TEUCIIEAWrngAqpIa+dY3nofGSNj70LC3KC9WcCzyXPK3M4AG2GNi7ndd/g/0DtC55kbxrudzlV8TG3vrB2Vjw==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/utils": "^5.4.4", - "@popperjs/core": "^2.11.3", + "@popperjs/core": "^2.11.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" @@ -19728,13 +19728,13 @@ } }, "@mui/material": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.1.tgz", - "integrity": "sha512-bJSYgymgSZ7btPTNnWFrr2EmGoVQc4A/0WLfP/ESY2dxnhnbFDwt7twiOKmJp3u84YXriEDt5v9EZQLf7A+y0Q==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.2.tgz", + "integrity": "sha512-r4p1u9eDlSqW3TS/Iq9yolifWHpuW6e0BSeqEJW3EEIcKfPVVk4WNUNJ+s8DtN7dBoDcveXxcQVVjYXTIv1d9g==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.72", - "@mui/system": "^5.5.1", + "@mui/base": "5.0.0-alpha.73", + "@mui/system": "^5.5.2", "@mui/types": "^7.1.3", "@mui/utils": "^5.4.4", "@types/react-transition-group": "^4.4.4", @@ -19757,9 +19757,9 @@ } }, "@mui/styled-engine": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.4.tgz", - "integrity": "sha512-AKx3rSgB6dmt5f7iP4K18mLFlE5/9EfJe/5EH9Pyqez8J/CPkTgYhJ/Va6qtlrcunzpui+uG/vfuf04yAZekSg==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.5.2.tgz", + "integrity": "sha512-jkz5AHHbA43akBo5L3y1X1/X0f+RvXvCp3eXKt+iOf3qnKSAausbtlVz7gBbC4xIWDnP1Jb/6T+t/0/7gObRYA==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -19767,13 +19767,13 @@ } }, "@mui/system": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.1.tgz", - "integrity": "sha512-2hynI4hN8304hOCT8sc4knJviwUUYJ7XK3mXwQ0nagVGOPnWSOad/nYADm7K0vdlCeUXLIbDbe7oNN3Kaiu2kA==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.2.tgz", + "integrity": "sha512-OATYFI36nliud8xh0u+ZNqDo0jWjxpO0vZLlzqNB+ZtkR5Q/+1X3GgboA9ruiB8Rq+udnJlMBQNGW0qqjvAOHQ==", "requires": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.4.4", - "@mui/styled-engine": "^5.4.4", + "@mui/styled-engine": "^5.5.2", "@mui/types": "^7.1.3", "@mui/utils": "^5.4.4", "clsx": "^1.1.1", @@ -20275,9 +20275,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" }, "@types/parse-json": { "version": "4.0.0", @@ -20310,9 +20310,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.41", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.41.tgz", - "integrity": "sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==", + "version": "17.0.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.43.tgz", + "integrity": "sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -29485,9 +29485,9 @@ } }, "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==" + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" }, "unbox-primitive": { "version": "1.0.1", diff --git a/interface/package.json b/interface/package.json index da1455693..8a82ef70d 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,10 +8,10 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.5.1", - "@mui/material": "^5.5.1", + "@mui/material": "^5.5.2", "@types/lodash": "^4.14.180", - "@types/node": "^17.0.21", - "@types/react": "^17.0.41", + "@types/node": "^17.0.23", + "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", @@ -29,7 +29,7 @@ "react-router-dom": "^6.2.2", "react-scripts": "5.0.0", "sockette": "^2.0.6", - "typescript": "^4.6.2" + "typescript": "^4.6.3" }, "scripts": { "start": "react-app-rewired start", From d0efe8eb47756fe63738ebcf63bccac59a303b18 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 26 Mar 2022 22:17:25 +0100 Subject: [PATCH 119/319] changes for standalone compilation --- lib_standalone/AsyncJson.h | 8 ++++++-- mock-api/server.js | 2 +- src/devices/thermostat.cpp | 2 ++ src/emsdevice.cpp | 2 +- src/test/test.cpp | 3 +-- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib_standalone/AsyncJson.h b/lib_standalone/AsyncJson.h index 28377eeee..2ec4a6322 100644 --- a/lib_standalone/AsyncJson.h +++ b/lib_standalone/AsyncJson.h @@ -90,8 +90,8 @@ class PrettyAsyncJsonResponse { class MsgpackAsyncJsonResponse { protected: DynamicJsonDocument _jsonBuffer; - JsonVariant _root; - bool _isValid; + JsonVariant _root; + bool _isValid; public: MsgpackAsyncJsonResponse(bool isArray = false, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE) @@ -187,6 +187,7 @@ class AsyncCallbackJsonWebHandler : public AsyncWebHandler { ArJsonRequestHandlerFunction _onRequest; size_t _contentLength; size_t _maxContentLength; + size_t _maxJsonBufferSize; public: AsyncCallbackJsonWebHandler(const String & uri, ArJsonRequestHandlerFunction onRequest, size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE) @@ -202,6 +203,9 @@ class AsyncCallbackJsonWebHandler : public AsyncWebHandler { void setMaxContentLength(int maxContentLength) { _maxContentLength = maxContentLength; } + void setMaxJsonBufferSize(int maxJsonBufferSize) { + _maxJsonBufferSize = maxJsonBufferSize; + } void onRequest(ArJsonRequestHandlerFunction fn) { _onRequest = fn; } diff --git a/mock-api/server.js b/mock-api/server.js index ca2f5a44f..e8aa0ee4d 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -926,7 +926,7 @@ rest_server.post(EMSESP_DEVICEENTITIES_ENDPOINT, (req, res) => { }) rest_server.post(EMSESP_EXCLUDE_ENTITIES_ENDPOINT, (req, res) => { - console.log('exclude list for productid ' + req.body.product_id + ' device_id ' + req.body.device_id + ' entities:') + console.log('exclude list for unique id ' + req.body.id + ' and entities:') console.log(req.body.entity_ids) res.sendStatus(200) }) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index e4452581f..1e3b5744c 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1253,7 +1253,9 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { } if (!ntp_ && tm_->tm_year > 110) { // emsesp clock not set, but thermostat clock struct timeval newnow = {.tv_sec = ttime}; +#ifndef EMSESP_STANDALONE settimeofday(&newnow, nullptr); +#endif LOG_INFO(F("ems-esp time set from thermostat")); } } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 47fc3f442..de9a88eb7 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -768,7 +768,7 @@ void EMSdevice::mask_entity(std::string entity_id) { std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); if (entity == entity_id.substr(2)) { #if defined(EMSESP_USE_SERIAL) - Serial.print("exclude_entity() Removing Visible for device value: "); + Serial.print("mask_entity() Removing Visible for device value: "); Serial.println(read_flash_string(dv.full_name).c_str()); #endif dv.state = (dv.state & 0x0F) | (flag << 4); // set state high bits to flag, turn off active and ha flags diff --git a/src/test/test.cpp b/src/test/test.cpp index a9ec54c4f..ee4635ee5 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -609,8 +609,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const // toggle mode for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice->unique_id() == 1) { // boiler - uint8_t entity_id = 47; // wwseltemp - emsdevice->exclude_entity(entity_id); + emsdevice->mask_entity("07wwseltemp"); break; } } From 175412774c677f4e2b2f3a6b5121d2e0094abaf7 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 26 Mar 2022 22:28:50 +0100 Subject: [PATCH 120/319] pass cmd string as reference --- src/emsdevice.cpp | 2 +- src/emsdevice.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index de9a88eb7..715484bb0 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -489,7 +489,7 @@ bool EMSdevice::is_readable(const void * value_p) const { } // check if value/command is readonly -bool EMSdevice::is_readonly(const std::string cmd, const int8_t id) const { +bool EMSdevice::is_readonly(const std::string & cmd, const int8_t id) const { uint8_t tag = id > 0 ? DeviceValueTAG::TAG_HC1 + id - 1 : DeviceValueTAG::TAG_NONE; for (const auto & dv : devicevalues_) { // check command name and tag, id -1 is default hc and only checks name diff --git a/src/emsdevice.h b/src/emsdevice.h index d95f92862..a521a042c 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -243,7 +243,7 @@ class EMSdevice { void read_command(const uint16_t type_id, uint8_t offset = 0, uint8_t length = 0) const; bool is_readable(const void * value_p) const; - bool is_readonly(const std::string cmd, const int8_t id) const; + bool is_readonly(const std::string & cmd, const int8_t id) const; bool has_command(const void * value_p) const; void publish_value(void * value_p) const; void publish_all_values(); From ff075a4f5611dfdace394f115db19992e2d0daca Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 16:18:56 +0200 Subject: [PATCH 121/319] use m for mask instead of x --- mock-api/server.js | 186 ++++++++++++++++++++++----------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/mock-api/server.js b/mock-api/server.js index e8aa0ee4d..22b414d00 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -302,7 +302,7 @@ const EMSESP_BOARDPROFILE_ENDPOINT = REST_ENDPOINT_ROOT + 'boardProfile' const EMSESP_WRITE_VALUE_ENDPOINT = REST_ENDPOINT_ROOT + 'writeValue' const EMSESP_WRITE_SENSOR_ENDPOINT = REST_ENDPOINT_ROOT + 'writeSensor' const EMSESP_WRITE_ANALOG_ENDPOINT = REST_ENDPOINT_ROOT + 'writeAnalog' -const EMSESP_EXCLUDE_ENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'excludeEntities' +const EMSESP_MASKED_ENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'maskedEntities' const EMSESP_RESET_CUSTOMIZATIONS_ENDPOINT = REST_ENDPOINT_ROOT + 'resetCustomizations' settings = { @@ -574,21 +574,21 @@ const emsesp_devicedata_4 = { u: 1, n: 'hc2 selected room temperature', c: 'hc2/seltemp', - x: false, + m: 0, }, { v: 18.6, u: 1, n: 'hc2 current room temperature', c: '', - x: true, + m: 7, }, { v: 'off', u: 0, n: 'hc2 mode', c: 'hc2/mode', - x: true, + m: 7, }, ], } @@ -598,119 +598,119 @@ const emsesp_deviceentities_1 = [ v: '(0)', n: 'error code', s: 'errorcode', - x: false, + m: 0, i: 1, }, { v: '14:54:39 06/06/2021', n: 'date/time', s: 'datetime', - x: false, + m: 0, i: 2, }, { v: 18.22, n: 'hc1 selected room temperature', s: 'hc1/seltemp', - x: false, + m: 0, i: 3, }, { v: 22.6, n: 'hc1 current room temperature', s: 'hc1/curtemp', - x: false, + m: 0, i: 4, }, { v: 'auto', n: 'hc1 mode', s: 'hc1/mode', - x: false, + m: 0, i: 5, }, ] const emsesp_deviceentities_2 = [ - { v: false, n: 'heating active', s: 'heatingactive', x: false, i: 1 }, - { v: false, n: 'tapwater active', s: 'tapwateractive', x: false, i: 2 }, - { v: 5, n: 'selected flow temperature', s: 'selflowtemp', x: false, i: 3 }, - { v: 0, n: 'burner selected max power', s: 'selburnpow', x: false, i: 4 }, - { v: 0, n: 'heating pump modulation', s: 'heatingpumpmod', x: false, i: 5 }, - { n: 'heating pump 2 modulation', s: 'heatingpump2mod', x: true, i: 6 }, - { n: 'outside temperature', s: 'outdoortemp', x: true, i: 7 }, - { v: 53, n: 'current flow temperature', s: 'curflowtemp', x: false, i: 8 }, - { v: 51.8, n: 'return temperature', s: 'rettemp', x: false, i: 9 }, - { n: 'mixing switch temperature', s: 'switchtemp', x: true, i: 10 }, - { v: 1.3, n: 'system pressure', s: 'syspress', x: false, i: 11 }, - { v: 54.6, n: 'actual boiler temperature', s: 'boiltemp', x: false, i: 12 }, - { n: 'exhaust temperature', s: 'exhausttemp', x: true, i: 13 }, - { v: false, n: 'gas', s: 'burngas', x: false, i: 14 }, - { v: false, n: 'gas stage 2', s: 'burngas2', x: false, i: 15 }, - { v: 0, n: 'flame current', s: 'flamecurr', x: false, i: 16 }, - { v: false, n: 'heating pump', s: 'heatingpump', x: false, i: 17 }, - { v: false, n: 'fan', s: 'fanwork', x: false, i: 18 }, - { v: false, n: 'ignition', s: 'ignwork', x: false, i: 19 }, - { v: false, n: 'oil preheating', s: 'oilpreheat', x: false, i: 20 }, - { v: true, n: 'heating activated', s: 'heatingactivated', x: false, i: 21 }, - { v: 80, n: 'heating temperature', s: 'heatingtemp', x: false, i: 22 }, - { v: 70, n: 'burner pump max power', s: 'pumpmodmax', x: false, i: 23 }, - { v: 30, n: 'burner pump min power', s: 'pumpmodmin', x: false, i: 24 }, - { v: 1, n: 'pump delay', s: 'pumpdelay', x: false, i: 25 }, - { v: 10, n: 'burner min period', s: 'burnminperiod', x: false, i: 26 }, - { v: 0, n: 'burner min power', s: 'burnminpower', x: false, i: 27 }, - { v: 50, n: 'burner max power', s: 'burnmaxpower', x: false, i: 28 }, - { v: -6, n: 'hysteresis on temperature', s: 'boilhyston', x: false, i: 29 }, - { v: 6, n: 'hysteresis off temperature', s: 'boilhystoff', x: false, i: 30 }, - { v: 0, n: 'set flow temperature', s: 'setflowtemp', x: false, i: 31 }, - { v: 0, n: 'burner set power', s: 'setburnpow', x: false, i: 32 }, - { v: 0, n: 'burner current power', s: 'curburnpow', x: false, i: 33 }, - { v: 326323, n: 'burner starts', s: 'burnstarts', x: false, i: 34 }, - { v: 553437, n: 'total burner operating time', s: 'burnworkmin', x: false, i: 35 }, - { v: 451286, n: 'total heat operating time', s: 'heatworkmin', x: false, i: 36 }, - { v: 4672175, n: 'total UBA operating time', s: 'ubauptime', x: false, i: 37 }, - { v: '1C(210) 06.06.2020 12:07 (0 min)', n: 'last error code', s: 'lastcode', x: false, i: 38 }, - { v: '0H', n: 'service code', s: 'servicecode', x: false, i: 39 }, - { v: 203, n: 'service code number', s: 'servicecodenumber', x: false, i: 40 }, - { v: 'H00', n: 'maintenance message', s: 'maintenancemessage', x: false, i: 41 }, - { v: 'manual', n: 'maintenance scheduled', s: 'maintenance', x: false, i: 42 }, - { v: 6000, n: 'time to next maintenance', s: 'maintenancetime', x: false, i: 43 }, - { v: '01.01.2012', n: 'next maintenance date', s: 'maintenancedate', x: false, i: 44 }, - { v: true, n: 'dhw turn on/off', s: 'wwtapactivated', x: false, i: 45 }, - { v: 62, n: 'dhw set temperature', s: 'wwsettemp', x: false, i: 46 }, - { v: 60, n: 'dhw selected temperature', s: 'wwseltemp', x: false, i: 47 }, - { n: 'dhw selected lower temperature', s: 'wwseltemplow', x: true, i: 48 }, - { n: 'dhw selected temperature for off', s: 'wwseltempoff', x: true, i: 49 }, - { n: 'dhw single charge temperature', s: 'wwseltempsingle', x: true, i: 50 }, - { v: 'flow', n: 'dhw type', s: 'wwtype', x: false, i: 51 }, - { v: 'hot', n: 'dhw comfort', s: 'wwcomfort', x: false, i: 52 }, - { v: 40, n: 'dhw flow temperature offset', s: 'wwflowtempoffset', x: false, i: 53 }, - { v: 100, n: 'dhw max power', s: 'wwmaxpower', x: false, i: 54 }, - { v: false, n: 'dhw circulation pump available', s: 'wwcircpump', x: false, i: 55 }, - { v: '3-way valve', n: 'dhw charging type', s: 'wwchargetype', x: false, i: 56 }, - { v: -5, n: 'dhw hysteresis on temperature', s: 'wwhyston', x: false, i: 57 }, - { v: 0, n: 'dhw hysteresis off temperature', s: 'wwhystoff', x: false, i: 58 }, - { v: 70, n: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', x: false, i: 59 }, - { v: 'off', n: 'dhw circulation pump mode', s: 'wwcircmode', x: false, i: 60 }, - { v: false, n: 'dhw circulation active', s: 'wwcirc', x: false, i: 61 }, - { v: 46.4, n: 'dhw current intern temperature', s: 'wwcurtemp', x: false, i: 62 }, - { n: 'dhw current extern temperature', s: 'wwcurtemp2', x: true, i: 63 }, - { v: 0, n: 'dhw current tap water flow', s: 'wwcurflow', x: false, i: 64 }, - { v: 46.3, n: 'dhw storage intern temperature', s: 'wwstoragetemp1', x: false, i: 65 }, - { n: 'dhw storage extern temperature', s: 'wwstoragetemp2', x: true, i: 66 }, - { v: true, n: 'dhw activated', s: 'wwactivated', x: false, i: 67 }, - { v: false, n: 'dhw one time charging', s: 'wwonetime', x: false, i: 68 }, - { v: false, n: 'dhw disinfecting', s: 'wwdisinfecting', x: false, i: 69 }, - { v: false, n: 'dhw charging', s: 'wwcharging', x: false, i: 70 }, - { v: false, n: 'dhw recharging', s: 'wwrecharging', x: false, i: 71 }, - { v: true, n: 'dhw temperature ok', s: 'wwtempok', x: false, i: 72 }, - { v: false, n: 'dhw active', s: 'wwactive', x: false, i: 73 }, - { v: true, n: 'dhw 3way valve active', s: 'ww3wayvalve', x: false, i: 74 }, - { v: 0, n: 'dhw set pump power', s: 'wwsetpumppower', x: false, i: 75 }, - { n: 'dhw mixer temperature', s: 'wwmixertemp', x: true, i: 76 }, - { n: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', x: true, i: 77 }, - { v: 288768, n: 'dhw starts', s: 'wwstarts', x: false, i: 78 }, - { v: 102151, n: 'dhw active time', s: 'wwworkm', x: false, i: 79 }, + { v: false, n: 'heating active', s: 'heatingactive', m: 0, i: 1 }, + { v: false, n: 'tapwater active', s: 'tapwateractive', m: 0, i: 2 }, + { v: 5, n: 'selected flow temperature', s: 'selflowtemp', m: 0, i: 3 }, + { v: 0, n: 'burner selected max power', s: 'selburnpow', m: 0, i: 4 }, + { v: 0, n: 'heating pump modulation', s: 'heatingpumpmod', m: 0, i: 5 }, + { n: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 7, i: 6 }, + { n: 'outside temperature', s: 'outdoortemp', m: 7, i: 7 }, + { v: 53, n: 'current flow temperature', s: 'curflowtemp', m: 0, i: 8 }, + { v: 51.8, n: 'return temperature', s: 'rettemp', m: 0, i: 9 }, + { n: 'mixing switch temperature', s: 'switchtemp', m: 7, i: 10 }, + { v: 1.3, n: 'system pressure', s: 'syspress', m: 0, i: 11 }, + { v: 54.6, n: 'actual boiler temperature', s: 'boiltemp', m: 0, i: 12 }, + { n: 'exhaust temperature', s: 'exhausttemp', m: 7, i: 13 }, + { v: false, n: 'gas', s: 'burngas', m: 0, i: 14 }, + { v: false, n: 'gas stage 2', s: 'burngas2', m: 0, i: 15 }, + { v: 0, n: 'flame current', s: 'flamecurr', m: 0, i: 16 }, + { v: false, n: 'heating pump', s: 'heatingpump', m: 0, i: 17 }, + { v: false, n: 'fan', s: 'fanwork', m: 0, i: 18 }, + { v: false, n: 'ignition', s: 'ignwork', m: 0, i: 19 }, + { v: false, n: 'oil preheating', s: 'oilpreheat', m: 0, i: 20 }, + { v: true, n: 'heating activated', s: 'heatingactivated', m: 0, i: 21 }, + { v: 80, n: 'heating temperature', s: 'heatingtemp', m: 0, i: 22 }, + { v: 70, n: 'burner pump max power', s: 'pumpmodmax', m: 0, i: 23 }, + { v: 30, n: 'burner pump min power', s: 'pumpmodmin', m: 0, i: 24 }, + { v: 1, n: 'pump delay', s: 'pumpdelay', m: 0, i: 25 }, + { v: 10, n: 'burner min period', s: 'burnminperiod', m: 0, i: 26 }, + { v: 0, n: 'burner min power', s: 'burnminpower', m: 0, i: 27 }, + { v: 50, n: 'burner max power', s: 'burnmaxpower', m: 0, i: 28 }, + { v: -6, n: 'hysteresis on temperature', s: 'boilhyston', m: 0, i: 29 }, + { v: 6, n: 'hysteresis off temperature', s: 'boilhystoff', m: 0, i: 30 }, + { v: 0, n: 'set flow temperature', s: 'setflowtemp', m: 0, i: 31 }, + { v: 0, n: 'burner set power', s: 'setburnpow', m: 0, i: 32 }, + { v: 0, n: 'burner current power', s: 'curburnpow', m: 0, i: 33 }, + { v: 326323, n: 'burner starts', s: 'burnstarts', m: 0, i: 34 }, + { v: 553437, n: 'total burner operating time', s: 'burnworkmin', m: 0, i: 35 }, + { v: 451286, n: 'total heat operating time', s: 'heatworkmin', m: 0, i: 36 }, + { v: 4672175, n: 'total UBA operating time', s: 'ubauptime', m: 0, i: 37 }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', n: 'last error code', s: 'lastcode', m: 0, i: 38 }, + { v: '0H', n: 'service code', s: 'servicecode', m: 0, i: 39 }, + { v: 203, n: 'service code number', s: 'servicecodenumber', m: 0, i: 40 }, + { v: 'H00', n: 'maintenance message', s: 'maintenancemessage', m: 0, i: 41 }, + { v: 'manual', n: 'maintenance scheduled', s: 'maintenance', m: 0, i: 42 }, + { v: 6000, n: 'time to next maintenance', s: 'maintenancetime', m: 0, i: 43 }, + { v: '01.01.2012', n: 'next maintenance date', s: 'maintenancedate', m: 0, i: 44 }, + { v: true, n: 'dhw turn on/off', s: 'wwtapactivated', m: 0, i: 45 }, + { v: 62, n: 'dhw set temperature', s: 'wwsettemp', m: 0, i: 46 }, + { v: 60, n: 'dhw selected temperature', s: 'wwseltemp', m: 0, i: 47 }, + { n: 'dhw selected lower temperature', s: 'wwseltemplow', m: 7, i: 48 }, + { n: 'dhw selected temperature for off', s: 'wwseltempoff', m: 7, i: 49 }, + { n: 'dhw single charge temperature', s: 'wwseltempsingle', m: 7, i: 50 }, + { v: 'flow', n: 'dhw type', s: 'wwtype', m: 0, i: 51 }, + { v: 'hot', n: 'dhw comfort', s: 'wwcomfort', m: 0, i: 52 }, + { v: 40, n: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0, i: 53 }, + { v: 100, n: 'dhw max power', s: 'wwmaxpower', m: 0, i: 54 }, + { v: false, n: 'dhw circulation pump available', s: 'wwcircpump', m: 0, i: 55 }, + { v: '3-way valve', n: 'dhw charging type', s: 'wwchargetype', m: 0, i: 56 }, + { v: -5, n: 'dhw hysteresis on temperature', s: 'wwhyston', m: 0, i: 57 }, + { v: 0, n: 'dhw hysteresis off temperature', s: 'wwhystoff', m: 0, i: 58 }, + { v: 70, n: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', m: 0, i: 59 }, + { v: 'off', n: 'dhw circulation pump mode', s: 'wwcircmode', m: 0, i: 60 }, + { v: false, n: 'dhw circulation active', s: 'wwcirc', m: 0, i: 61 }, + { v: 46.4, n: 'dhw current intern temperature', s: 'wwcurtemp', m: 0, i: 62 }, + { n: 'dhw current extern temperature', s: 'wwcurtemp2', m: 7, i: 63 }, + { v: 0, n: 'dhw current tap water flow', s: 'wwcurflow', m: 0, i: 64 }, + { v: 46.3, n: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0, i: 65 }, + { n: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 7, i: 66 }, + { v: true, n: 'dhw activated', s: 'wwactivated', m: 0, i: 67 }, + { v: false, n: 'dhw one time charging', s: 'wwonetime', m: 0, i: 68 }, + { v: false, n: 'dhw disinfecting', s: 'wwdisinfecting', m: 0, i: 69 }, + { v: false, n: 'dhw charging', s: 'wwcharging', m: 0, i: 70 }, + { v: false, n: 'dhw recharging', s: 'wwrecharging', m: 0, i: 71 }, + { v: true, n: 'dhw temperature ok', s: 'wwtempok', m: 0, i: 72 }, + { v: false, n: 'dhw active', s: 'wwactive', m: 0, i: 73 }, + { v: true, n: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0, i: 74 }, + { v: 0, n: 'dhw set pump power', s: 'wwsetpumppower', m: 0, i: 75 }, + { n: 'dhw mixer temperature', s: 'wwmixertemp', m: 7, i: 76 }, + { n: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 7, i: 77 }, + { v: 288768, n: 'dhw starts', s: 'wwstarts', m: 0, i: 78 }, + { v: 102151, n: 'dhw active time', s: 'wwworkm', m: 0, i: 79 }, ] const emsesp_deviceentities_4 = [ @@ -718,20 +718,20 @@ const emsesp_deviceentities_4 = [ v: 16, n: 'hc2 selected room temperature', s: 'hc2/seltemp', - x: false, + m: 0, i: 1, }, { n: 'hc2 current room temperature', s: 'hc2/curtemp', - x: true, + m: 7, i: 2, }, { v: 'off', n: 'hc2 mode', s: 'hc2/mode', - x: true, + m: 7, i: 3, }, ] @@ -925,8 +925,8 @@ rest_server.post(EMSESP_DEVICEENTITIES_ENDPOINT, (req, res) => { } }) -rest_server.post(EMSESP_EXCLUDE_ENTITIES_ENDPOINT, (req, res) => { - console.log('exclude list for unique id ' + req.body.id + ' and entities:') +rest_server.post(EMSESP_MASKED_ENTITIES_ENDPOINT, (req, res) => { + console.log('list for unique id ' + req.body.id + ' and entities:') console.log(req.body.entity_ids) res.sendStatus(200) }) From 079f4e5ac0d2e9e0ca5aa76469065d275ba202bf Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 16:19:55 +0200 Subject: [PATCH 122/319] replace exclude_entities with masked_entities --- interface/src/project/api.ts | 6 +-- interface/src/project/types.ts | 4 +- src/system.cpp | 3 +- src/test/test.cpp | 4 +- src/test/test.h | 6 +-- src/web/WebCustomizationService.cpp | 57 +++++++++++++++-------------- src/web/WebCustomizationService.h | 15 ++++---- 7 files changed, 48 insertions(+), 47 deletions(-) diff --git a/interface/src/project/api.ts b/interface/src/project/api.ts index f3a29a6bc..e605332fb 100644 --- a/interface/src/project/api.ts +++ b/interface/src/project/api.ts @@ -12,7 +12,7 @@ import { DeviceData, DeviceEntity, UniqueID, - ExcludeEntities, + MaskedEntities, WriteValue, WriteSensor, WriteAnalog, @@ -63,8 +63,8 @@ export function readDeviceEntities(unique_id: UniqueID): AxiosPromise { - return AXIOS.post('/excludeEntities', excludeEntities); +export function writeMaskedEntities(maskedEntities: MaskedEntities): AxiosPromise { + return AXIOS.post('/maskedEntities', maskedEntities); } export function writeValue(writevalue: WriteValue): AxiosPromise { diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 226873bdd..5bcf45dad 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -146,11 +146,11 @@ export interface DeviceEntity { v?: any; // value, in any format n: string; // name s: string; // shortname - x: boolean; // excluded flag + m: number; // mask i: number; // unique id } -export interface ExcludeEntities { +export interface MaskedEntities { id: number; entity_ids: string[]; } diff --git a/src/system.cpp b/src/system.cpp index ab29b4a68..bf8f9ec26 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1018,7 +1018,6 @@ bool System::command_customizations(const char * value, const int8_t id, JsonObj JsonObject node = output.createNestedObject("Customizations"); - // hide ssid from this list EMSESP::webCustomizationService.read([&](WebCustomization & settings) { // sensors JsonArray sensorsJson = node.createNestedArray("sensors"); @@ -1053,7 +1052,7 @@ bool System::command_customizations(const char * value, const int8_t id, JsonObj } } - // exclude entities + // masked entities JsonArray mask_entitiesJson = node.createNestedArray("masked_entities"); for (const auto & entityCustomization : settings.entityCustomizations) { JsonObject entityJson = mask_entitiesJson.createNestedObject(); diff --git a/src/test/test.cpp b/src/test/test.cpp index ee4635ee5..960332c58 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -595,8 +595,8 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const EMSESP::system_.healthcheck(n); } - if (command == "exclude") { - shell.printfln(F("Testing exclude entities")); + if (command == "masked") { + shell.printfln(F("Testing masked entities")); Mqtt::ha_enabled(true); Mqtt::send_response(false); diff --git a/src/test/test.h b/src/test/test.h index 9ca31dd36..65021652e 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -31,12 +31,12 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "mixer" // #define EMSESP_DEBUG_DEFAULT "web" // #define EMSESP_DEBUG_DEFAULT "mqtt" -// #define EMSESP_DEBUG_DEFAULT "general" +#define EMSESP_DEBUG_DEFAULT "general" // #define EMSESP_DEBUG_DEFAULT "boiler" // #define EMSESP_DEBUG_DEFAULT "mqtt2" // #define EMSESP_DEBUG_DEFAULT "mqtt_nested" -#define EMSESP_DEBUG_DEFAULT "ha" -// #define EMSESP_DEBUG_DEFAULT "exclude" +// #define EMSESP_DEBUG_DEFAULT "ha" +// #define EMSESP_DEBUG_DEFAULT "masked" // #define EMSESP_DEBUG_DEFAULT "board_profile" // #define EMSESP_DEBUG_DEFAULT "shower_alert" // #define EMSESP_DEBUG_DEFAULT "310" diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 44301e2a6..21bc198ba 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -31,9 +31,9 @@ WebCustomizationService::WebCustomizationService(AsyncWebServer * server, FS * f securityManager, AuthenticationPredicates::IS_AUTHENTICATED) , _fsPersistence(WebCustomization::read, WebCustomization::update, this, fs, EMSESP_CUSTOMIZATION_FILE) - , _exclude_entities_handler(EXCLUDE_ENTITIES_PATH, - securityManager->wrapCallback(std::bind(&WebCustomizationService::exclude_entities, this, _1, _2), - AuthenticationPredicates::IS_AUTHENTICATED)) + , _masked_entities_handler(MASKED_ENTITIES_PATH, + securityManager->wrapCallback(std::bind(&WebCustomizationService::masked_entities, this, _1, _2), + AuthenticationPredicates::IS_AUTHENTICATED)) , _device_entities_handler(DEVICE_ENTITIES_PATH, securityManager->wrapCallback(std::bind(&WebCustomizationService::device_entities, this, _1, _2), AuthenticationPredicates::IS_AUTHENTICATED)) { @@ -45,17 +45,17 @@ WebCustomizationService::WebCustomizationService(AsyncWebServer * server, FS * f HTTP_POST, securityManager->wrapRequest(std::bind(&WebCustomizationService::reset_customization, this, _1), AuthenticationPredicates::IS_ADMIN)); - _exclude_entities_handler.setMethod(HTTP_POST); - _exclude_entities_handler.setMaxContentLength(2048); - _exclude_entities_handler.setMaxJsonBufferSize(2048); - server->addHandler(&_exclude_entities_handler); + _masked_entities_handler.setMethod(HTTP_POST); + _masked_entities_handler.setMaxContentLength(2048); + _masked_entities_handler.setMaxJsonBufferSize(2048); + server->addHandler(&_masked_entities_handler); _device_entities_handler.setMethod(HTTP_POST); _device_entities_handler.setMaxContentLength(256); server->addHandler(&_device_entities_handler); } -// this creates the customization file, saving to the FS +// this creates the customization file, saving it to the FS void WebCustomization::read(WebCustomization & settings, JsonObject & root) { // Dallas Sensor customization JsonArray sensorsJson = root.createNestedArray("sensors"); @@ -78,21 +78,21 @@ void WebCustomization::read(WebCustomization & settings, JsonObject & root) { sensorJson["type"] = sensor.type; // t } - // Exclude entities customization - JsonArray exclude_entitiesJson = root.createNestedArray("exclude_entities"); + // Masked entities customization + JsonArray masked_entitiesJson = root.createNestedArray("masked_entities"); for (const EntityCustomization & entityCustomization : settings.entityCustomizations) { - JsonObject entityJson = exclude_entitiesJson.createNestedObject(); + JsonObject entityJson = masked_entitiesJson.createNestedObject(); entityJson["product_id"] = entityCustomization.product_id; entityJson["device_id"] = entityCustomization.device_id; - JsonArray exclude_entityJson = entityJson.createNestedArray("entity_ids"); + JsonArray masked_entityJson = entityJson.createNestedArray("entity_ids"); for (std::string entity_id : entityCustomization.entity_ids) { - exclude_entityJson.add(entity_id); + masked_entityJson.add(entity_id); } } } -// call on initialization and also when the page is saved via web +// call on initialization and also when the page is saved via web UI // this loads the data into the internal class StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & settings) { // Dallas Sensor customization @@ -124,17 +124,20 @@ StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & } } - // load array of entities id's to exclude, building up the object class + // load array of entities id's with masks, building up the object class settings.entityCustomizations.clear(); - if (root["exclude_entities"].is()) { - for (const JsonObject exclude_entities : root["exclude_entities"].as()) { + if (root["masked_entities"].is()) { + for (const JsonObject masked_entities : root["masked_entities"].as()) { auto new_entry = EntityCustomization(); - new_entry.product_id = exclude_entities["product_id"]; - new_entry.device_id = exclude_entities["device_id"]; + new_entry.product_id = masked_entities["product_id"]; + new_entry.device_id = masked_entities["device_id"]; - for (const JsonVariant exclude_entity_id : exclude_entities["entity_ids"].as()) { - new_entry.entity_ids.push_back(exclude_entity_id.as()); // add entity list + for (const JsonVariant masked_entity_id : masked_entities["entity_ids"].as()) { + if (masked_entity_id.is()) { + new_entry.entity_ids.push_back(masked_entity_id.as()); // add entity list + } } + settings.entityCustomizations.push_back(new_entry); // save the new object } } @@ -157,7 +160,7 @@ void WebCustomizationService::reset_customization(AsyncWebServerRequest * reques #endif } -// send back a short list devices used in the customization page +// send back a list of devices used to the customization web page void WebCustomizationService::devices(AsyncWebServerRequest * request) { auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_LARGE_DYN); JsonObject root = response->getRoot(); @@ -183,10 +186,10 @@ void WebCustomizationService::devices(AsyncWebServerRequest * request) { request->send(response); } -// send back list device entities +// send back list of device entities void WebCustomizationService::device_entities(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { - auto * response = new MsgpackAsyncJsonResponse(true, EMSESP_JSON_SIZE_XXLARGE_DYN); + auto * response = new MsgpackAsyncJsonResponse(true, EMSESP_JSON_SIZE_XXXLARGE_DYN); for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice->unique_id() == json["id"]) { #ifndef EMSESP_STANDALONE @@ -205,10 +208,10 @@ void WebCustomizationService::device_entities(AsyncWebServerRequest * request, J request->send(response); } -// takes a list of excluded ids send from the webUI +// takes a list of masked ids send from the webUI // saves it in the customization service // and updates the entity list real-time -void WebCustomizationService::exclude_entities(AsyncWebServerRequest * request, JsonVariant & json) { +void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { // find the device using the unique_id for (const auto & emsdevice : EMSESP::emsdevices) { @@ -218,7 +221,7 @@ void WebCustomizationService::exclude_entities(AsyncWebServerRequest * request, // first reset all the entity ids emsdevice->reset_entity_masks(); - // build a list of entities to exclude and then set the flag to non-visible + // build a list of entities JsonArray entity_ids_json = json["entity_ids"]; std::vector entity_ids; for (JsonVariant id : entity_ids_json) { diff --git a/src/web/WebCustomizationService.h b/src/web/WebCustomizationService.h index 1c34ac80d..526259dbe 100644 --- a/src/web/WebCustomizationService.h +++ b/src/web/WebCustomizationService.h @@ -27,7 +27,7 @@ // POST #define DEVICE_ENTITIES_PATH "/rest/deviceEntities" -#define EXCLUDE_ENTITIES_PATH "/rest/excludeEntities" +#define MASKED_ENTITIES_PATH "/rest/maskedEntities" #define RESET_CUSTOMIZATION_SERVICE_PATH "/rest/resetCustomizations" namespace emsesp { @@ -63,17 +63,16 @@ class EntityCustomization { public: uint8_t product_id; // device's product id uint8_t device_id; // device's device id - std::vector entity_ids; // array of entity ids to exclude + std::vector entity_ids; // array of entity ids with masks }; class WebCustomization { public: std::list sensorCustomizations; // for sensor names and offsets std::list analogCustomizations; // for analog sensors - std::list entityCustomizations; // for a list of entities that should be excluded from the device list - - static void read(WebCustomization & settings, JsonObject & root); - static StateUpdateResult update(JsonObject & root, WebCustomization & settings); + std::list entityCustomizations; // for a list of entities that have a special mask set + static void read(WebCustomization & settings, JsonObject & root); + static StateUpdateResult update(JsonObject & root, WebCustomization & settings); }; class WebCustomizationService : public StatefulService { @@ -94,11 +93,11 @@ class WebCustomizationService : public StatefulService { void devices(AsyncWebServerRequest * request); // POST - void exclude_entities(AsyncWebServerRequest * request, JsonVariant & json); + void masked_entities(AsyncWebServerRequest * request, JsonVariant & json); void device_entities(AsyncWebServerRequest * request, JsonVariant & json); void reset_customization(AsyncWebServerRequest * request); - AsyncCallbackJsonWebHandler _exclude_entities_handler, _device_entities_handler; + AsyncCallbackJsonWebHandler _masked_entities_handler, _device_entities_handler; }; } // namespace emsesp From 03af305761e38d5b80f291973000ffb2485bdb38 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 16:20:19 +0200 Subject: [PATCH 123/319] send state to WebUI (only the high nibble mask bits) --- src/emsdevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 715484bb0..a3810236b 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -861,8 +861,8 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { obj["s"] = dv.short_name; } - // is it marked as excluded? - obj["x"] = dv.has_state(DeviceValueState::DV_WEB_EXCLUDE); + // send back the mask state. We're only interested in the high nibble + obj["m"] = dv.state >> 4; // add the unique ID obj["i"] = dv.id; From b4cc300190985516758c5b342ba60d42aaefb3c1 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 16:20:32 +0200 Subject: [PATCH 124/319] fix lint warning --- src/devices/thermostat.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 1e3b5744c..d4de33b66 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1251,13 +1251,13 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { LOG_INFO(F("thermostat time correction from ntp")); } } +#ifndef EMSESP_STANDALONE if (!ntp_ && tm_->tm_year > 110) { // emsesp clock not set, but thermostat clock struct timeval newnow = {.tv_sec = ttime}; -#ifndef EMSESP_STANDALONE settimeofday(&newnow, nullptr); -#endif LOG_INFO(F("ems-esp time set from thermostat")); } +#endif } // process_RCError - type 0xA2 - error message - 14 bytes long From afd55c52e5745a60c834d35d88c4c99157be6595 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 16:20:42 +0200 Subject: [PATCH 125/319] formatting --- src/emsdevicevalue.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 526490789..9571218aa 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -110,15 +110,17 @@ class DeviceValue { // states of a device value enum DeviceValueState : uint8_t { + // low nibble active state of the device value DV_DEFAULT = 0, // 0 - does not yet have a value DV_ACTIVE = (1 << 0), // 1 - has a validated real value DV_HA_CONFIG_CREATED = (1 << 1), // 2 - set if the HA config topic has been created DV_HA_CLIMATE_NO_RT = (1 << 2), // 3 - climate created without roomTemp - // high nibble as mask for exclusions - DV_WEB_EXCLUDE = (1 << 4), // 16 - not shown on web - DV_API_MQTT_EXCLUDE = (1 << 5), // 32 - not shown on mqtt, API - DV_READONLY = (1 << 6), // 64 - read only - DV_FAVORITE = (1 << 7) // 128 - sort to front + + // high nibble as mask for exclusions & special functions + DV_WEB_EXCLUDE = (1 << 4), // 16 - not shown on web + DV_API_MQTT_EXCLUDE = (1 << 5), // 32 - not shown on mqtt, API + DV_READONLY = (1 << 6), // 64 - read only + DV_FAVORITE = (1 << 7) // 128 - sort to front }; uint8_t device_type; // EMSdevice::DeviceType From f80d7963334178136340c1d75fe38a2e5cdeb213 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 16:21:12 +0200 Subject: [PATCH 126/319] use mask flags --- .../src/project/SettingsCustomization.tsx | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 7e4daf26d..1bf5a5464 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -110,7 +110,7 @@ const SettingsCustomization: FC = () => { <> - Customize which entities to exclude from all all services (MQTT, API). This will have immediate effect. + Customize which entities to exclude. This will have immediate effect on all services including MQTT and API. { const saveCustomization = async () => { if (deviceEntities && selectedDevice) { - const exclude_entities = deviceEntities.filter((de) => de.x).map((new_de) => "07" + new_de.s); + const masked_entities = deviceEntities + .filter((de) => de.m) + .map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.s); try { - const response = await EMSESP.writeExcludeEntities({ + const response = await EMSESP.writeMaskedEntities({ id: selectedDevice, - entity_ids: exclude_entities + entity_ids: masked_entities }); if (response.status === 200) { enqueueSnackbar('Customization saved', { variant: 'success' }); @@ -160,11 +162,11 @@ const SettingsCustomization: FC = () => { return; } - const toggleDeviceEntity = (id: number) => { + const toggleDeviceEntity = (id: number, mask: number) => { setDeviceEntities( deviceEntities.map((o) => { if (o.i === id) { - return { ...o, x: !o.x }; + return { ...o, m: mask ^ o.m }; } return o; }) @@ -177,7 +179,7 @@ const SettingsCustomization: FC = () => { - ({deviceEntities.reduce((a, v) => (v.x ? a + 1 : a), 0)}/{deviceEntities.length}) + ({deviceEntities.reduce((a, de) => (de.m === 7 ? a + 1 : a), 0)}/{deviceEntities.length}) ENTITY NAME CODE @@ -188,10 +190,10 @@ const SettingsCustomization: FC = () => { {deviceEntities.map((de) => ( toggleDeviceEntity(de.i)} - sx={de.x ? { backgroundColor: '#f8696b' } : { backgroundColor: 'black' }} + onClick={() => toggleDeviceEntity(de.i, 7)} + sx={de.m === 7 ? { backgroundColor: '#f8696b' } : { backgroundColor: 'black' }} > - {de.x && } + {de.m === 7 && } {de.n} From f5bf566e66a91cfc3648d9df06ff3c3ac065f325 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 19:56:35 +0200 Subject: [PATCH 127/319] remove aria-label --- interface/src/framework/security/UserForm.tsx | 2 +- interface/src/project/DashboardData.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/framework/security/UserForm.tsx b/interface/src/framework/security/UserForm.tsx index 380e13652..4a82f08a9 100644 --- a/interface/src/framework/security/UserForm.tsx +++ b/interface/src/framework/security/UserForm.tsx @@ -46,7 +46,7 @@ const UserForm: FC = ({ creating, validator, user, setUser, onDon }; return ( -

+ {user && ( <> {creating ? 'Add' : 'Modify'} User diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index d53ebe68e..8d7b043b5 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -524,7 +524,7 @@ const DashboardData: FC = () => { sendCommand(dv)}> {dv.c && me.admin && ( - + )} @@ -569,7 +569,7 @@ const DashboardData: FC = () => { updateSensor(sensor_data)}> {me.admin && ( - + )} @@ -605,7 +605,7 @@ const DashboardData: FC = () => { updateAnalog(analog_data)}> {me.admin && ( - + )} From b331a07b69cd4339cfce3f6590119f260fdb0970 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 19:56:54 +0200 Subject: [PATCH 128/319] add masks to customize screen --- .../src/project/SettingsCustomization.tsx | 123 ++++++++++++------ mock-api/server.js | 29 ++--- 2 files changed, 97 insertions(+), 55 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 1bf5a5464..2705dfbad 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -12,7 +12,9 @@ import { Dialog, DialogActions, DialogContent, - DialogTitle + DialogTitle, + ToggleButton, + ToggleButtonGroup } from '@mui/material'; import TableCell, { tableCellClasses } from '@mui/material/TableCell'; @@ -22,8 +24,12 @@ import { styled } from '@mui/material/styles'; import { useSnackbar } from 'notistack'; import SaveIcon from '@mui/icons-material/Save'; -import CloseIcon from '@mui/icons-material/Close'; import CancelIcon from '@mui/icons-material/Cancel'; +import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; +import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; +import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; +import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; + import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; import { ButtonRow, FormLoader, ValidatedTextField, SectionContent } from '../components'; @@ -53,6 +59,7 @@ const SettingsCustomization: FC = () => { const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); const [confirmReset, setConfirmReset] = useState(false); + const [masks, setMasks] = useState(() => ['fav', 'readonly', 'exclude_mqtt', 'exclude_web']); const fetchDevices = useCallback(async () => { try { @@ -162,48 +169,86 @@ const SettingsCustomization: FC = () => { return; } - const toggleDeviceEntity = (id: number, mask: number) => { - setDeviceEntities( - deviceEntities.map((o) => { - if (o.i === id) { - return { ...o, m: mask ^ o.m }; - } - return o; - }) - ); + const setMask = (de: DeviceEntity, newMask: string[]) => { + var new_mask = 0; + if (newMask.includes('exclude_web')) { + new_mask |= 1; + } + if (newMask.includes('exclude_mqtt')) { + new_mask |= 2; + } + if (newMask.includes('readonly')) { + new_mask |= 4; + } + if (newMask.includes('fav')) { + new_mask |= 8; + } + + de.m = new_mask; + setMasks(newMask); + }; + + const getValue = (de: DeviceEntity) => { + var new_masks = []; + if ((de.m & 1) === 1) { + new_masks.push('exclude_web'); + } + if ((de.m & 2) === 2) { + new_masks.push('exclude_mqtt'); + } + if ((de.m & 4) === 4) { + new_masks.push('readonly'); + } + if ((de.m & 8) === 8) { + new_masks.push('fav'); + } + + return new_masks; }; return ( - <> - - - - - ({deviceEntities.reduce((a, de) => (de.m === 7 ? a + 1 : a), 0)}/{deviceEntities.length}) +
+ + + OPTIONS + ENTITY NAME (CODE) + VALUE + + + + {deviceEntities.map((de) => ( + + + { + setMask(de, mask); + }} + > + + + + + + + + + + + + + - ENTITY NAME - CODE - VALUE + + {de.n} ({de.s}) + + {formatValue(de.v)} - - - {deviceEntities.map((de) => ( - toggleDeviceEntity(de.i, 7)} - sx={de.m === 7 ? { backgroundColor: '#f8696b' } : { backgroundColor: 'black' }} - > - {de.m === 7 && } - - {de.n} - - {de.s} - {formatValue(de.v)} - - ))} - -
- + ))} + + ); }; diff --git a/mock-api/server.js b/mock-api/server.js index 22b414d00..5942773dd 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -574,21 +574,18 @@ const emsesp_devicedata_4 = { u: 1, n: 'hc2 selected room temperature', c: 'hc2/seltemp', - m: 0, }, { v: 18.6, u: 1, n: 'hc2 current room temperature', c: '', - m: 7, }, { v: 'off', u: 0, n: 'hc2 mode', c: 'hc2/mode', - m: 7, }, ], } @@ -637,14 +634,14 @@ const emsesp_deviceentities_2 = [ { v: 5, n: 'selected flow temperature', s: 'selflowtemp', m: 0, i: 3 }, { v: 0, n: 'burner selected max power', s: 'selburnpow', m: 0, i: 4 }, { v: 0, n: 'heating pump modulation', s: 'heatingpumpmod', m: 0, i: 5 }, - { n: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 7, i: 6 }, - { n: 'outside temperature', s: 'outdoortemp', m: 7, i: 7 }, + { n: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 2, i: 6 }, + { n: 'outside temperature', s: 'outdoortemp', m: 2, i: 7 }, { v: 53, n: 'current flow temperature', s: 'curflowtemp', m: 0, i: 8 }, { v: 51.8, n: 'return temperature', s: 'rettemp', m: 0, i: 9 }, - { n: 'mixing switch temperature', s: 'switchtemp', m: 7, i: 10 }, + { n: 'mixing switch temperature', s: 'switchtemp', m: 2, i: 10 }, { v: 1.3, n: 'system pressure', s: 'syspress', m: 0, i: 11 }, { v: 54.6, n: 'actual boiler temperature', s: 'boiltemp', m: 0, i: 12 }, - { n: 'exhaust temperature', s: 'exhausttemp', m: 7, i: 13 }, + { n: 'exhaust temperature', s: 'exhausttemp', m: 2, i: 13 }, { v: false, n: 'gas', s: 'burngas', m: 0, i: 14 }, { v: false, n: 'gas stage 2', s: 'burngas2', m: 0, i: 15 }, { v: 0, n: 'flame current', s: 'flamecurr', m: 0, i: 16 }, @@ -679,9 +676,9 @@ const emsesp_deviceentities_2 = [ { v: true, n: 'dhw turn on/off', s: 'wwtapactivated', m: 0, i: 45 }, { v: 62, n: 'dhw set temperature', s: 'wwsettemp', m: 0, i: 46 }, { v: 60, n: 'dhw selected temperature', s: 'wwseltemp', m: 0, i: 47 }, - { n: 'dhw selected lower temperature', s: 'wwseltemplow', m: 7, i: 48 }, - { n: 'dhw selected temperature for off', s: 'wwseltempoff', m: 7, i: 49 }, - { n: 'dhw single charge temperature', s: 'wwseltempsingle', m: 7, i: 50 }, + { n: 'dhw selected lower temperature', s: 'wwseltemplow', m: 2, i: 48 }, + { n: 'dhw selected temperature for off', s: 'wwseltempoff', m: 2, i: 49 }, + { n: 'dhw single charge temperature', s: 'wwseltempsingle', m: 2, i: 50 }, { v: 'flow', n: 'dhw type', s: 'wwtype', m: 0, i: 51 }, { v: 'hot', n: 'dhw comfort', s: 'wwcomfort', m: 0, i: 52 }, { v: 40, n: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0, i: 53 }, @@ -694,10 +691,10 @@ const emsesp_deviceentities_2 = [ { v: 'off', n: 'dhw circulation pump mode', s: 'wwcircmode', m: 0, i: 60 }, { v: false, n: 'dhw circulation active', s: 'wwcirc', m: 0, i: 61 }, { v: 46.4, n: 'dhw current intern temperature', s: 'wwcurtemp', m: 0, i: 62 }, - { n: 'dhw current extern temperature', s: 'wwcurtemp2', m: 7, i: 63 }, + { n: 'dhw current extern temperature', s: 'wwcurtemp2', m: 2, i: 63 }, { v: 0, n: 'dhw current tap water flow', s: 'wwcurflow', m: 0, i: 64 }, { v: 46.3, n: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0, i: 65 }, - { n: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 7, i: 66 }, + { n: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 2, i: 66 }, { v: true, n: 'dhw activated', s: 'wwactivated', m: 0, i: 67 }, { v: false, n: 'dhw one time charging', s: 'wwonetime', m: 0, i: 68 }, { v: false, n: 'dhw disinfecting', s: 'wwdisinfecting', m: 0, i: 69 }, @@ -707,8 +704,8 @@ const emsesp_deviceentities_2 = [ { v: false, n: 'dhw active', s: 'wwactive', m: 0, i: 73 }, { v: true, n: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0, i: 74 }, { v: 0, n: 'dhw set pump power', s: 'wwsetpumppower', m: 0, i: 75 }, - { n: 'dhw mixer temperature', s: 'wwmixertemp', m: 7, i: 76 }, - { n: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 7, i: 77 }, + { n: 'dhw mixer temperature', s: 'wwmixertemp', m: 2, i: 76 }, + { n: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 2, i: 77 }, { v: 288768, n: 'dhw starts', s: 'wwstarts', m: 0, i: 78 }, { v: 102151, n: 'dhw active time', s: 'wwworkm', m: 0, i: 79 }, ] @@ -724,14 +721,14 @@ const emsesp_deviceentities_4 = [ { n: 'hc2 current room temperature', s: 'hc2/curtemp', - m: 7, + m: 3, i: 2, }, { v: 'off', n: 'hc2 mode', s: 'hc2/mode', - m: 7, + m: 3, i: 3, }, ] From fdfc5e0e68c5c822e18c2e94b40b8d4982a3f2db Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 19:57:11 +0200 Subject: [PATCH 129/319] include name of device in options --- src/web/WebCustomizationService.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 21bc198ba..78a0616b5 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -175,9 +175,9 @@ void WebCustomizationService::devices(AsyncWebServerRequest * request) { uint8_t device_index = EMSESP::device_index(emsdevice->device_type(), emsdevice->unique_id()); if (device_index) { char s[10]; - obj["s"] = emsdevice->device_type_name() + Helpers::smallitoa(s, device_index); + obj["s"] = emsdevice->device_type_name() + Helpers::smallitoa(s, device_index) + " (" + emsdevice->name() + ")"; } else { - obj["s"] = emsdevice->device_type_name(); + obj["s"] = emsdevice->device_type_name() + " (" + emsdevice->name() + ")"; } } } From f7709e19fd3907f7810f1f0da48d69fc3441c08e Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 22:12:11 +0200 Subject: [PATCH 130/319] added w (Writable) to generate_values_web and sort by favorite --- src/emsdevice.cpp | 65 +++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index a3810236b..3e0b4348c 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -632,11 +632,16 @@ std::string EMSdevice::get_value_uom(const char * key) const { // prepare array of device values used for the WebUI // this is loosely based of the function generate_values used for the MQTT and Console // except additional data is stored in the JSON document needed for the Web UI like the UOM and command -// v = value, u=uom, n=name, c=cmd +// v=value, u=uom, n=name, c=cmd, h=help string, s=step, m=min, x=max void EMSdevice::generate_values_web(JsonObject & output) { output["label"] = to_string_short(); JsonArray data = output.createNestedArray("data"); + // sort the device values + std::sort(devicevalues_.begin(), devicevalues_.end(), [](const emsesp::DeviceValue & a, const emsesp::DeviceValue & b) { + return a.has_state(DeviceValueState::DV_FAVORITE); + }); + for (auto & dv : devicevalues_) { // check conditions: // 1. full_name cannot be empty @@ -752,32 +757,8 @@ void EMSdevice::generate_values_web(JsonObject & output) { } } -// reset all entities to being visible -// this is called before loading in the exclude entities list from the customization service -void EMSdevice::reset_entity_masks() { - for (auto & dv : devicevalues_) { - dv.state &= 0x0F; - } -} - -// disable/exclude/mask_out a device entity based on the id -void EMSdevice::mask_entity(std::string entity_id) { - // first character contains mask flags - uint8_t flag = Helpers::hextoint(entity_id.substr(0, 2).c_str()); - for (auto & dv : devicevalues_) { - std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); - if (entity == entity_id.substr(2)) { -#if defined(EMSESP_USE_SERIAL) - Serial.print("mask_entity() Removing Visible for device value: "); - Serial.println(read_flash_string(dv.full_name).c_str()); -#endif - dv.state = (dv.state & 0x0F) | (flag << 4); // set state high bits to flag, turn off active and ha flags - return; - } - } -} - // as generate_values_web() but stripped down to only show all entities and their state +// this is used only for WebCustomizationService::device_entities() void EMSdevice::generate_values_web_all(JsonArray & output) { for (auto & dv : devicevalues_) { // also show commands and entities that have an empty full name @@ -854,6 +835,7 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { } else { obj["n"] = "(hidden)"; } + // shortname if (dv.tag >= DeviceValueTAG::TAG_HC1) { obj["s"] = tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); @@ -861,11 +843,34 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { obj["s"] = dv.short_name; } - // send back the mask state. We're only interested in the high nibble - obj["m"] = dv.state >> 4; + obj["m"] = dv.state >> 4; // send back the mask state. We're only interested in the high nibble + obj["w"] = dv.has_cmd; // if writable + obj["i"] = dv.id; // add the unique ID + } +} - // add the unique ID - obj["i"] = dv.id; +// reset all entities to being visible +// this is called before loading in the exclude entities list from the customization service +void EMSdevice::reset_entity_masks() { + for (auto & dv : devicevalues_) { + dv.state &= 0x0F; + } +} + +// disable/exclude/mask_out a device entity based on the id +void EMSdevice::mask_entity(std::string entity_id) { + // first character contains mask flags + uint8_t flag = Helpers::hextoint(entity_id.substr(0, 2).c_str()); + for (auto & dv : devicevalues_) { + std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); + if (entity == entity_id.substr(2)) { +#if defined(EMSESP_USE_SERIAL) + Serial.print("mask_entity() Removing Visible for device value: "); + Serial.println(read_flash_string(dv.full_name).c_str()); +#endif + dv.state = (dv.state & 0x0F) | (flag << 4); // set state high bits to flag, turn off active and ha flags + return; + } } } From 821d7845f0da5ab3b69fcb070da616de40a64a88 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 22:12:21 +0200 Subject: [PATCH 131/319] updated b10 --- CHANGELOG_LATEST.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index a9088aebd..186abadbf 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -30,6 +30,7 @@ - sync time with thermostat [#386](https://github.com/emsesp/EMS-ESP32/issues/386), [#408](https://github.com/emsesp/EMS-ESP32/issues/408) - set mode has immediate effect [#395](https://github.com/emsesp/EMS-ESP32/issues/395) - min/max in web value setting +- Extend customization to select if an entity is to be shown in the WebUI or forced as read-only [#317](https://github.com/emsesp/EMS-ESP32/issues/317) ### Fixed From fe3e02cb2e232ba34dce3c39d0d2796aacfdb813 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 22:12:49 +0200 Subject: [PATCH 132/319] added tooltip --- .../src/project/SettingsCustomization.tsx | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 2705dfbad..bc245fe5b 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -14,7 +14,8 @@ import { DialogContent, DialogTitle, ToggleButton, - ToggleButtonGroup + ToggleButtonGroup, + Tooltip } from '@mui/material'; import TableCell, { tableCellClasses } from '@mui/material/TableCell'; @@ -29,7 +30,6 @@ import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; - import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; import { ButtonRow, FormLoader, ValidatedTextField, SectionContent } from '../components'; @@ -59,7 +59,7 @@ const SettingsCustomization: FC = () => { const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); const [confirmReset, setConfirmReset] = useState(false); - const [masks, setMasks] = useState(() => ['fav', 'readonly', 'exclude_mqtt', 'exclude_web']); + const [masks, setMasks] = useState(() => ['1']); const fetchDevices = useCallback(async () => { try { @@ -117,7 +117,8 @@ const SettingsCustomization: FC = () => { <> - Customize which entities to exclude. This will have immediate effect on all services including MQTT and API. + You can mark an entity as a favorite to be listed first in the Web Dashboard, or remove it from the + Dashboard, or disable it's write operation or exclude it from the MQTT and API outputs. { const setMask = (de: DeviceEntity, newMask: string[]) => { var new_mask = 0; - if (newMask.includes('exclude_web')) { + if (newMask.includes('1')) { new_mask |= 1; } - if (newMask.includes('exclude_mqtt')) { + if (newMask.includes('2')) { new_mask |= 2; } - if (newMask.includes('readonly')) { + if (newMask.includes('4')) { new_mask |= 4; } - if (newMask.includes('fav')) { + if (newMask.includes('8')) { new_mask |= 8; } @@ -188,19 +189,19 @@ const SettingsCustomization: FC = () => { setMasks(newMask); }; - const getValue = (de: DeviceEntity) => { + const getMask = (de: DeviceEntity) => { var new_masks = []; if ((de.m & 1) === 1) { - new_masks.push('exclude_web'); + new_masks.push('1'); } if ((de.m & 2) === 2) { - new_masks.push('exclude_mqtt'); + new_masks.push('2'); } if ((de.m & 4) === 4) { - new_masks.push('readonly'); + new_masks.push('4'); } if ((de.m & 8) === 8) { - new_masks.push('fav'); + new_masks.push('8'); } return new_masks; @@ -222,22 +223,30 @@ const SettingsCustomization: FC = () => { { setMask(de, mask); }} > - - + + + + - - + + + + - - + + + + - - + + + +
From 7a67577aa19a3c4482a2ada240d813c283e5ed09 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 22:13:04 +0200 Subject: [PATCH 133/319] added w (writeable) --- interface/src/project/types.ts | 1 + mock-api/server.js | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 5bcf45dad..f9537f1d1 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -147,6 +147,7 @@ export interface DeviceEntity { n: string; // name s: string; // shortname m: number; // mask + w?: boolean; // writeable i: number; // unique id } diff --git a/mock-api/server.js b/mock-api/server.js index 5942773dd..2539f9a54 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -344,19 +344,19 @@ const emsesp_devices = { i: 1, d: 23, p: 77, - s: 'Thermostat1', + s: 'Thermostat1 (RC20/Moduline 300)', }, { i: 2, d: 8, p: 123, - s: 'Boiler', + s: 'Boiler (Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i)', }, { i: 4, d: 16, p: 165, - s: 'Thermostat2', + s: 'Thermostat2 (RC100/Moduline 1000/1010)', }, ], } @@ -450,7 +450,7 @@ const status = { // Dashboard data const emsesp_devicedata_1 = { - label: 'RC20/Moduline 300', + label: 'Thermostat: RC20/Moduline 300', data: [ { v: '(0)', @@ -567,7 +567,7 @@ const emsesp_devicedata_2 = { } const emsesp_devicedata_4 = { - label: 'RC100/Moduline 1000/1010', + label: 'Thermostat: RC100/Moduline 1000/1010', data: [ { v: 16, @@ -610,6 +610,7 @@ const emsesp_deviceentities_1 = [ n: 'hc1 selected room temperature', s: 'hc1/seltemp', m: 0, + w: true, i: 3, }, { @@ -624,6 +625,7 @@ const emsesp_deviceentities_1 = [ n: 'hc1 mode', s: 'hc1/mode', m: 0, + w: true, i: 5, }, ] From f3b7d33372a0210c7006b83b60358b694d3906c8 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 22:13:13 +0200 Subject: [PATCH 134/319] bump b10 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index d5f57b3ce..bf2f94b81 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b9" +#define EMSESP_APP_VERSION "3.4.0b10" From 3853c6ca188d24c684e42e2edaa1f0ea6d2bbd1c Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 22:14:20 +0200 Subject: [PATCH 135/319] added tooltip back to be consistent with other table actions --- interface/src/project/DashboardData.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 8d7b043b5..eccda938c 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -20,7 +20,8 @@ import { ListItem, ListItemText, Grid, - useMediaQuery + useMediaQuery, + Tooltip } from '@mui/material'; import TableCell, { tableCellClasses } from '@mui/material/TableCell'; @@ -525,7 +526,9 @@ const DashboardData: FC = () => { {dv.c && me.admin && ( - + + + )} From ac7c7cee84dbf4bafbf0d6cc2b812019b8441db1 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 22:47:16 +0200 Subject: [PATCH 136/319] code optimizations --- src/emsdevice.cpp | 4 ++-- src/emsdevice.h | 2 +- src/test/test.cpp | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 3e0b4348c..a130bc57e 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -638,7 +638,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { JsonArray data = output.createNestedArray("data"); // sort the device values - std::sort(devicevalues_.begin(), devicevalues_.end(), [](const emsesp::DeviceValue & a, const emsesp::DeviceValue & b) { + std::sort(devicevalues_.begin(), devicevalues_.end(), [](const emsesp::DeviceValue & a, const emsesp::DeviceValue & b __attribute__((unused))) { return a.has_state(DeviceValueState::DV_FAVORITE); }); @@ -858,7 +858,7 @@ void EMSdevice::reset_entity_masks() { } // disable/exclude/mask_out a device entity based on the id -void EMSdevice::mask_entity(std::string entity_id) { +void EMSdevice::mask_entity(std::string & entity_id) { // first character contains mask flags uint8_t flag = Helpers::hextoint(entity_id.substr(0, 2).c_str()); for (auto & dv : devicevalues_) { diff --git a/src/emsdevice.h b/src/emsdevice.h index a521a042c..081f61bc1 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -183,7 +183,7 @@ class EMSdevice { char * show_telegram_handlers(char * result, const size_t len, const uint8_t handlers); void show_mqtt_handlers(uuid::console::Shell & shell) const; void list_device_entries(JsonObject & output) const; - void mask_entity(std::string entity_id); + void mask_entity(std::string & entity_id); void reset_entity_masks(); using process_function_p = std::function)>; diff --git a/src/test/test.cpp b/src/test/test.cpp index 960332c58..52e546ce4 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -609,7 +609,8 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const // toggle mode for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice->unique_id() == 1) { // boiler - emsdevice->mask_entity("07wwseltemp"); + std::string a = "07wwseltemp"; + emsdevice->mask_entity(a); break; } } From 3ddee386b26135fb8788c966fbcea544ad283591 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 23:16:02 +0200 Subject: [PATCH 137/319] code optimization --- src/emsdevice.cpp | 2 +- src/emsdevice.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index a130bc57e..5e8c44174 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -858,7 +858,7 @@ void EMSdevice::reset_entity_masks() { } // disable/exclude/mask_out a device entity based on the id -void EMSdevice::mask_entity(std::string & entity_id) { +void EMSdevice::mask_entity(const std::string & entity_id) { // first character contains mask flags uint8_t flag = Helpers::hextoint(entity_id.substr(0, 2).c_str()); for (auto & dv : devicevalues_) { diff --git a/src/emsdevice.h b/src/emsdevice.h index 081f61bc1..9f292169a 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -183,7 +183,7 @@ class EMSdevice { char * show_telegram_handlers(char * result, const size_t len, const uint8_t handlers); void show_mqtt_handlers(uuid::console::Shell & shell) const; void list_device_entries(JsonObject & output) const; - void mask_entity(std::string & entity_id); + void mask_entity(const std::string & entity_id); void reset_entity_masks(); using process_function_p = std::function)>; From 317cc8eeee3a3abe2d4121e89d7e0d3d6b5d3191 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 27 Mar 2022 23:16:12 +0200 Subject: [PATCH 138/319] ignore lint error so build works --- interface/src/project/SettingsCustomization.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index bc245fe5b..368ec39c9 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -59,6 +59,8 @@ const SettingsCustomization: FC = () => { const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); const [confirmReset, setConfirmReset] = useState(false); + + // eslint-disable-next-line const [masks, setMasks] = useState(() => ['1']); const fetchDevices = useCallback(async () => { From 2d8f97ff3595f0d5dd4920edf1b4b834145fb61a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 28 Mar 2022 09:47:56 +0200 Subject: [PATCH 139/319] fix #412, daylightsaving with manual time setting --- lib/framework/NTPSettingsService.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/framework/NTPSettingsService.cpp b/lib/framework/NTPSettingsService.cpp index e00a84c2b..efd5132ee 100644 --- a/lib/framework/NTPSettingsService.cpp +++ b/lib/framework/NTPSettingsService.cpp @@ -62,6 +62,7 @@ void NTPSettingsService::configureTime(AsyncWebServerRequest * request, JsonVari String timeLocal = json["local_time"]; char * s = strptime(timeLocal.c_str(), "%Y-%m-%dT%H:%M:%S", &tm); if (s != nullptr) { + tm.tm_isdst = -1; // not set by strptime, tells mktime to determine daylightsaving time_t time = mktime(&tm); struct timeval now = {.tv_sec = time}; settimeofday(&now, nullptr); From 3f68c0001e1d90853d63e5155eebf3eb0c396d82 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 28 Mar 2022 17:49:38 +0200 Subject: [PATCH 140/319] formatting --- src/mqtt.cpp | 6 +++--- src/web/WebCustomizationService.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 284cf9748..63e52670a 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -988,7 +988,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // create the topic, depending on the type and whether the device entity is writable (a command) // https://developers.home-assistant.io/docs/core/entity char topic[MQTT_TOPIC_MAX_SIZE]; - // if it's a command then we can use Number, Switch. Otherwise stick to Sensor + // if it's a command then we can use Number, Switch, Select. Otherwise stick to Sensor if (has_cmd) { switch (type) { case DeviceValueType::INT: @@ -996,13 +996,13 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, case DeviceValueType::SHORT: case DeviceValueType::USHORT: case DeviceValueType::ULONG: - // number - https://www.home-assistant.io/integrations/number.mqtt/ + // number - https://www.home-assistant.io/integrations/number.mqtt // https://developers.home-assistant.io/docs/core/entity/number snprintf(topic, sizeof(topic), "number/%s/%s/config", mqtt_base_.c_str(), uniq); break; case DeviceValueType::BOOL: - // switch - https://www.home-assistant.io/integrations/switch.mqtt/ + // switch - https://www.home-assistant.io/integrations/switch.mqtt snprintf(topic, sizeof(topic), "switch/%s/%s/config", mqtt_base_.c_str(), uniq); break; case DeviceValueType::ENUM: diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 78a0616b5..89cc6af8a 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -208,7 +208,7 @@ void WebCustomizationService::device_entities(AsyncWebServerRequest * request, J request->send(response); } -// takes a list of masked ids send from the webUI +// takes a list of masked ids sent from the webUI // saves it in the customization service // and updates the entity list real-time void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, JsonVariant & json) { From cf10791c9504b28d86e218734856a9232d90c0d0 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 28 Mar 2022 17:49:57 +0200 Subject: [PATCH 141/319] remove tooltip, add icons for fav and cmd --- interface/src/project/DashboardData.tsx | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index eccda938c..4023227fc 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -20,8 +20,7 @@ import { ListItem, ListItemText, Grid, - useMediaQuery, - Tooltip + useMediaQuery } from '@mui/material'; import TableCell, { tableCellClasses } from '@mui/material/TableCell'; @@ -38,6 +37,8 @@ import CancelIcon from '@mui/icons-material/Cancel'; import SendIcon from '@mui/icons-material/TrendingFlat'; import SaveIcon from '@mui/icons-material/Save'; import RemoveIcon from '@mui/icons-material/RemoveCircleOutline'; +import FavoriteIcon from '@mui/icons-material/Favorite'; +import PlayArrowIcon from '@mui/icons-material/PlayArrow'; import DeviceIcon from './DeviceIcon'; @@ -219,7 +220,7 @@ const DashboardData: FC = () => { {deviceValue.l && ( { {!deviceValue.l && ( { }; const renderNameCell = (dv: DeviceValue) => { + var mask = Number(dv.n.slice(0, 2)); + var name = dv.n.slice(2); if (dv.v === undefined && dv.c) { return ( - - command: {dv.n} + + {name}  + ); } + + if ((mask & 8) === 8) { + return ( + + {name}  + + + ); + } + return ( - {dv.n} + {name} ); }; @@ -526,9 +540,7 @@ const DashboardData: FC = () => { {dv.c && me.admin && ( - - - + )} From bad6346e7aac0b57478420ac5f24cc4216dbead8 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 28 Mar 2022 17:50:06 +0200 Subject: [PATCH 142/319] update test data --- mock-api/server.js | 164 ++++++++++++++++++++++----------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/mock-api/server.js b/mock-api/server.js index 2539f9a54..e227eda81 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -455,31 +455,31 @@ const emsesp_devicedata_1 = { { v: '(0)', u: 0, - n: 'error code', + n: '00error code', c: '', }, { v: '14:54:39 06/06/2021', u: 0, - n: 'date/time', + n: '00date/time', c: '', }, { v: 18, u: 1, - n: 'hc1 selected room temperature', + n: '00hc1 selected room temperature', c: 'hc1/seltemp', }, { v: 22.6, u: 1, - n: 'hc1 current room temperature', + n: '00hc1 current room temperature', c: '', }, { v: 'auto', u: 0, - n: 'hc1 mode', + n: '00hc1 mode', c: 'hc1/mode', }, ], @@ -488,81 +488,81 @@ const emsesp_devicedata_1 = { const emsesp_devicedata_2 = { label: 'Boiler: Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i', data: [ - { u: 0, n: 'reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, - { v: 'false', u: 0, n: 'heating active' }, - { v: 'false', u: 0, n: 'tapwater active' }, - { v: 5, u: 1, n: 'selected flow temperature', c: 'selflowtemp' }, - { v: 0, u: 3, n: 'burner selected max power', c: 'selburnpow' }, - { v: 0, u: 3, n: 'heating pump modulation' }, - { v: 53.4, u: 1, n: 'current flow temperature' }, - { v: 52.7, u: 1, n: 'return temperature' }, - { v: 1.3, u: 10, n: 'system pressure' }, - { v: 54.9, u: 1, n: 'actual boiler temperature' }, - { v: 'false', u: 0, n: 'gas' }, - { v: 'false', u: 0, n: 'gas stage 2' }, - { v: 0, u: 9, n: 'flame current' }, - { v: 'false', u: 0, n: 'heating pump' }, - { v: 'false', u: 0, n: 'fan' }, - { v: 'false', u: 0, n: 'ignition' }, - { v: 'false', u: 0, n: 'oil preheating' }, - { v: 'true', u: 0, n: 'heating activated', c: 'heatingactivated', l: ['off', 'on'] }, - { v: 80, u: 1, n: 'heating temperature', c: 'heatingtemp' }, - { v: 70, u: 3, n: 'burner pump max power', c: 'pumpmodmax' }, - { v: 30, u: 3, n: 'burner pump min power', c: 'pumpmodmin' }, - { v: 1, u: 8, n: 'pump delay', c: 'pumpdelay' }, - { v: 10, u: 8, n: 'burner min period', c: 'burnminperiod' }, - { v: 0, u: 3, n: 'burner min power', c: 'burnminpower' }, - { v: 50, u: 3, n: 'burner max power', c: 'burnmaxpower' }, - { v: -6, u: 2, n: 'hysteresis on temperature', c: 'boilhyston' }, - { v: 6, u: 2, n: 'hysteresis off temperature', c: 'boilhystoff' }, - { v: 0, u: 1, n: 'set flow temperature' }, - { v: 0, u: 3, n: 'burner set power' }, - { v: 0, u: 3, n: 'burner current power' }, - { v: 326323, u: 0, n: 'burner starts' }, - { v: 553437, u: 8, n: 'total burner operating time' }, - { v: 451286, u: 8, n: 'total heat operating time' }, - { v: 4672173, u: 8, n: 'total UBA operating time' }, - { v: '1C(210) 06.06.2020 12:07 (0 min)', u: 0, n: 'last error code' }, - { v: '0H', u: 0, n: 'service code' }, - { v: 203, u: 0, n: 'service code number' }, - { v: 'H00', u: 0, n: 'maintenance message' }, - { v: 'manual', u: 0, n: 'maintenance scheduled', c: 'maintenance', l: ['off', 'time', 'date', 'manual'] }, - { v: 6000, u: 7, n: 'time to next maintenance', c: 'maintenancetime' }, - { v: '01.01.2012', u: 0, n: 'next maintenance date', c: 'maintenancedate', o: 'Format: < dd.mm.yyyy >' }, - { v: 'true', u: 0, n: 'dhw turn on/off', c: 'wwtapactivated', l: ['off', 'on'] }, - { v: 62, u: 1, n: 'dhw set temperature' }, - { v: 60, u: 1, n: 'dhw selected temperature', c: 'wwseltemp' }, - { v: 'flow', u: 0, n: 'dhw type' }, - { v: 'hot', u: 0, n: 'dhw comfort', c: 'wwcomfort', l: ['hot', 'eco', 'intelligent'] }, - { v: 40, u: 2, n: 'dhw flow temperature offset', c: 'wwflowtempoffset' }, - { v: 100, u: 3, n: 'dhw max power', c: 'wwmaxpower' }, - { v: 'false', u: 0, n: 'dhw circulation pump available', c: 'wwcircpump', l: ['off', 'on'] }, - { v: '3-way valve', u: 0, n: 'dhw charging type' }, - { v: -5, u: 2, n: 'dhw hysteresis on temperature', c: 'wwhyston' }, - { v: 0, u: 2, n: 'dhw hysteresis off temperature', c: 'wwhystoff' }, - { v: 70, u: 1, n: 'dhw disinfection temperature', c: 'wwdisinfectiontemp' }, + { v: 'false', u: 0, n: '08heating active' }, + { v: 'false', u: 0, n: '08tapwater active' }, + { u: 0, n: '00reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, + { v: 5, u: 1, n: '00selected flow temperature', c: 'selflowtemp' }, + { v: 0, u: 3, n: '00burner selected max power', c: 'selburnpow' }, + { v: 0, u: 3, n: '00heating pump modulation' }, + { v: 53.4, u: 1, n: '00current flow temperature' }, + { v: 52.7, u: 1, n: '00return temperature' }, + { v: 1.3, u: 10, n: '00system pressure' }, + { v: 54.9, u: 1, n: '00actual boiler temperature' }, + { v: 'false', u: 0, n: '00gas' }, + { v: 'false', u: 0, n: '00gas stage 2' }, + { v: 0, u: 9, n: '00flame current' }, + { v: 'false', u: 0, n: '00heating pump' }, + { v: 'false', u: 0, n: '00fan' }, + { v: 'false', u: 0, n: '00ignition' }, + { v: 'false', u: 0, n: '00oil preheating' }, + { v: 'true', u: 0, n: '00heating activated', c: 'heatingactivated', l: ['off', 'on'] }, + { v: 80, u: 1, n: '00heating temperature', c: 'heatingtemp' }, + { v: 70, u: 3, n: '00burner pump max power', c: 'pumpmodmax' }, + { v: 30, u: 3, n: '00burner pump min power', c: 'pumpmodmin' }, + { v: 1, u: 8, n: '00pump delay', c: 'pumpdelay' }, + { v: 10, u: 8, n: '00burner min period', c: 'burnminperiod' }, + { v: 0, u: 3, n: '00burner min power', c: 'burnminpower' }, + { v: 50, u: 3, n: '00burner max power', c: 'burnmaxpower' }, + { v: -6, u: 2, n: '00hysteresis on temperature', c: 'boilhyston' }, + { v: 6, u: 2, n: '00hysteresis off temperature', c: 'boilhystoff' }, + { v: 0, u: 1, n: '00set flow temperature' }, + { v: 0, u: 3, n: '00burner set power' }, + { v: 0, u: 3, n: '00burner current power' }, + { v: 326323, u: 0, n: '00burner starts' }, + { v: 553437, u: 8, n: '00total burner operating time' }, + { v: 451286, u: 8, n: '00total heat operating time' }, + { v: 4672173, u: 8, n: '00total UBA operating time' }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', u: 0, n: '00last error code' }, + { v: '0H', u: 0, n: '00service code' }, + { v: 203, u: 0, n: '00service code number' }, + { v: 'H00', u: 0, n: '00maintenance message' }, + { v: 'manual', u: 0, n: '00maintenance scheduled', c: 'maintenance', l: ['off', 'time', 'date', 'manual'] }, + { v: 6000, u: 7, n: '00time to next maintenance', c: 'maintenancetime' }, + { v: '01.01.2012', u: 0, n: '00next maintenance date', c: 'maintenancedate', o: 'Format: < dd.mm.yyyy >' }, + { v: 'true', u: 0, n: '00dhw turn on/off', c: 'wwtapactivated', l: ['off', 'on'] }, + { v: 62, u: 1, n: '00dhw set temperature' }, + { v: 60, u: 1, n: '00dhw selected temperature', c: 'wwseltemp' }, + { v: 'flow', u: 0, n: '00dhw type' }, + { v: 'hot', u: 0, n: '00dhw comfort', c: 'wwcomfort', l: ['hot', 'eco', 'intelligent'] }, + { v: 40, u: 2, n: '00dhw flow temperature offset', c: 'wwflowtempoffset' }, + { v: 100, u: 3, n: '00dhw max power', c: 'wwmaxpower' }, + { v: 'false', u: 0, n: '00dhw circulation pump available', c: 'wwcircpump', l: ['off', 'on'] }, + { v: '3-way valve', u: 0, n: '00dhw charging type' }, + { v: -5, u: 2, n: '00dhw hysteresis on temperature', c: 'wwhyston' }, + { v: 0, u: 2, n: '00dhw hysteresis off temperature', c: 'wwhystoff' }, + { v: 70, u: 1, n: '00dhw disinfection temperature', c: 'wwdisinfectiontemp' }, { v: 'off', u: 0, - n: 'dhw circulation pump mode', + n: '00dhw circulation pump mode', c: 'wwcircmode', l: ['off', '1x3min', '2x3min', '3x3min', '4x3min', '5x3min', '6x3min', 'continuous'], }, - { v: 'false', u: 0, n: 'dhw circulation active', c: 'wwcirc', l: ['off', 'on'] }, - { v: 47.3, u: 1, n: 'dhw current intern temperature' }, - { v: 0, u: 4, n: 'dhw current tap water flow' }, - { v: 47.3, u: 1, n: 'dhw storage intern temperature' }, - { v: 'true', u: 0, n: 'dhw activated', c: 'wwactivated', l: ['off', 'on'] }, - { v: 'false', u: 0, n: 'dhw one time charging', c: 'wwonetime', l: ['off', 'on'] }, - { v: 'false', u: 0, n: 'dhw disinfecting', c: 'wwdisinfecting', l: ['off', 'on'] }, - { v: 'false', u: 0, n: 'dhw charging' }, - { v: 'false', u: 0, n: 'dhw recharging' }, - { v: 'true', u: 0, n: 'dhw temperature ok' }, - { v: 'false', u: 0, n: 'dhw active' }, - { v: 'true', u: 0, n: 'dhw 3way valve active' }, - { v: 0, u: 3, n: 'dhw set pump power' }, - { v: 288768, u: 0, n: 'dhw starts' }, - { v: 102151, u: 8, n: 'dhw active time' }, + { v: 'false', u: 0, n: '00dhw circulation active', c: 'wwcirc', l: ['off', 'on'] }, + { v: 47.3, u: 1, n: '00dhw current intern temperature' }, + { v: 0, u: 4, n: '00dhw current tap water flow' }, + { v: 47.3, u: 1, n: '00dhw storage intern temperature' }, + { v: 'true', u: 0, n: '00dhw activated', c: 'wwactivated', l: ['off', 'on'] }, + { v: 'false', u: 0, n: '00dhw one time charging', c: 'wwonetime', l: ['off', 'on'] }, + { v: 'false', u: 0, n: '00dhw disinfecting', c: 'wwdisinfecting', l: ['off', 'on'] }, + { v: 'false', u: 0, n: '00dhw charging' }, + { v: 'false', u: 0, n: '00dhw recharging' }, + { v: 'true', u: 0, n: '00dhw temperature ok' }, + { v: 'false', u: 0, n: '00dhw active' }, + { v: 'true', u: 0, n: '00dhw 3way valve active' }, + { v: 0, u: 3, n: '00dhw set pump power' }, + { v: 288768, u: 0, n: '00dhw starts' }, + { v: 102151, u: 8, n: '00dhw active time' }, ], } @@ -572,19 +572,19 @@ const emsesp_devicedata_4 = { { v: 16, u: 1, - n: 'hc2 selected room temperature', + n: '00hc2 selected room temperature', c: 'hc2/seltemp', }, { v: 18.6, u: 1, - n: 'hc2 current room temperature', + n: '00hc2 current room temperature', c: '', }, { v: 'off', u: 0, - n: 'hc2 mode', + n: '00hc2 mode', c: 'hc2/mode', }, ], @@ -593,21 +593,21 @@ const emsesp_devicedata_4 = { const emsesp_deviceentities_1 = [ { v: '(0)', - n: 'error code', + n: '00error code', s: 'errorcode', m: 0, i: 1, }, { v: '14:54:39 06/06/2021', - n: 'date/time', + n: '00date/time', s: 'datetime', m: 0, i: 2, }, { v: 18.22, - n: 'hc1 selected room temperature', + n: '00hc1 selected room temperature', s: 'hc1/seltemp', m: 0, w: true, @@ -615,14 +615,14 @@ const emsesp_deviceentities_1 = [ }, { v: 22.6, - n: 'hc1 current room temperature', + n: '00hc1 current room temperature', s: 'hc1/curtemp', m: 0, i: 4, }, { v: 'auto', - n: 'hc1 mode', + n: '00hc1 mode', s: 'hc1/mode', m: 0, w: true, From 592c5ca7783ce7f7d6297ccd4f310c3bfe1127dd Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 28 Mar 2022 17:50:33 +0200 Subject: [PATCH 143/319] fix devicevalue sorting the Michael way (thanks) --- src/emsdevice.cpp | 209 +++++++++++++++++++++++----------------------- 1 file changed, 103 insertions(+), 106 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 5e8c44174..ca5e147ae 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -637,119 +637,116 @@ void EMSdevice::generate_values_web(JsonObject & output) { output["label"] = to_string_short(); JsonArray data = output.createNestedArray("data"); - // sort the device values - std::sort(devicevalues_.begin(), devicevalues_.end(), [](const emsesp::DeviceValue & a, const emsesp::DeviceValue & b __attribute__((unused))) { - return a.has_state(DeviceValueState::DV_FAVORITE); - }); + // do two passes. First for all entities marked as favourites, then for all others. This sorts the list. + for (uint8_t i = 0; i < 2; i++) { + for (auto & dv : devicevalues_) { + bool state = (!i && dv.has_state(DeviceValueState::DV_FAVORITE)) || (i && !dv.has_state(DeviceValueState::DV_FAVORITE)); + if (state && (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD)))) { + JsonObject obj = data.createNestedObject(); // create the object, we know there is a value + uint8_t fahrenheit = 0; - for (auto & dv : devicevalues_) { - // check conditions: - // 1. full_name cannot be empty - // 2. it must have a valid value, if it is not a command like 'reset' + // handle Booleans (true, false) + if (dv.type == DeviceValueType::BOOL) { + bool value_b = *(bool *)(dv.value_p); + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { + obj["v"] = value_b ? "true" : "false"; + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + obj["v"] = value_b ? 1 : 0; + } else { + char s[7]; + obj["v"] = Helpers::render_boolean(s, value_b); + } + } - if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { - JsonObject obj = data.createNestedObject(); // create the object, we know there is a value - uint8_t fahrenheit = 0; + // handle TEXT strings + else if (dv.type == DeviceValueType::STRING) { + obj["v"] = (char *)(dv.value_p); + } - // handle Booleans (true, false) - if (dv.type == DeviceValueType::BOOL) { - bool value_b = *(bool *)(dv.value_p); - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - obj["v"] = value_b ? "true" : "false"; - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - obj["v"] = value_b ? 1 : 0; + // handle ENUMs + else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { + obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; + } + + // handle numbers + else { + // If a divider is specified, do the division to 2 decimals places and send back as double/float + // otherwise force as an integer whole + // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler + int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; + + if ((dv.type == DeviceValueType::INT) && Helpers::hasValue(*(int8_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::UINT) && Helpers::hasValue(*(uint8_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::SHORT) && Helpers::hasValue(*(int16_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::USHORT) && Helpers::hasValue(*(uint16_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::ULONG) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint32_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { + uint32_t time_value = *(uint32_t *)(dv.value_p); + obj["v"] = (divider > 0) ? time_value / divider : time_value; // sometimes we need to divide by 60 + } + } + + // add the unit of measure (uom) + obj["u"] = fahrenheit ? (uint8_t)DeviceValueUOM::FAHRENHEIT : dv.uom; + + auto mask = Helpers::hextoa((uint8_t)(dv.state >> 4), false); // create mask to a 2-char string + + // add name, prefixing the tag if it exists + if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { + obj["n"] = mask + read_flash_string(dv.full_name); + } else if (dv.tag < DeviceValueTAG::TAG_HC1) { + obj["n"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); } else { - char s[7]; - obj["v"] = Helpers::render_boolean(s, value_b); + obj["n"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); } - } - // handle TEXT strings - else if (dv.type == DeviceValueType::STRING) { - obj["v"] = (char *)(dv.value_p); - } - - // handle ENUMs - else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { - obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; - } - - // handle numbers - else { - // If a divider is specified, do the division to 2 decimals places and send back as double/float - // otherwise force as an integer whole - // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler - int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; - fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; - - if ((dv.type == DeviceValueType::INT) && Helpers::hasValue(*(int8_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::UINT) && Helpers::hasValue(*(uint8_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::SHORT) && Helpers::hasValue(*(int16_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::USHORT) && Helpers::hasValue(*(uint16_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::ULONG) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint32_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - uint32_t time_value = *(uint32_t *)(dv.value_p); - obj["v"] = (divider > 0) ? time_value / divider : time_value; // sometimes we need to divide by 60 - } - } - - // add the unit of measure (uom) - obj["u"] = fahrenheit ? (uint8_t)DeviceValueUOM::FAHRENHEIT : dv.uom; - - // add name, prefixing the tag if it exists - if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - obj["n"] = dv.full_name; - } else if (dv.tag < DeviceValueTAG::TAG_HC1) { - obj["n"] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); - } else { - obj["n"] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); - } - - // add commands and options - if (dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY)) { - // add the name of the Command function - if (dv.tag >= DeviceValueTAG::TAG_HC1) { - obj["c"] = tag_to_mqtt(dv.tag) + "/" + read_flash_string(dv.short_name); - } else { - obj["c"] = dv.short_name; - } - // add the Command options - if (dv.type == DeviceValueType::ENUM || (dv.type == DeviceValueType::CMD && dv.options_size > 1)) { - JsonArray l = obj.createNestedArray("l"); - for (uint8_t i = 0; i < dv.options_size; i++) { - if (!read_flash_string(dv.options[i]).empty()) { - l.add(read_flash_string(dv.options[i])); + // add commands and options + if (dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY)) { + // add the name of the Command function + if (dv.tag >= DeviceValueTAG::TAG_HC1) { + obj["c"] = tag_to_mqtt(dv.tag) + "/" + read_flash_string(dv.short_name); + } else { + obj["c"] = dv.short_name; + } + // add the Command options + if (dv.type == DeviceValueType::ENUM || (dv.type == DeviceValueType::CMD && dv.options_size > 1)) { + JsonArray l = obj.createNestedArray("l"); + for (uint8_t i = 0; i < dv.options_size; i++) { + if (!read_flash_string(dv.options[i]).empty()) { + l.add(read_flash_string(dv.options[i])); + } + } + } else if (dv.type == DeviceValueType::BOOL) { + JsonArray l = obj.createNestedArray("l"); + l.add("off"); + l.add("on"); + } + // add command help template + else if (dv.type == DeviceValueType::STRING || dv.type == DeviceValueType::CMD) { + if (dv.options_size == 1) { + obj["h"] = dv.options[0]; } } - } else if (dv.type == DeviceValueType::BOOL) { - JsonArray l = obj.createNestedArray("l"); - l.add("off"); - l.add("on"); - } - // add command help template - else if (dv.type == DeviceValueType::STRING || dv.type == DeviceValueType::CMD) { - if (dv.options_size == 1) { - obj["h"] = dv.options[0]; - } - } - // add steps to numeric values with divider/multiplier - else { - int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; - char s[10]; - if (divider > 0) { - obj["s"] = Helpers::render_value(s, (float)1 / divider, 1); - } else if (divider < 0) { - obj["s"] = Helpers::render_value(s, (-1) * divider, 0); - } - int16_t dv_set_min, dv_set_max; - if (dv.get_min_max(dv_set_min, dv_set_max)) { - obj["m"] = Helpers::render_value(s, dv_set_min, 0); - obj["x"] = Helpers::render_value(s, dv_set_max, 0); + // add steps to numeric values with divider/multiplier + else { + int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + char s[10]; + if (divider > 0) { + obj["s"] = Helpers::render_value(s, (float)1 / divider, 1); + } else if (divider < 0) { + obj["s"] = Helpers::render_value(s, (-1) * divider, 0); + } + int16_t dv_set_min, dv_set_max; + if (dv.get_min_max(dv_set_min, dv_set_max)) { + obj["m"] = Helpers::render_value(s, dv_set_min, 0); + obj["x"] = Helpers::render_value(s, dv_set_max, 0); + } } } } @@ -853,7 +850,7 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { // this is called before loading in the exclude entities list from the customization service void EMSdevice::reset_entity_masks() { for (auto & dv : devicevalues_) { - dv.state &= 0x0F; + dv.state &= 0x0F; // clear high nibble } } From 1cc031b27b224661a1936f26991413a0bed6c08a Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 28 Mar 2022 17:50:51 +0200 Subject: [PATCH 144/319] minor optimizations --- .../src/project/SettingsCustomization.tsx | 47 +++++++------------ 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 368ec39c9..baf3a7480 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -14,8 +14,7 @@ import { DialogContent, DialogTitle, ToggleButton, - ToggleButtonGroup, - Tooltip + ToggleButtonGroup } from '@mui/material'; import TableCell, { tableCellClasses } from '@mui/material/TableCell'; @@ -117,10 +116,14 @@ const SettingsCustomization: FC = () => { return ( <> - + - You can mark an entity as a favorite to be listed first in the Web Dashboard, or remove it from the - Dashboard, or disable it's write operation or exclude it from the MQTT and API outputs. + You can mark an entity as a favorite to be listed first in the Dashboard ( + ) ,or remove it entirely from the Dashboard ( + ) ,or disable it's write operation ( + ) or have it excluded from the MQTT and API outputs ( + + ). { const setMask = (de: DeviceEntity, newMask: string[]) => { var new_mask = 0; - if (newMask.includes('1')) { - new_mask |= 1; + for (let entry of newMask) { + new_mask |= Number(entry); } - if (newMask.includes('2')) { - new_mask |= 2; - } - if (newMask.includes('4')) { - new_mask |= 4; - } - if (newMask.includes('8')) { - new_mask |= 8; - } - de.m = new_mask; setMasks(newMask); }; @@ -220,35 +213,27 @@ const SettingsCustomization: FC = () => { {deviceEntities.map((de) => ( - + { setMask(de, mask); }} > - - - + - - - + - - - + - - - + From 86430c640824496fa68546b55aa719efc8801606 Mon Sep 17 00:00:00 2001 From: proddy Date: Mon, 28 Mar 2022 17:52:07 +0200 Subject: [PATCH 145/319] updated packages --- interface/package-lock.json | 92 +++++++++++++++++++------------------ interface/package.json | 2 +- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index fe89c4fac..313bff332 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -12,7 +12,7 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.5.1", - "@mui/material": "^5.5.2", + "@mui/material": "^5.5.3", "@types/lodash": "^4.14.180", "@types/node": "^17.0.23", "@types/react": "^17.0.43", @@ -2849,13 +2849,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.73", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.73.tgz", - "integrity": "sha512-TEUCIIEAWrngAqpIa+dY3nofGSNj70LC3KC9WcCzyXPK3M4AG2GNi7ndd/g/0DtC55kbxrudzlV8TG3vrB2Vjw==", + "version": "5.0.0-alpha.74", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.74.tgz", + "integrity": "sha512-pw3T1xNXpW8pLo9+BvtyazZb0CSjNJsjbzznlbV/aNkBfjNPXQVI3X1NDm3WSI8y6M96WDIVO7XrHAohOwALSQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", - "@mui/utils": "^5.4.4", + "@mui/types": "^7.1.3", + "@mui/utils": "^5.5.3", "@popperjs/core": "^2.11.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -2905,15 +2906,15 @@ } }, "node_modules/@mui/material": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.2.tgz", - "integrity": "sha512-r4p1u9eDlSqW3TS/Iq9yolifWHpuW6e0BSeqEJW3EEIcKfPVVk4WNUNJ+s8DtN7dBoDcveXxcQVVjYXTIv1d9g==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.3.tgz", + "integrity": "sha512-eADa3kUYbbr1jNjcufn0a7HeU8cSo0agbrkj720hodxVFNIfzq7a2e58Z+PaZqll55kMGBvlYJ7rTcXU399x5A==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.73", - "@mui/system": "^5.5.2", + "@mui/base": "5.0.0-alpha.74", + "@mui/system": "^5.5.3", "@mui/types": "^7.1.3", - "@mui/utils": "^5.4.4", + "@mui/utils": "^5.5.3", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -2949,12 +2950,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.4.tgz", - "integrity": "sha512-V/gxttr6736yJoU9q+4xxXsa0K/w9Hn9pg99zsOHt7i/O904w2CX5NHh5WqDXtoUzVcayLF0RB17yr6l79CE+A==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.5.3.tgz", + "integrity": "sha512-Wf7NurY7lk8SBWelSBY2U02zxLt1773JpIcXTHuEC9/GZdQA4CXCJGl2cVQzheKhee5rZ+8JwGulrRiVl1m+4A==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.4.4", + "@mui/utils": "^5.5.3", "prop-types": "^15.7.2" }, "engines": { @@ -3005,15 +3006,15 @@ } }, "node_modules/@mui/system": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.2.tgz", - "integrity": "sha512-OATYFI36nliud8xh0u+ZNqDo0jWjxpO0vZLlzqNB+ZtkR5Q/+1X3GgboA9ruiB8Rq+udnJlMBQNGW0qqjvAOHQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.3.tgz", + "integrity": "sha512-J9JcySJuEqfEoP334K/2gEWm2vOx73Uqjii3qlFVhWRBOAJ0Pjyk0sN5W/eVRbwhUm95DNgh2V5s8dRK3vzyVw==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.4.4", + "@mui/private-theming": "^5.5.3", "@mui/styled-engine": "^5.5.2", "@mui/types": "^7.1.3", - "@mui/utils": "^5.4.4", + "@mui/utils": "^5.5.3", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.7.2" @@ -3057,9 +3058,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.4.tgz", - "integrity": "sha512-hfYIXEuhc2mXMGN5nUPis8beH6uE/zl3uMWJcyHX0/LN/+QxO9zhYuV6l8AsAaphHFyS/fBv0SW3Nid7jw5hKQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.5.3.tgz", + "integrity": "sha512-t627eVRpl3SlxVya0cIVNs8jPl4KCEiGaTSWY9iKKTcMNaeDbuRML+zv/CFHDPr1zFv+FjJSP02ySB+tZ8xIag==", "dependencies": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", @@ -19706,13 +19707,14 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.73", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.73.tgz", - "integrity": "sha512-TEUCIIEAWrngAqpIa+dY3nofGSNj70LC3KC9WcCzyXPK3M4AG2GNi7ndd/g/0DtC55kbxrudzlV8TG3vrB2Vjw==", + "version": "5.0.0-alpha.74", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.74.tgz", + "integrity": "sha512-pw3T1xNXpW8pLo9+BvtyazZb0CSjNJsjbzznlbV/aNkBfjNPXQVI3X1NDm3WSI8y6M96WDIVO7XrHAohOwALSQ==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", - "@mui/utils": "^5.4.4", + "@mui/types": "^7.1.3", + "@mui/utils": "^5.5.3", "@popperjs/core": "^2.11.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -19728,15 +19730,15 @@ } }, "@mui/material": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.2.tgz", - "integrity": "sha512-r4p1u9eDlSqW3TS/Iq9yolifWHpuW6e0BSeqEJW3EEIcKfPVVk4WNUNJ+s8DtN7dBoDcveXxcQVVjYXTIv1d9g==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.3.tgz", + "integrity": "sha512-eADa3kUYbbr1jNjcufn0a7HeU8cSo0agbrkj720hodxVFNIfzq7a2e58Z+PaZqll55kMGBvlYJ7rTcXU399x5A==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.73", - "@mui/system": "^5.5.2", + "@mui/base": "5.0.0-alpha.74", + "@mui/system": "^5.5.3", "@mui/types": "^7.1.3", - "@mui/utils": "^5.4.4", + "@mui/utils": "^5.5.3", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -19747,12 +19749,12 @@ } }, "@mui/private-theming": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.4.tgz", - "integrity": "sha512-V/gxttr6736yJoU9q+4xxXsa0K/w9Hn9pg99zsOHt7i/O904w2CX5NHh5WqDXtoUzVcayLF0RB17yr6l79CE+A==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.5.3.tgz", + "integrity": "sha512-Wf7NurY7lk8SBWelSBY2U02zxLt1773JpIcXTHuEC9/GZdQA4CXCJGl2cVQzheKhee5rZ+8JwGulrRiVl1m+4A==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.4.4", + "@mui/utils": "^5.5.3", "prop-types": "^15.7.2" } }, @@ -19767,15 +19769,15 @@ } }, "@mui/system": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.2.tgz", - "integrity": "sha512-OATYFI36nliud8xh0u+ZNqDo0jWjxpO0vZLlzqNB+ZtkR5Q/+1X3GgboA9ruiB8Rq+udnJlMBQNGW0qqjvAOHQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.3.tgz", + "integrity": "sha512-J9JcySJuEqfEoP334K/2gEWm2vOx73Uqjii3qlFVhWRBOAJ0Pjyk0sN5W/eVRbwhUm95DNgh2V5s8dRK3vzyVw==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.4.4", + "@mui/private-theming": "^5.5.3", "@mui/styled-engine": "^5.5.2", "@mui/types": "^7.1.3", - "@mui/utils": "^5.4.4", + "@mui/utils": "^5.5.3", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.7.2" @@ -19788,9 +19790,9 @@ "requires": {} }, "@mui/utils": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.4.tgz", - "integrity": "sha512-hfYIXEuhc2mXMGN5nUPis8beH6uE/zl3uMWJcyHX0/LN/+QxO9zhYuV6l8AsAaphHFyS/fBv0SW3Nid7jw5hKQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.5.3.tgz", + "integrity": "sha512-t627eVRpl3SlxVya0cIVNs8jPl4KCEiGaTSWY9iKKTcMNaeDbuRML+zv/CFHDPr1zFv+FjJSP02ySB+tZ8xIag==", "requires": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", diff --git a/interface/package.json b/interface/package.json index 8a82ef70d..2cdaa7403 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,7 +8,7 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.5.1", - "@mui/material": "^5.5.2", + "@mui/material": "^5.5.3", "@types/lodash": "^4.14.180", "@types/node": "^17.0.23", "@types/react": "^17.0.43", From 6f347bd49e2aa7efccb022e833c942a495eb3e7b Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 29 Mar 2022 09:06:09 +0200 Subject: [PATCH 146/319] Michael's PR merged (dv sort, remove id) --- interface/src/project/DashboardData.tsx | 6 +++--- .../src/project/SettingsCustomization.tsx | 2 +- interface/src/project/types.ts | 1 - mock-api/server.js | 10 +++++----- src/emsdevice.cpp | 18 +++++++++--------- src/emsdevice.h | 5 ----- src/emsdevicevalue.h | 7 ++----- 7 files changed, 20 insertions(+), 29 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 4023227fc..ba589b513 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -37,7 +37,7 @@ import CancelIcon from '@mui/icons-material/Cancel'; import SendIcon from '@mui/icons-material/TrendingFlat'; import SaveIcon from '@mui/icons-material/Save'; import RemoveIcon from '@mui/icons-material/RemoveCircleOutline'; -import FavoriteIcon from '@mui/icons-material/Favorite'; +import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder'; import PlayArrowIcon from '@mui/icons-material/PlayArrow'; import DeviceIcon from './DeviceIcon'; @@ -500,7 +500,7 @@ const DashboardData: FC = () => { return ( {name}  - + ); } @@ -509,7 +509,7 @@ const DashboardData: FC = () => { return ( {name}  - + ); } diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index baf3a7480..b6e3f77a5 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -213,7 +213,7 @@ const SettingsCustomization: FC = () => { {deviceEntities.map((de) => ( - + = 0; fav--) { for (auto & dv : devicevalues_) { - bool state = (!i && dv.has_state(DeviceValueState::DV_FAVORITE)) || (i && !dv.has_state(DeviceValueState::DV_FAVORITE)); - if (state && (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD)))) { + // check conditions: + // 1. full_name cannot be empty + // 2. it must have a valid value, if it is not a command like 'reset' + // 3. show favorites first + bool show = (fav && dv.has_state(DeviceValueState::DV_FAVORITE)) || (!fav && !dv.has_state(DeviceValueState::DV_FAVORITE)); + if (show && !dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { JsonObject obj = data.createNestedObject(); // create the object, we know there is a value uint8_t fahrenheit = 0; @@ -842,7 +843,6 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { obj["m"] = dv.state >> 4; // send back the mask state. We're only interested in the high nibble obj["w"] = dv.has_cmd; // if writable - obj["i"] = dv.id; // add the unique ID } } diff --git a/src/emsdevice.h b/src/emsdevice.h index 9f292169a..99e780bd2 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -383,11 +383,6 @@ class EMSdevice { // device values std::vector devicevalues_; - - uint8_t dv_index_ = 0; // unique counter for each added device value - uint8_t get_next_dv_id() { - return (dv_index_++); - } }; } // namespace emsesp diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 9571218aa..5b8c358ea 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -137,7 +137,6 @@ class DeviceValue { int16_t min; // min range uint16_t max; // max range uint8_t state; // DeviceValueState::* - uint8_t id; // internal unique counter DeviceValue(uint8_t device_type, uint8_t tag, @@ -152,8 +151,7 @@ class DeviceValue { bool has_cmd, int16_t min, uint16_t max, - uint8_t state, - uint8_t id) + uint8_t state) : device_type(device_type) , tag(tag) , value_p(value_p) @@ -167,8 +165,7 @@ class DeviceValue { , has_cmd(has_cmd) , min(min) , max(max) - , state(state) - , id(id) { + , state(state) { } bool hasValue(); From 39d78fb44484c5ba55e8d838036f8edebc59aa81 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 29 Mar 2022 10:38:05 +0200 Subject: [PATCH 147/319] remove `(hidden)` text, force exclude from web icon --- interface/src/project/SettingsCustomization.tsx | 6 +++--- src/emsdevice.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index b6e3f77a5..136c3d951 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -186,13 +186,13 @@ const SettingsCustomization: FC = () => { const getMask = (de: DeviceEntity) => { var new_masks = []; - if ((de.m & 1) === 1) { + if ((de.m & 1) === 1 || de.n === '') { new_masks.push('1'); } if ((de.m & 2) === 2) { new_masks.push('2'); } - if ((de.m & 4) === 4) { + if ((de.m & 4) === 4 && de.w) { new_masks.push('4'); } if ((de.m & 8) === 8) { @@ -223,7 +223,7 @@ const SettingsCustomization: FC = () => { setMask(de, mask); }} > - + diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index f3ca26d0b..ea0db7ba0 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -831,7 +831,7 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { obj["n"] = name; } } else { - obj["n"] = "(hidden)"; + obj["n"] = ""; } // shortname From 786a94b448c98d207d30354020a10f61bccecb0f Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 29 Mar 2022 15:30:39 +0200 Subject: [PATCH 148/319] try to fix #408 and #412 --- lib/framework/NTPSettingsService.cpp | 7 +++++++ lib/framework/NTPSettingsService.h | 2 ++ lib/framework/NTPStatus.cpp | 3 ++- src/devices/thermostat.cpp | 11 +++++++---- src/system.cpp | 1 + src/system.h | 14 ++++++++++++++ 6 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/framework/NTPSettingsService.cpp b/lib/framework/NTPSettingsService.cpp index efd5132ee..672f0b496 100644 --- a/lib/framework/NTPSettingsService.cpp +++ b/lib/framework/NTPSettingsService.cpp @@ -46,8 +46,10 @@ void NTPSettingsService::WiFiEvent(WiFiEvent_t event) { // https://werner.rothschopf.net/microcontroller/202103_arduino_esp32_ntp_en.htm void NTPSettingsService::configureNTP() { + emsesp::EMSESP::system_.ntp_connected(false); if (connected_ && _state.enabled) { emsesp::EMSESP::logger().info(F("Starting NTP")); + sntp_set_time_sync_notification_cb(ntp_received); configTzTime(_state.tzFormat.c_str(), _state.server.c_str()); } else { setenv("TZ", _state.tzFormat.c_str(), 1); @@ -75,3 +77,8 @@ void NTPSettingsService::configureTime(AsyncWebServerRequest * request, JsonVari AsyncWebServerResponse * response = request->beginResponse(400); request->send(response); } + +void NTPSettingsService::ntp_received(struct timeval * tv) { + // emsesp::EMSESP::logger().info(F("NTP sync to %d sec"), tv->tv_sec); + emsesp::EMSESP::system_.ntp_connected(true); +} diff --git a/lib/framework/NTPSettingsService.h b/lib/framework/NTPSettingsService.h index e6af2831d..69125628a 100644 --- a/lib/framework/NTPSettingsService.h +++ b/lib/framework/NTPSettingsService.h @@ -57,6 +57,7 @@ class NTPSettingsService : public StatefulService { NTPSettingsService(AsyncWebServer * server, FS * fs, SecurityManager * securityManager); void begin(); + static void ntp_received(struct timeval * tv); private: HttpEndpoint _httpEndpoint; @@ -67,6 +68,7 @@ class NTPSettingsService : public StatefulService { void WiFiEvent(WiFiEvent_t event); void configureNTP(); void configureTime(AsyncWebServerRequest * request, JsonVariant & json); + }; #endif diff --git a/lib/framework/NTPStatus.cpp b/lib/framework/NTPStatus.cpp index 217345d44..4f026c77f 100644 --- a/lib/framework/NTPStatus.cpp +++ b/lib/framework/NTPStatus.cpp @@ -1,4 +1,5 @@ #include +#include "../../src/emsesp_stub.hpp" // proddy added using namespace std::placeholders; // for `_1` etc @@ -35,7 +36,7 @@ void NTPStatus::ntpStatus(AsyncWebServerRequest * request) { time_t now = time(nullptr); // only provide enabled/disabled status for now - root["status"] = sntp_enabled() ? 1 : 0; + root["status"] = sntp_enabled() && emsesp::EMSESP::system_.ntp_connected() ? 1 : 0; // the current time in UTC root["utc_time"] = toUTCTimeString(gmtime(&now)); diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index d4de33b66..432817d41 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1235,7 +1235,7 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { // check clock time_t now = time(nullptr); tm * tm_ = localtime(&now); - bool ntp_ = tm_->tm_year > 110; // year 2010 and up, time is valid + bool tset_ = tm_->tm_year > 110; // year 2010 and up, time is valid tm_->tm_year = telegram->message_data[0] + 100; tm_->tm_mon = telegram->message_data[1] - 1; tm_->tm_mday = telegram->message_data[3]; @@ -1244,7 +1244,7 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { tm_->tm_sec = telegram->message_data[5]; tm_->tm_isdst = telegram->message_data[7] & 0x01; time_t ttime = mktime(tm_); // thermostat time - if (ntp_ && has_command(&dateTime_)) { // have NTP time and command + if (tset_ && EMSESP::system_.ntp_connected() && has_command(&dateTime_)) { // have NTP time and command double difference = difftime(now, ttime); if (difference > 15 || difference < -15) { set_datetime("ntp", -1); // set from NTP @@ -1252,7 +1252,7 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { } } #ifndef EMSESP_STANDALONE - if (!ntp_ && tm_->tm_year > 110) { // emsesp clock not set, but thermostat clock + if (!tset_ && tm_->tm_year > 110) { // emsesp clock not set, but thermostat clock struct timeval newnow = {.tv_sec = ttime}; settimeofday(&newnow, nullptr); LOG_INFO(F("ems-esp time set from thermostat")); @@ -1797,9 +1797,12 @@ bool Thermostat::set_datetime(const char * value, const int8_t id) { if (dt == "ntp") { time_t now = time(nullptr); tm * tm_ = localtime(&now); - if (tm_->tm_year < 110) { // no NTP time + if (tm_->tm_year < 110) { // no valid time return false; } + if (!EMSESP::system_.ntp_connected()) { + LOG_WARNING(F("Set date: no valid NTP data, setting from ESP Clock")); + } data[0] = tm_->tm_year - 100; // Bosch counts from 2000 data[1] = tm_->tm_mon + 1; diff --git a/src/system.cpp b/src/system.cpp index bf8f9ec26..630936548 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1080,6 +1080,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["version"] = EMSESP_APP_VERSION; node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); node["uptime (seconds)"] = uuid::get_uptime_sec(); + node["network time"] = EMSESP::system_.ntp_connected() ? "connected" : "disconnected"; #ifndef EMSESP_STANDALONE node["freemem"] = ESP.getFreeHeap() / 1000L; // kilobytes diff --git a/src/system.h b/src/system.h index 970b77731..83576b5a8 100644 --- a/src/system.h +++ b/src/system.h @@ -154,6 +154,17 @@ class System { ethernet_connected_ = b; } + void ntp_connected(bool b) { + ntp_connected_ = b; + ntp_last_check_ = b ? uuid::get_uptime_sec() : 0; + } + + bool ntp_connected() { + // timeout 2 hours, ntp sync is normally every hour. + ntp_connected_ = (uuid::get_uptime_sec() - ntp_last_check_ > 7201) ? false : ntp_connected_; + return ntp_connected_; + } + bool network_connected() { #ifndef EMSESP_STANDALONE return (ethernet_connected() || WiFi.isConnected()); @@ -218,6 +229,9 @@ class System { bool upload_status_ = false; // true if we're in the middle of a OTA firmware upload bool ethernet_connected_ = false; + bool ntp_connected_ = false; + uint32_t ntp_last_check_ = 0; + // EMS-ESP settings // copies from WebSettings class in WebSettingsService.h and loaded with reload_settings() std::string hostname_ = FACTORY_WIFI_HOSTNAME; From 9775cc796a8ec372f6c60e448a2addc48c08c108 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 29 Mar 2022 18:15:29 +0200 Subject: [PATCH 149/319] update packages --- interface/package-lock.json | 1185 +++++++++++++++++------------------ interface/package.json | 4 +- 2 files changed, 565 insertions(+), 624 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 313bff332..e1fb81411 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -13,7 +13,7 @@ "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.5.1", "@mui/material": "^5.5.3", - "@types/lodash": "^4.14.180", + "@types/lodash": "^4.14.181", "@types/node": "^17.0.23", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", @@ -3720,9 +3720,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", - "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -3730,9 +3730,9 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "node_modules/@types/lodash": { - "version": "4.14.180", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.180.tgz", - "integrity": "sha512-XOKXa1KIxtNXgASAnwj7cnttJxS4fksBRywK/9LzRV5YxrF80BXZIGeQSuoESQ/VkUj30Ae0+YcuHc15wJCB2g==" + "version": "4.14.181", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", + "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" }, "node_modules/@types/mime": { "version": "1.3.2", @@ -3902,13 +3902,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz", - "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", + "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", "dependencies": { - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/type-utils": "5.15.0", - "@typescript-eslint/utils": "5.15.0", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/type-utils": "5.17.0", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -3948,11 +3948,11 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.15.0.tgz", - "integrity": "sha512-AJOOaBrVqKYWaYDBtgMi9XVDB3YHXlffto/3A4VQ39VVaNqosSOp/nW09G4N/ej8WlzHQB2jTnSfP5wWsXSQJA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.17.0.tgz", + "integrity": "sha512-U4sM5z0/ymSYqQT6I7lz8l0ZZ9zrya5VIwrwAP5WOJVabVtVsIpTMxPQe+D3qLyePT+VlETUTO2nA1+PufPx9Q==", "dependencies": { - "@typescript-eslint/utils": "5.15.0" + "@typescript-eslint/utils": "5.17.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3966,13 +3966,13 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz", - "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", + "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", "dependencies": { - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/typescript-estree": "5.15.0", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", "debug": "^4.3.2" }, "engines": { @@ -3992,12 +3992,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz", - "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", + "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", "dependencies": { - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/visitor-keys": "5.15.0" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4008,11 +4008,11 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz", - "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", + "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", "dependencies": { - "@typescript-eslint/utils": "5.15.0", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -4033,9 +4033,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz", - "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", + "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4045,12 +4045,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz", - "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", + "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", "dependencies": { - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/visitor-keys": "5.15.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -4085,14 +4085,14 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz", - "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", + "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/typescript-estree": "5.15.0", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4128,11 +4128,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz", - "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", + "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", "dependencies": { - "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/types": "5.17.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -4458,9 +4458,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4821,12 +4821,12 @@ } }, "node_modules/babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -4838,30 +4838,6 @@ "webpack": ">=2" } }, - "node_modules/babel-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/babel-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -5484,9 +5460,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001319", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", - "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==", + "version": "1.0.30001322", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001322.tgz", + "integrity": "sha512-neRmrmIrCGuMnxGSoh+x7zYtQFFgnSY2jaomjU56sCkTA6JINqQrxutF459JpWcWRajvoyn95sOXq4Pqrnyjew==", "funding": [ { "type": "opencollective", @@ -5992,14 +5968,11 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", - "dependencies": { - "timsort": "^0.3.0" - }, + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", "engines": { - "node": ">= 10" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.0.9" @@ -6099,9 +6072,9 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -6170,13 +6143,13 @@ } }, "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" }, @@ -6210,9 +6183,9 @@ } }, "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.0.1.tgz", + "integrity": "sha512-z93ZGFLNc6yaoXAmVhqoSIb+BduplteCt1fepvwhBUQK6MNE4g6fgjpuZKJKp0esUe+vXWlIkwZZjNWoOKw0ZA==", "engines": { "node": ">= 6" }, @@ -6237,11 +6210,11 @@ } }, "node_modules/cssnano": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.4.tgz", - "integrity": "sha512-hbfhVZreEPyzl+NbvRsjNo54JOX80b+j6nqG2biLVLaZHJEiqGyMh4xDGHtwhUKd5p59mj2GlDqlUBwJUuIu5A==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz", + "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==", "dependencies": { - "cssnano-preset-default": "^*", + "cssnano-preset-default": "^5.2.5", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -6257,39 +6230,39 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.4.tgz", - "integrity": "sha512-w1Gg8xsebln6/axZ6qDFQHuglrGfbIHOIx0g4y9+etRlRab8CGpSpe6UMsrgJe4zhCaJ0LwLmc+PhdLRTwnhIA==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz", + "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==", "dependencies": { "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^*", + "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^*", - "postcss-convert-values": "^*", - "postcss-discard-comments": "^*", - "postcss-discard-duplicates": "^*", - "postcss-discard-empty": "^*", - "postcss-discard-overridden": "^*", - "postcss-merge-longhand": "^*", - "postcss-merge-rules": "^*", - "postcss-minify-font-values": "^*", - "postcss-minify-gradients": "^*", - "postcss-minify-params": "^*", - "postcss-minify-selectors": "^*", - "postcss-normalize-charset": "^*", - "postcss-normalize-display-values": "^*", - "postcss-normalize-positions": "^*", - "postcss-normalize-repeat-style": "^*", - "postcss-normalize-string": "^*", - "postcss-normalize-timing-functions": "^*", - "postcss-normalize-unicode": "^*", - "postcss-normalize-url": "^*", - "postcss-normalize-whitespace": "^*", - "postcss-ordered-values": "^*", - "postcss-reduce-initial": "^*", - "postcss-reduce-transforms": "^*", - "postcss-svgo": "^*", - "postcss-unique-selectors": "^*" + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.3", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.2", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -6820,9 +6793,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.88", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.88.tgz", - "integrity": "sha512-oA7mzccefkvTNi9u7DXmT0LqvhnOiN2BhSrKerta7HeUC1cLoIwtbf2wL+Ah2ozh5KQd3/1njrGrwDBXx6d14Q==" + "version": "1.4.99", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.99.tgz", + "integrity": "sha512-YXMzbvlo6pW12KWw0bj6cIGCJi1Moy8PLCuuzgRzg6WYIcHILK3szU+HHnHFx2b373qRv+cfmHhbmRbatyAbPA==" }, "node_modules/emittery": { "version": "0.8.1", @@ -6902,9 +6875,9 @@ } }, "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", + "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -6912,15 +6885,15 @@ "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.1", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -7066,9 +7039,9 @@ } }, "node_modules/eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "dependencies": { "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", @@ -7384,9 +7357,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", - "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", "engines": { "node": ">=10" }, @@ -8793,9 +8766,9 @@ } }, "node_modules/html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "node_modules/html-escaper": { "version": "2.0.2", @@ -11489,12 +11462,9 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "bin": { "json5": "lib/cli.js" }, @@ -11617,9 +11587,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "engines": { "node": ">=10" } @@ -11860,12 +11830,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -11937,9 +11907,9 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -12002,16 +11972,16 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -12040,9 +12010,9 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13292,11 +13262,11 @@ } }, "node_modules/postcss-load-config": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", - "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dependencies": { - "lilconfig": "^2.0.4", + "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "engines": { @@ -13307,9 +13277,13 @@ "url": "https://opencollective.com/postcss/" }, "peerDependencies": { + "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { + "postcss": { + "optional": true + }, "ts-node": { "optional": true } @@ -13388,12 +13362,12 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.2.tgz", - "integrity": "sha512-18/bp9DZnY1ai9RlahOfLBbmIUKfKFPASxRCiZ1vlpZqWPCn8qWPFlEozqmWL+kBtcEQmG8W9YqGCstDImvp/Q==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz", + "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^*" + "stylehacks": "^5.1.0" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -13403,9 +13377,9 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.0.tgz", - "integrity": "sha512-NecukEJovQ0mG7h7xV8wbYAkXGTO3MPKnXvuiXzOKcxoOodfTTKYjeo8TMhAswlSkjcPIBlnKbSFcTuVSDaPyQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", @@ -13434,9 +13408,9 @@ } }, "node_modules/postcss-minify-gradients": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.0.tgz", - "integrity": "sha512-J/TMLklkONn3LuL8wCwfwU8zKC1hpS6VcxFkNUNjmVt53uKqrrykR3ov11mdUYyqVMEx67slMce0tE14cE4DTg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", @@ -13450,9 +13424,9 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.1.tgz", - "integrity": "sha512-WCpr+J9Uz8XzMpAfg3UL8z5rde6MifBbh5L8bn8S2F5hq/YDJJzASYCnCHvAB4Fqb94ys8v95ULQkW2EhCFvNg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", + "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", "dependencies": { "browserslist": "^4.16.6", "cssnano-utils": "^3.1.0", @@ -13727,9 +13701,9 @@ } }, "node_modules/postcss-ordered-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.0.tgz", - "integrity": "sha512-wU4Z4D4uOIH+BUKkYid36gGDJNQtkVJT7Twv8qH6UyfttbbJWyw4/xIPuVEkkCtQLAJ0EdsNSh8dlvqkXb49TA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -15248,11 +15222,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "node_modules/selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dependencies": { - "node-forge": "^1.2.0" + "node-forge": "^1" }, "engines": { "node": ">=10" @@ -16290,11 +16264,6 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -16386,13 +16355,13 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, "node_modules/tsconfig-paths": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz", - "integrity": "sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, @@ -16939,9 +16908,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -17039,9 +17008,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -17305,26 +17274,26 @@ } }, "node_modules/workbox-background-sync": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.1.tgz", - "integrity": "sha512-T5a35fagLXQvV8Dr4+bDU+XYsP90jJ3eBLjZMKuCNELMQZNj+VekCODz1QK44jgoBeQk+vp94pkZV6G+e41pgg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.2.tgz", + "integrity": "sha512-EjG37LSMDJ1TFlFg56wx6YXbH4/NkG09B9OHvyxx+cGl2gP5OuOzsCY3rOPJSpbcz6jpuA40VIC3HzSD4OvE1g==", "dependencies": { "idb": "^6.1.4", - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/workbox-broadcast-update": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.1.tgz", - "integrity": "sha512-mb/oyblyEpDbw167cCTyHnC3RqCnCQHtFYuYZd+QTpuExxM60qZuBH1AuQCgvLtDcztBKdEYK2VFD9SZYgRbaQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.2.tgz", + "integrity": "sha512-DjJYraYnprTZE/AQNoeogaxI1dPuYmbw+ZJeeP8uXBSbg9SNv5wLYofQgywXeRepv4yr/vglMo9yaHUmBMc+4Q==", "dependencies": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/workbox-build": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.1.tgz", - "integrity": "sha512-coDUDzHvFZ1ADOl3wKCsCSyOBvkPKlPgcQDb6LMMShN1zgF31Mev/1HzN3+9T2cjjWAgFwZKkuRyExqc1v21Zw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.2.tgz", + "integrity": "sha512-TVi4Otf6fgwikBeMpXF9n0awHfZTMNu/nwlMIT9W+c13yvxkmDFMPb7vHYK6RUmbcxwPnz4I/R+uL76+JxG4JQ==", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -17348,21 +17317,21 @@ "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.5.1", - "workbox-broadcast-update": "6.5.1", - "workbox-cacheable-response": "6.5.1", - "workbox-core": "6.5.1", - "workbox-expiration": "6.5.1", - "workbox-google-analytics": "6.5.1", - "workbox-navigation-preload": "6.5.1", - "workbox-precaching": "6.5.1", - "workbox-range-requests": "6.5.1", - "workbox-recipes": "6.5.1", - "workbox-routing": "6.5.1", - "workbox-strategies": "6.5.1", - "workbox-streams": "6.5.1", - "workbox-sw": "6.5.1", - "workbox-window": "6.5.1" + "workbox-background-sync": "6.5.2", + "workbox-broadcast-update": "6.5.2", + "workbox-cacheable-response": "6.5.2", + "workbox-core": "6.5.2", + "workbox-expiration": "6.5.2", + "workbox-google-analytics": "6.5.2", + "workbox-navigation-preload": "6.5.2", + "workbox-precaching": "6.5.2", + "workbox-range-requests": "6.5.2", + "workbox-recipes": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2", + "workbox-streams": "6.5.2", + "workbox-sw": "6.5.2", + "workbox-window": "6.5.2" }, "engines": { "node": ">=10.0.0" @@ -17385,9 +17354,9 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -17453,117 +17422,117 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.1.tgz", - "integrity": "sha512-3TdtH/luDiytmM+Cn72HCBLZXmbeRNJqZx2yaVOfUZhj0IVwZqQXhNarlGE9/k6U5Jelb+TtpH2mLVhnzfiSMg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.2.tgz", + "integrity": "sha512-UnHGih6xqloV808T7ve1iNKZMbpML0jGLqkkmyXkJbZc5j16+HRSV61Qrh+tiq3E3yLvFMGJ3AUBODOPNLWpTg==", "dependencies": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/workbox-core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.1.tgz", - "integrity": "sha512-qObXZ39aFJ2N8X7IUbGrJHKWguliCuU1jOXM/I4MTT84u9BiKD2rHMkIzgeRP1Ixu9+cXU4/XHJq3Cy0Qqc5hw==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.2.tgz", + "integrity": "sha512-IlxLGQf+wJHCR+NM0UWqDh4xe/Gu6sg2i4tfZk6WIij34IVk9BdOQgi6WvqSHd879jbQIUgL2fBdJUJyAP5ypQ==" }, "node_modules/workbox-expiration": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.1.tgz", - "integrity": "sha512-iY/cTADAQATMmPkUBRmQdacqq0TJd2wMHimBQz+tRnPGHSMH+/BoLPABPnu7O7rT/g/s59CUYYRGxe3mEgoJCA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.2.tgz", + "integrity": "sha512-5Hfp0uxTZJrgTiy9W7AjIIec+9uTOtnxY/tRBm4DbqcWKaWbVTa+izrKzzOT4MXRJJIJUmvRhWw4oo8tpmMouw==", "dependencies": { "idb": "^6.1.4", - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/workbox-google-analytics": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.1.tgz", - "integrity": "sha512-qZU46/h4dbionYT6Yk6iBkUwpiEzAfnO1W7KkI+AMmY7G9/gA03dQQ7rpTw8F4vWrG7ahTUGWDFv6fERtaw1BQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.2.tgz", + "integrity": "sha512-8SMar+N0xIreP5/2we3dwtN1FUmTMScoopL86aKdXBpio8vXc8Oqb5fCJG32ialjN8BAOzDqx/FnGeCtkIlyvw==", "dependencies": { - "workbox-background-sync": "6.5.1", - "workbox-core": "6.5.1", - "workbox-routing": "6.5.1", - "workbox-strategies": "6.5.1" + "workbox-background-sync": "6.5.2", + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" } }, "node_modules/workbox-navigation-preload": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.1.tgz", - "integrity": "sha512-aKrgAbn2IMgzTowTi/ZyKdQUcES2m++9aGtpxqsX7Gn9ovCY8zcssaMEAMMwrIeveij5HiWNBrmj6MWDHi+0rg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.2.tgz", + "integrity": "sha512-iqDNWWMswjCsZuvGFDpcX1Z8InBVAlVBELJ28xShsWWntALzbtr0PXMnm2WHkXCc56JimmGldZi1N5yDPiTPOg==", "dependencies": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/workbox-precaching": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.1.tgz", - "integrity": "sha512-EzlPBxvmjGfE56YZzsT/vpVkpLG1XJhoplgXa5RPyVWLUL1LbwEAxhkrENElSS/R9tgiTw80IFwysidfUqLihg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.2.tgz", + "integrity": "sha512-OZAlQ8AAT20KugGKKuJMHdQ8X1IyNQaLv+mPTHj+8Dmv8peBq5uWNzs4g/1OSFmXsbXZ6a1CBC6YtQWVPhJQ9w==", "dependencies": { - "workbox-core": "6.5.1", - "workbox-routing": "6.5.1", - "workbox-strategies": "6.5.1" + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" } }, "node_modules/workbox-range-requests": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.1.tgz", - "integrity": "sha512-57Da/qRbd9v33YlHX0rlSUVFmE4THCjKqwkmfhY3tNLnSKN2L5YBS3qhWeDO0IrMNgUj+rGve2moKYXeUqQt4A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.2.tgz", + "integrity": "sha512-zi5VqF1mWqfCyJLTMXn1EuH/E6nisqWDK1VmOJ+TnjxGttaQrseOhMn+BMvULFHeF8AvrQ0ogfQ6bSv0rcfAlg==", "dependencies": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/workbox-recipes": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.1.tgz", - "integrity": "sha512-DGsyKygHggcGPQpWafC/Nmbm1Ny3sB2vE9r//3UbeidXiQ+pLF14KEG1/0NNGRaY+lfOXOagq6d1H7SC8KA+rA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.2.tgz", + "integrity": "sha512-2lcUKMYDiJKvuvRotOxLjH2z9K7jhj8GNUaHxHNkJYbTCUN3LsX1cWrsgeJFDZ/LgI565t3fntpbG9J415ZBXA==", "dependencies": { - "workbox-cacheable-response": "6.5.1", - "workbox-core": "6.5.1", - "workbox-expiration": "6.5.1", - "workbox-precaching": "6.5.1", - "workbox-routing": "6.5.1", - "workbox-strategies": "6.5.1" + "workbox-cacheable-response": "6.5.2", + "workbox-core": "6.5.2", + "workbox-expiration": "6.5.2", + "workbox-precaching": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" } }, "node_modules/workbox-routing": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.1.tgz", - "integrity": "sha512-yAAncdTwanvlR8KPjubyvFKeAok8ZcIws6UKxvIAg0I+wsf7UYi93DXNuZr6RBSQrByrN6HkCyjuhmk8P63+PA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.2.tgz", + "integrity": "sha512-nR1w5PjF6IVwo0SX3oE88LhmGFmTnqqU7zpGJQQPZiKJfEKgDENQIM9mh3L1ksdFd9Y3CZVkusopHfxQvit/BA==", "dependencies": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/workbox-strategies": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.1.tgz", - "integrity": "sha512-JNaTXPy8wXzKkr+6za7/eJX9opoZk7UgY261I2kPxl80XQD8lMjz0vo9EOcBwvD72v3ZhGJbW84ZaDwFEhFvWA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.2.tgz", + "integrity": "sha512-fgbwaUMxbG39BHjJIs2y2X21C0bmf1Oq3vMQxJ1hr6y5JMJIm8rvKCcf1EIdAr+PjKdSk4ddmgyBQ4oO8be4Uw==", "dependencies": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/workbox-streams": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.1.tgz", - "integrity": "sha512-7jaTWm6HRGJ/ewECnhb+UgjTT50R42E0/uNCC4eTKQwnLO/NzNGjoXTdQgFjo4zteR+L/K6AtFAiYKH3ZJbAYw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.2.tgz", + "integrity": "sha512-ovD0P4UrgPtZ2Lfc/8E8teb1RqNOSZr+1ZPqLR6sGRZnKZviqKbQC3zVvvkhmOIwhWbpL7bQlWveLVONHjxd5w==", "dependencies": { - "workbox-core": "6.5.1", - "workbox-routing": "6.5.1" + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2" } }, "node_modules/workbox-sw": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.1.tgz", - "integrity": "sha512-hVrQa19yo9wzN1fQQ/h2JlkzFpkuH2qzYT2/rk7CLaWt6tLnTJVFCNHlGRRPhytZSf++LoIy7zThT714sowT/Q==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.2.tgz", + "integrity": "sha512-2KhlYqtkoqlnPdllj2ujXUKRuEFsRDIp6rdE4l1PsxiFHRAFaRTisRQpGvRem5yxgXEr+fcEKiuZUW2r70KZaw==" }, "node_modules/workbox-webpack-plugin": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.1.tgz", - "integrity": "sha512-SHtlQBpKruI16CAYhICDMkgjXE2fH5Yp+D+1UmBfRVhByZYzusVOykvnPm8ObJb9d/tXgn9yoppoxafFS7D4vQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-StrJ7wKp5tZuGVcoKLVjFWlhDy+KT7ZWsKnNcD6F08wA9Cpt6JN+PLIrplcsTHbQpoAV8+xg6RvcG0oc9z+RpQ==", "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", "upath": "^1.2.0", "webpack-sources": "^1.4.3", - "workbox-build": "6.5.1" + "workbox-build": "6.5.2" }, "engines": { "node": ">=10.0.0" @@ -17590,12 +17559,12 @@ } }, "node_modules/workbox-window": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.1.tgz", - "integrity": "sha512-oRlun9u7b7YEjo2fIDBqJkU2hXtrEljXcOytRhfeQRbqXxjUOpFgXSGRSAkmDx1MlKUNOSbr+zfi8h5n7In3yA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.2.tgz", + "integrity": "sha512-2kZH37r9Wx8swjEOL4B8uGM53lakMxsKkQ7mOKzGA/QAn/DQTEZGrdHWtypk2tbhKY5S0jvPS+sYDnb2Z3378A==", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "node_modules/wrap-ansi": { @@ -20257,9 +20226,9 @@ } }, "@types/json-schema": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", - "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/json5": { "version": "0.0.29", @@ -20267,9 +20236,9 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "@types/lodash": { - "version": "4.14.180", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.180.tgz", - "integrity": "sha512-XOKXa1KIxtNXgASAnwj7cnttJxS4fksBRywK/9LzRV5YxrF80BXZIGeQSuoESQ/VkUj30Ae0+YcuHc15wJCB2g==" + "version": "4.14.181", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", + "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" }, "@types/mime": { "version": "1.3.2", @@ -20439,13 +20408,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz", - "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", + "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", "requires": { - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/type-utils": "5.15.0", - "@typescript-eslint/utils": "5.15.0", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/type-utils": "5.17.0", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -20465,55 +20434,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.15.0.tgz", - "integrity": "sha512-AJOOaBrVqKYWaYDBtgMi9XVDB3YHXlffto/3A4VQ39VVaNqosSOp/nW09G4N/ej8WlzHQB2jTnSfP5wWsXSQJA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.17.0.tgz", + "integrity": "sha512-U4sM5z0/ymSYqQT6I7lz8l0ZZ9zrya5VIwrwAP5WOJVabVtVsIpTMxPQe+D3qLyePT+VlETUTO2nA1+PufPx9Q==", "requires": { - "@typescript-eslint/utils": "5.15.0" + "@typescript-eslint/utils": "5.17.0" } }, "@typescript-eslint/parser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz", - "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", + "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", "requires": { - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/typescript-estree": "5.15.0", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz", - "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", + "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", "requires": { - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/visitor-keys": "5.15.0" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0" } }, "@typescript-eslint/type-utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz", - "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", + "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", "requires": { - "@typescript-eslint/utils": "5.15.0", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz", - "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==" + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", + "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==" }, "@typescript-eslint/typescript-estree": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz", - "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", + "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", "requires": { - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/visitor-keys": "5.15.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -20532,14 +20501,14 @@ } }, "@typescript-eslint/utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz", - "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", + "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/typescript-estree": "5.15.0", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -20561,11 +20530,11 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz", - "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", + "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", "requires": { - "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/types": "5.17.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -20836,9 +20805,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -21097,34 +21066,16 @@ } }, "babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "requires": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, "schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -21608,9 +21559,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001319", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz", - "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==" + "version": "1.0.30001322", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001322.tgz", + "integrity": "sha512-neRmrmIrCGuMnxGSoh+x7zYtQFFgnSY2jaomjU56sCkTA6JINqQrxutF459JpWcWRajvoyn95sOXq4Pqrnyjew==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -21982,12 +21933,10 @@ } }, "css-declaration-sorter": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", - "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", - "requires": { - "timsort": "^0.3.0" - } + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "requires": {} }, "css-has-pseudo": { "version": "3.0.4", @@ -22036,9 +21985,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -22084,13 +22033,13 @@ "requires": {} }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } @@ -22117,9 +22066,9 @@ } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.0.1.tgz", + "integrity": "sha512-z93ZGFLNc6yaoXAmVhqoSIb+BduplteCt1fepvwhBUQK6MNE4g6fgjpuZKJKp0esUe+vXWlIkwZZjNWoOKw0ZA==" }, "cssdb": { "version": "6.5.0", @@ -22132,49 +22081,49 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.4.tgz", - "integrity": "sha512-hbfhVZreEPyzl+NbvRsjNo54JOX80b+j6nqG2biLVLaZHJEiqGyMh4xDGHtwhUKd5p59mj2GlDqlUBwJUuIu5A==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz", + "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==", "requires": { - "cssnano-preset-default": "^*", + "cssnano-preset-default": "^5.2.5", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.4.tgz", - "integrity": "sha512-w1Gg8xsebln6/axZ6qDFQHuglrGfbIHOIx0g4y9+etRlRab8CGpSpe6UMsrgJe4zhCaJ0LwLmc+PhdLRTwnhIA==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz", + "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==", "requires": { "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^*", + "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^*", - "postcss-convert-values": "^*", - "postcss-discard-comments": "^*", - "postcss-discard-duplicates": "^*", - "postcss-discard-empty": "^*", - "postcss-discard-overridden": "^*", - "postcss-merge-longhand": "^*", - "postcss-merge-rules": "^*", - "postcss-minify-font-values": "^*", - "postcss-minify-gradients": "^*", - "postcss-minify-params": "^*", - "postcss-minify-selectors": "^*", - "postcss-normalize-charset": "^*", - "postcss-normalize-display-values": "^*", - "postcss-normalize-positions": "^*", - "postcss-normalize-repeat-style": "^*", - "postcss-normalize-string": "^*", - "postcss-normalize-timing-functions": "^*", - "postcss-normalize-unicode": "^*", - "postcss-normalize-url": "^*", - "postcss-normalize-whitespace": "^*", - "postcss-ordered-values": "^*", - "postcss-reduce-initial": "^*", - "postcss-reduce-transforms": "^*", - "postcss-svgo": "^*", - "postcss-unique-selectors": "^*" + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.3", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.2", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" } }, "cssnano-utils": { @@ -22585,9 +22534,9 @@ } }, "electron-to-chromium": { - "version": "1.4.88", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.88.tgz", - "integrity": "sha512-oA7mzccefkvTNi9u7DXmT0LqvhnOiN2BhSrKerta7HeUC1cLoIwtbf2wL+Ah2ozh5KQd3/1njrGrwDBXx6d14Q==" + "version": "1.4.99", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.99.tgz", + "integrity": "sha512-YXMzbvlo6pW12KWw0bj6cIGCJi1Moy8PLCuuzgRzg6WYIcHILK3szU+HHnHFx2b373qRv+cfmHhbmRbatyAbPA==" }, "emittery": { "version": "0.8.1", @@ -22649,9 +22598,9 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", + "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -22659,15 +22608,15 @@ "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.1", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -22767,9 +22716,9 @@ } }, "eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "requires": { "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", @@ -23145,9 +23094,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", - "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", "requires": {} }, "eslint-plugin-testing-library": { @@ -24017,9 +23966,9 @@ } }, "html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "html-escaper": { "version": "2.0.2", @@ -25939,12 +25888,9 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonfile": { "version": "6.1.0", @@ -26035,9 +25981,9 @@ } }, "lilconfig": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", - "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==" }, "lines-and-columns": { "version": "1.2.4", @@ -26226,12 +26172,12 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -26272,9 +26218,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -26322,16 +26268,16 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "ms": { @@ -26354,9 +26300,9 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" }, "natural-compare": { "version": "1.4.0", @@ -27185,11 +27131,11 @@ } }, "postcss-load-config": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", - "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "requires": { - "lilconfig": "^2.0.4", + "lilconfig": "^2.0.5", "yaml": "^1.10.2" } }, @@ -27238,18 +27184,18 @@ "requires": {} }, "postcss-merge-longhand": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.2.tgz", - "integrity": "sha512-18/bp9DZnY1ai9RlahOfLBbmIUKfKFPASxRCiZ1vlpZqWPCn8qWPFlEozqmWL+kBtcEQmG8W9YqGCstDImvp/Q==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz", + "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==", "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^*" + "stylehacks": "^5.1.0" } }, "postcss-merge-rules": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.0.tgz", - "integrity": "sha512-NecukEJovQ0mG7h7xV8wbYAkXGTO3MPKnXvuiXzOKcxoOodfTTKYjeo8TMhAswlSkjcPIBlnKbSFcTuVSDaPyQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", @@ -27266,9 +27212,9 @@ } }, "postcss-minify-gradients": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.0.tgz", - "integrity": "sha512-J/TMLklkONn3LuL8wCwfwU8zKC1hpS6VcxFkNUNjmVt53uKqrrykR3ov11mdUYyqVMEx67slMce0tE14cE4DTg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "requires": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", @@ -27276,9 +27222,9 @@ } }, "postcss-minify-params": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.1.tgz", - "integrity": "sha512-WCpr+J9Uz8XzMpAfg3UL8z5rde6MifBbh5L8bn8S2F5hq/YDJJzASYCnCHvAB4Fqb94ys8v95ULQkW2EhCFvNg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", + "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", "requires": { "browserslist": "^4.16.6", "cssnano-utils": "^3.1.0", @@ -27429,9 +27375,9 @@ "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==" }, "postcss-ordered-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.0.tgz", - "integrity": "sha512-wU4Z4D4uOIH+BUKkYid36gGDJNQtkVJT7Twv8qH6UyfttbbJWyw4/xIPuVEkkCtQLAJ0EdsNSh8dlvqkXb49TA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", "requires": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -28527,11 +28473,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "requires": { - "node-forge": "^1.2.0" + "node-forge": "^1" } }, "semver": { @@ -29332,11 +29278,6 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -29406,13 +29347,13 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, "tsconfig-paths": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz", - "integrity": "sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { @@ -29833,9 +29774,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -29907,9 +29848,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -30080,26 +30021,26 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workbox-background-sync": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.1.tgz", - "integrity": "sha512-T5a35fagLXQvV8Dr4+bDU+XYsP90jJ3eBLjZMKuCNELMQZNj+VekCODz1QK44jgoBeQk+vp94pkZV6G+e41pgg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.2.tgz", + "integrity": "sha512-EjG37LSMDJ1TFlFg56wx6YXbH4/NkG09B9OHvyxx+cGl2gP5OuOzsCY3rOPJSpbcz6jpuA40VIC3HzSD4OvE1g==", "requires": { "idb": "^6.1.4", - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "workbox-broadcast-update": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.1.tgz", - "integrity": "sha512-mb/oyblyEpDbw167cCTyHnC3RqCnCQHtFYuYZd+QTpuExxM60qZuBH1AuQCgvLtDcztBKdEYK2VFD9SZYgRbaQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.2.tgz", + "integrity": "sha512-DjJYraYnprTZE/AQNoeogaxI1dPuYmbw+ZJeeP8uXBSbg9SNv5wLYofQgywXeRepv4yr/vglMo9yaHUmBMc+4Q==", "requires": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "workbox-build": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.1.tgz", - "integrity": "sha512-coDUDzHvFZ1ADOl3wKCsCSyOBvkPKlPgcQDb6LMMShN1zgF31Mev/1HzN3+9T2cjjWAgFwZKkuRyExqc1v21Zw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.2.tgz", + "integrity": "sha512-TVi4Otf6fgwikBeMpXF9n0awHfZTMNu/nwlMIT9W+c13yvxkmDFMPb7vHYK6RUmbcxwPnz4I/R+uL76+JxG4JQ==", "requires": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -30123,21 +30064,21 @@ "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.5.1", - "workbox-broadcast-update": "6.5.1", - "workbox-cacheable-response": "6.5.1", - "workbox-core": "6.5.1", - "workbox-expiration": "6.5.1", - "workbox-google-analytics": "6.5.1", - "workbox-navigation-preload": "6.5.1", - "workbox-precaching": "6.5.1", - "workbox-range-requests": "6.5.1", - "workbox-recipes": "6.5.1", - "workbox-routing": "6.5.1", - "workbox-strategies": "6.5.1", - "workbox-streams": "6.5.1", - "workbox-sw": "6.5.1", - "workbox-window": "6.5.1" + "workbox-background-sync": "6.5.2", + "workbox-broadcast-update": "6.5.2", + "workbox-cacheable-response": "6.5.2", + "workbox-core": "6.5.2", + "workbox-expiration": "6.5.2", + "workbox-google-analytics": "6.5.2", + "workbox-navigation-preload": "6.5.2", + "workbox-precaching": "6.5.2", + "workbox-range-requests": "6.5.2", + "workbox-recipes": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2", + "workbox-streams": "6.5.2", + "workbox-sw": "6.5.2", + "workbox-window": "6.5.2" }, "dependencies": { "@apideck/better-ajv-errors": { @@ -30151,9 +30092,9 @@ } }, "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -30211,117 +30152,117 @@ } }, "workbox-cacheable-response": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.1.tgz", - "integrity": "sha512-3TdtH/luDiytmM+Cn72HCBLZXmbeRNJqZx2yaVOfUZhj0IVwZqQXhNarlGE9/k6U5Jelb+TtpH2mLVhnzfiSMg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.2.tgz", + "integrity": "sha512-UnHGih6xqloV808T7ve1iNKZMbpML0jGLqkkmyXkJbZc5j16+HRSV61Qrh+tiq3E3yLvFMGJ3AUBODOPNLWpTg==", "requires": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "workbox-core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.1.tgz", - "integrity": "sha512-qObXZ39aFJ2N8X7IUbGrJHKWguliCuU1jOXM/I4MTT84u9BiKD2rHMkIzgeRP1Ixu9+cXU4/XHJq3Cy0Qqc5hw==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.2.tgz", + "integrity": "sha512-IlxLGQf+wJHCR+NM0UWqDh4xe/Gu6sg2i4tfZk6WIij34IVk9BdOQgi6WvqSHd879jbQIUgL2fBdJUJyAP5ypQ==" }, "workbox-expiration": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.1.tgz", - "integrity": "sha512-iY/cTADAQATMmPkUBRmQdacqq0TJd2wMHimBQz+tRnPGHSMH+/BoLPABPnu7O7rT/g/s59CUYYRGxe3mEgoJCA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.2.tgz", + "integrity": "sha512-5Hfp0uxTZJrgTiy9W7AjIIec+9uTOtnxY/tRBm4DbqcWKaWbVTa+izrKzzOT4MXRJJIJUmvRhWw4oo8tpmMouw==", "requires": { "idb": "^6.1.4", - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "workbox-google-analytics": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.1.tgz", - "integrity": "sha512-qZU46/h4dbionYT6Yk6iBkUwpiEzAfnO1W7KkI+AMmY7G9/gA03dQQ7rpTw8F4vWrG7ahTUGWDFv6fERtaw1BQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.2.tgz", + "integrity": "sha512-8SMar+N0xIreP5/2we3dwtN1FUmTMScoopL86aKdXBpio8vXc8Oqb5fCJG32ialjN8BAOzDqx/FnGeCtkIlyvw==", "requires": { - "workbox-background-sync": "6.5.1", - "workbox-core": "6.5.1", - "workbox-routing": "6.5.1", - "workbox-strategies": "6.5.1" + "workbox-background-sync": "6.5.2", + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" } }, "workbox-navigation-preload": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.1.tgz", - "integrity": "sha512-aKrgAbn2IMgzTowTi/ZyKdQUcES2m++9aGtpxqsX7Gn9ovCY8zcssaMEAMMwrIeveij5HiWNBrmj6MWDHi+0rg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.2.tgz", + "integrity": "sha512-iqDNWWMswjCsZuvGFDpcX1Z8InBVAlVBELJ28xShsWWntALzbtr0PXMnm2WHkXCc56JimmGldZi1N5yDPiTPOg==", "requires": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "workbox-precaching": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.1.tgz", - "integrity": "sha512-EzlPBxvmjGfE56YZzsT/vpVkpLG1XJhoplgXa5RPyVWLUL1LbwEAxhkrENElSS/R9tgiTw80IFwysidfUqLihg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.2.tgz", + "integrity": "sha512-OZAlQ8AAT20KugGKKuJMHdQ8X1IyNQaLv+mPTHj+8Dmv8peBq5uWNzs4g/1OSFmXsbXZ6a1CBC6YtQWVPhJQ9w==", "requires": { - "workbox-core": "6.5.1", - "workbox-routing": "6.5.1", - "workbox-strategies": "6.5.1" + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" } }, "workbox-range-requests": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.1.tgz", - "integrity": "sha512-57Da/qRbd9v33YlHX0rlSUVFmE4THCjKqwkmfhY3tNLnSKN2L5YBS3qhWeDO0IrMNgUj+rGve2moKYXeUqQt4A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.2.tgz", + "integrity": "sha512-zi5VqF1mWqfCyJLTMXn1EuH/E6nisqWDK1VmOJ+TnjxGttaQrseOhMn+BMvULFHeF8AvrQ0ogfQ6bSv0rcfAlg==", "requires": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "workbox-recipes": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.1.tgz", - "integrity": "sha512-DGsyKygHggcGPQpWafC/Nmbm1Ny3sB2vE9r//3UbeidXiQ+pLF14KEG1/0NNGRaY+lfOXOagq6d1H7SC8KA+rA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.2.tgz", + "integrity": "sha512-2lcUKMYDiJKvuvRotOxLjH2z9K7jhj8GNUaHxHNkJYbTCUN3LsX1cWrsgeJFDZ/LgI565t3fntpbG9J415ZBXA==", "requires": { - "workbox-cacheable-response": "6.5.1", - "workbox-core": "6.5.1", - "workbox-expiration": "6.5.1", - "workbox-precaching": "6.5.1", - "workbox-routing": "6.5.1", - "workbox-strategies": "6.5.1" + "workbox-cacheable-response": "6.5.2", + "workbox-core": "6.5.2", + "workbox-expiration": "6.5.2", + "workbox-precaching": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" } }, "workbox-routing": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.1.tgz", - "integrity": "sha512-yAAncdTwanvlR8KPjubyvFKeAok8ZcIws6UKxvIAg0I+wsf7UYi93DXNuZr6RBSQrByrN6HkCyjuhmk8P63+PA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.2.tgz", + "integrity": "sha512-nR1w5PjF6IVwo0SX3oE88LhmGFmTnqqU7zpGJQQPZiKJfEKgDENQIM9mh3L1ksdFd9Y3CZVkusopHfxQvit/BA==", "requires": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "workbox-strategies": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.1.tgz", - "integrity": "sha512-JNaTXPy8wXzKkr+6za7/eJX9opoZk7UgY261I2kPxl80XQD8lMjz0vo9EOcBwvD72v3ZhGJbW84ZaDwFEhFvWA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.2.tgz", + "integrity": "sha512-fgbwaUMxbG39BHjJIs2y2X21C0bmf1Oq3vMQxJ1hr6y5JMJIm8rvKCcf1EIdAr+PjKdSk4ddmgyBQ4oO8be4Uw==", "requires": { - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "workbox-streams": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.1.tgz", - "integrity": "sha512-7jaTWm6HRGJ/ewECnhb+UgjTT50R42E0/uNCC4eTKQwnLO/NzNGjoXTdQgFjo4zteR+L/K6AtFAiYKH3ZJbAYw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.2.tgz", + "integrity": "sha512-ovD0P4UrgPtZ2Lfc/8E8teb1RqNOSZr+1ZPqLR6sGRZnKZviqKbQC3zVvvkhmOIwhWbpL7bQlWveLVONHjxd5w==", "requires": { - "workbox-core": "6.5.1", - "workbox-routing": "6.5.1" + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2" } }, "workbox-sw": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.1.tgz", - "integrity": "sha512-hVrQa19yo9wzN1fQQ/h2JlkzFpkuH2qzYT2/rk7CLaWt6tLnTJVFCNHlGRRPhytZSf++LoIy7zThT714sowT/Q==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.2.tgz", + "integrity": "sha512-2KhlYqtkoqlnPdllj2ujXUKRuEFsRDIp6rdE4l1PsxiFHRAFaRTisRQpGvRem5yxgXEr+fcEKiuZUW2r70KZaw==" }, "workbox-webpack-plugin": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.1.tgz", - "integrity": "sha512-SHtlQBpKruI16CAYhICDMkgjXE2fH5Yp+D+1UmBfRVhByZYzusVOykvnPm8ObJb9d/tXgn9yoppoxafFS7D4vQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-StrJ7wKp5tZuGVcoKLVjFWlhDy+KT7ZWsKnNcD6F08wA9Cpt6JN+PLIrplcsTHbQpoAV8+xg6RvcG0oc9z+RpQ==", "requires": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", "upath": "^1.2.0", "webpack-sources": "^1.4.3", - "workbox-build": "6.5.1" + "workbox-build": "6.5.2" }, "dependencies": { "source-map": { @@ -30341,12 +30282,12 @@ } }, "workbox-window": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.1.tgz", - "integrity": "sha512-oRlun9u7b7YEjo2fIDBqJkU2hXtrEljXcOytRhfeQRbqXxjUOpFgXSGRSAkmDx1MlKUNOSbr+zfi8h5n7In3yA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.2.tgz", + "integrity": "sha512-2kZH37r9Wx8swjEOL4B8uGM53lakMxsKkQ7mOKzGA/QAn/DQTEZGrdHWtypk2tbhKY5S0jvPS+sYDnb2Z3378A==", "requires": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.1" + "workbox-core": "6.5.2" } }, "wrap-ansi": { diff --git a/interface/package.json b/interface/package.json index 2cdaa7403..adf5abcec 100644 --- a/interface/package.json +++ b/interface/package.json @@ -9,7 +9,7 @@ "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.5.1", "@mui/material": "^5.5.3", - "@types/lodash": "^4.14.180", + "@types/lodash": "^4.14.181", "@types/node": "^17.0.23", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", @@ -22,8 +22,8 @@ "notistack": "^2.0.3", "parse-ms": "^3.0.0", "react": "^17.0.2", - "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", + "react-app-rewired": "^2.2.1", "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", "react-router-dom": "^6.2.2", From 4bcbcf4e3a7a416e483cbddb740bd5df402efde4 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 29 Mar 2022 18:15:38 +0200 Subject: [PATCH 150/319] update test data --- mock-api/server.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mock-api/server.js b/mock-api/server.js index 8770c5bd6..b0e4e9b61 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -488,11 +488,11 @@ const emsesp_devicedata_1 = { const emsesp_devicedata_2 = { label: 'Boiler: Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i', data: [ + { u: 0, n: '08reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, { v: 'false', u: 0, n: '08heating active' }, - { v: 'false', u: 0, n: '08tapwater active' }, - { u: 0, n: '00reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, - { v: 5, u: 1, n: '00selected flow temperature', c: 'selflowtemp' }, - { v: 0, u: 3, n: '00burner selected max power', c: 'selburnpow' }, + { v: 'false', u: 0, n: '04tapwater active' }, + { v: 5, u: 1, n: '04selected flow temperature', c: 'selflowtemp' }, + { v: 0, u: 3, n: '0Eburner selected max power', c: 'selburnpow' }, { v: 0, u: 3, n: '00heating pump modulation' }, { v: 53.4, u: 1, n: '00current flow temperature' }, { v: 52.7, u: 1, n: '00return temperature' }, From 4118a576de851f68d4a146a02e0c0c3b7febbee3 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 29 Mar 2022 18:15:55 +0200 Subject: [PATCH 151/319] enum for dv flags --- interface/src/project/types.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 147b4b4ab..a2c2d9185 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -283,3 +283,11 @@ export interface WriteAnalog { uom: number; type: number; } + +export enum DeviceEntityMask { + DV_DEFAULT = 0, + DV_WEB_EXCLUDE = 1, + DV_API_MQTT_EXCLUDE = 2, + DV_READONLY = 4, + DV_FAVORITE = 8 +} From a5ba70a6d74e39b08e34c3630095c0fd41cfd124 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 29 Mar 2022 18:32:28 +0200 Subject: [PATCH 152/319] some cosmetic changes --- interface/src/project/SettingsCustomization.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 136c3d951..94913af6f 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -46,7 +46,7 @@ const StyledTableCell = styled(TableCell)(({ theme }) => ({ fontSize: 11 }, [`&.${tableCellClasses.body}`]: { - fontSize: 11 + fontSize: 12 } })); @@ -60,7 +60,7 @@ const SettingsCustomization: FC = () => { const [confirmReset, setConfirmReset] = useState(false); // eslint-disable-next-line - const [masks, setMasks] = useState(() => ['1']); + const [masks, setMasks] = useState(() => ['']); const fetchDevices = useCallback(async () => { try { @@ -119,10 +119,10 @@ const SettingsCustomization: FC = () => { You can mark an entity as a favorite to be listed first in the Dashboard ( - ) ,or remove it entirely from the Dashboard ( - ) ,or disable it's write operation ( - ) or have it excluded from the MQTT and API outputs ( - + ) ,or remove it entirely from the Dashboard ( + ) ,or disable it's write operation ( + ) or have it excluded from the MQTT and API outputs ( + ). From d3002ce41532cb7912b8775d10c4036e3368af61 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 29 Mar 2022 18:32:47 +0200 Subject: [PATCH 153/319] show all mask icons --- interface/src/project/DashboardData.tsx | 65 ++++++++++++------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index ba589b513..a67b05c9c 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -39,6 +39,8 @@ import SaveIcon from '@mui/icons-material/Save'; import RemoveIcon from '@mui/icons-material/RemoveCircleOutline'; import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder'; import PlayArrowIcon from '@mui/icons-material/PlayArrow'; +import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; +import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; import DeviceIcon from './DeviceIcon'; @@ -64,7 +66,8 @@ import { AnalogType, AnalogTypeNames, Sensor, - Analog + Analog, + DeviceEntityMask } from './types'; const StyledTableCell = styled(TableCell)(({ theme }) => ({ @@ -487,39 +490,25 @@ const DashboardData: FC = () => { return; } + const hasMask = (entityName: string, mask: number) => (parseInt(entityName.slice(0, 2), 16) & mask) === mask; + const sendCommand = (dv: DeviceValue) => { - if (dv.c && me.admin) { + if (dv.c && me.admin && !hasMask(dv.n, DeviceEntityMask.DV_READONLY)) { setDeviceValue(dv); } }; - const renderNameCell = (dv: DeviceValue) => { - var mask = Number(dv.n.slice(0, 2)); - var name = dv.n.slice(2); - if (dv.v === undefined && dv.c) { - return ( - - {name}  - - - ); - } - - if ((mask & 8) === 8) { - return ( - - {name}  - - - ); - } - - return ( - - {name} - - ); - }; + const renderNameCell = (dv: DeviceValue) => ( + <> + {dv.n.slice(2)}  + {hasMask(dv.n, DeviceEntityMask.DV_FAVORITE) && } + {hasMask(dv.n, DeviceEntityMask.DV_READONLY) && } + {hasMask(dv.n, DeviceEntityMask.DV_API_MQTT_EXCLUDE) && ( + + )} + {dv.v === undefined && dv.c && } + + ); return ( <> @@ -536,17 +525,27 @@ const DashboardData: FC = () => { {deviceData.data.map((dv, i) => ( - sendCommand(dv)}> + sendCommand(dv)} + // sx={ + // hasMask(dv.n, DeviceEntityMask.DV_FAVORITE) + // ? { backgroundColor: '#334900' } + // : { backgroundColor: 'black' } + // } + > - {dv.c && me.admin && ( + {dv.c && me.admin && !hasMask(dv.n, DeviceEntityMask.DV_READONLY) && ( )} - {renderNameCell(dv)} + + {renderNameCell(dv)} + {formatValue(dv.v, dv.u)} - + ))} From 5096964825790607f65efb0bbe713d96ce23250b Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 29 Mar 2022 18:38:23 +0200 Subject: [PATCH 154/319] put total at start of description #418 --- src/locale_EN.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/locale_EN.h b/src/locale_EN.h index 2939a63f7..9ba68d017 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -456,7 +456,7 @@ MAKE_PSTR_LIST(maintenanceType, F_(maintenance), F("maintenance scheduled")) MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("time to next maintenance")) // heatpump/compress specific -MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("operating time total heat")) +MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("total operating time heat")) MAKE_PSTR_LIST(upTimeCompHeating, F("uptimecompheating"), F("operating time compressor heating")) MAKE_PSTR_LIST(upTimeCompCooling, F("uptimecompcooling"), F("operating time compressor cooling")) MAKE_PSTR_LIST(upTimeCompWw, F("uptimecompww"), F("operating time compressor dhw")) @@ -466,7 +466,7 @@ MAKE_PSTR_LIST(heatingStarts, F("heatingstarts"), F("heating control starts")) MAKE_PSTR_LIST(coolingStarts, F("coolingstarts"), F("cooling control starts")) MAKE_PSTR_LIST(poolStarts, F("poolstarts"), F("pool control starts")) MAKE_PSTR_LIST(nrgConsTotal, F("nrgconstotal"), F("total energy consumption")) -MAKE_PSTR_LIST(nrgConsCompTotal, F("nrgconscomptotal"), F("energy consumption compressor total")) +MAKE_PSTR_LIST(nrgConsCompTotal, F("nrgconscomptotal"), F("total energy consumption compressor")) MAKE_PSTR_LIST(nrgConsCompHeating, F("nrgconscompheating"), F("energy consumption compressor heating")) MAKE_PSTR_LIST(nrgConsCompWw, F("nrgconscompww"), F("energy consumption compressor dhw")) MAKE_PSTR_LIST(nrgConsCompCooling, F("nrgconscompcooling"), F("energy consumption compressor cooling")) @@ -476,7 +476,7 @@ MAKE_PSTR_LIST(nrgSuppHeating, F("nrgsuppheating"), F("total energy supplied hea MAKE_PSTR_LIST(nrgSuppWw, F("nrgsuppww"), F("total energy warm supplied dhw")) MAKE_PSTR_LIST(nrgSuppCooling, F("nrgsuppcooling"), F("total energy supplied cooling")) MAKE_PSTR_LIST(nrgSuppPool, F("nrgsupppool"), F("total energy supplied pool")) -MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, F("auxelecheatnrgconstotal"), F("auxiliary electrical heater energy consumption total")) +MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, F("auxelecheatnrgconstotal"), F("total auxiliary electrical heater energy consumption")) MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, F("auxelecheatnrgconsheating"), F("auxiliary electrical heater energy consumption heating")) MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("auxiliary electrical heater energy consumption dhw")) MAKE_PSTR_LIST(auxElecHeatNrgConsPool, F("auxelecheatnrgconspool"), F("auxiliary electrical heater energy consumption pool")) @@ -683,8 +683,8 @@ MAKE_PSTR_LIST(pumpWorkTime, F("pumpworktime"), F("pump working time")) MAKE_PSTR_LIST(pump2WorkTime, F("pump2worktime"), F("pump 2 working time")) MAKE_PSTR_LIST(m1WorkTime, F("m1worktime"), F("differential control working time")) MAKE_PSTR_LIST(energyLastHour, F("energylasthour"), F("energy last hour")) -MAKE_PSTR_LIST(energyTotal, F("energytotal"), F("energy total")) -MAKE_PSTR_LIST(energyToday, F("energytoday"), F("energy today")) +MAKE_PSTR_LIST(energyTotal, F("energytotal"), F("total energy")) +MAKE_PSTR_LIST(energyToday, F("energytoday"), F("total energy today")) MAKE_PSTR_LIST(pumpMinMod, F("pumpminmod"), F("minimum pump modulation")) MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximum solar flow")) MAKE_PSTR_LIST(solarPower, F("solarpower"), F("actual solar power")) From 07b438f6f08aebbe6c5bcd5560e431be14f8a477 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 29 Mar 2022 18:40:32 +0200 Subject: [PATCH 155/319] add NTP status to mqtt/ha (heartbeat) and log --- src/mqtt.cpp | 1 + src/system.cpp | 21 +++++++++++++++++++++ src/system.h | 9 ++++----- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 63e52670a..3733e3a93 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -648,6 +648,7 @@ void Mqtt::ha_status() { } publish_system_ha_sensor_config(DeviceValueType::INT, F("Uptime"), F("uptime"), DeviceValueUOM::NONE); publish_system_ha_sensor_config(DeviceValueType::INT, F("Uptime (sec)"), F("uptime_sec"), DeviceValueUOM::SECONDS); + publish_system_ha_sensor_config(DeviceValueType::BOOL, F("NTP status"), F("ntp_status"), DeviceValueUOM::NONE); publish_system_ha_sensor_config(DeviceValueType::INT, F("Free memory"), F("freemem"), DeviceValueUOM::KB); publish_system_ha_sensor_config(DeviceValueType::INT, F("MQTT fails"), F("mqttfails"), DeviceValueUOM::NONE); publish_system_ha_sensor_config(DeviceValueType::INT, F("Rx received"), F("rxreceived"), DeviceValueUOM::NONE); diff --git a/src/system.cpp b/src/system.cpp index 630936548..d01726b4e 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -543,6 +543,18 @@ bool System::heartbeat_json(JsonObject & output) { output["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); output["uptime_sec"] = uuid::get_uptime_sec(); + bool value_b = EMSESP::system_.ntp_connected(); + if (Mqtt::ha_enabled()) { + char s[7]; + output["ntp_status"] = Helpers::render_boolean(s, value_b); // for HA always render as string + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { + output["ntp_status"] = value_b; + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + output["ntp_status"] = value_b ? 1 : 0; + } else { + char s[7]; + output["ntp_status"] = Helpers::render_boolean(s, value_b); + } output["rxreceived"] = EMSESP::rxservice_.telegram_count(); output["rxfails"] = EMSESP::rxservice_.telegram_error_count(); output["txreads"] = EMSESP::txservice_.telegram_read_count(); @@ -1323,4 +1335,13 @@ std::string System::reset_reason(uint8_t cpu) const { return ("Unkonwn"); } +// set NTP status +void System::ntp_connected(bool b) { + if (b != ntp_connected_) { + LOG_INFO(b ? F("NTP connected") : F("NTP disconnected")); + } + ntp_connected_ = b; + ntp_last_check_ = b ? uuid::get_uptime_sec() : 0; +} + } // namespace emsesp diff --git a/src/system.h b/src/system.h index 83576b5a8..3c38dab3b 100644 --- a/src/system.h +++ b/src/system.h @@ -154,14 +154,13 @@ class System { ethernet_connected_ = b; } - void ntp_connected(bool b) { - ntp_connected_ = b; - ntp_last_check_ = b ? uuid::get_uptime_sec() : 0; - } + void ntp_connected(bool b); bool ntp_connected() { // timeout 2 hours, ntp sync is normally every hour. - ntp_connected_ = (uuid::get_uptime_sec() - ntp_last_check_ > 7201) ? false : ntp_connected_; + if ((uuid::get_uptime_sec() - ntp_last_check_ > 7201) && ntp_connected_) { + ntp_connected(false); + } return ntp_connected_; } From 9e5fdb7cb137743d3dd61bbb56b9635e547d4096 Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 30 Mar 2022 13:15:25 +0200 Subject: [PATCH 156/319] use boolean rendering to fix Web errors with enums --- src/emsdevice.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index ea0db7ba0..7236f74ae 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -725,8 +725,9 @@ void EMSdevice::generate_values_web(JsonObject & output) { } } else if (dv.type == DeviceValueType::BOOL) { JsonArray l = obj.createNestedArray("l"); - l.add("off"); - l.add("on"); + char result[10]; + l.add(Helpers::render_boolean(result, false)); + l.add(Helpers::render_boolean(result, true)); } // add command help template else if (dv.type == DeviceValueType::STRING || dv.type == DeviceValueType::CMD) { @@ -861,10 +862,6 @@ void EMSdevice::mask_entity(const std::string & entity_id) { for (auto & dv : devicevalues_) { std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); if (entity == entity_id.substr(2)) { -#if defined(EMSESP_USE_SERIAL) - Serial.print("mask_entity() Removing Visible for device value: "); - Serial.println(read_flash_string(dv.full_name).c_str()); -#endif dv.state = (dv.state & 0x0F) | (flag << 4); // set state high bits to flag, turn off active and ha flags return; } @@ -1217,7 +1214,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c return has_values; } -// remove the Home Assistant configs for each device value/entity if its not visible or active +// remove the Home Assistant configs for each device value/entity if its not visible or active or marked as read-only // this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() void EMSdevice::mqtt_ha_entity_config_remove() { for (auto & dv : devicevalues_) { From cb9ddb299ab12073d6415a32504d2b4bcf4d6a13 Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 30 Mar 2022 13:15:38 +0200 Subject: [PATCH 157/319] show commands differently --- interface/src/project/DashboardData.tsx | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index a67b05c9c..21cf4072c 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -158,6 +158,8 @@ const DashboardData: FC = () => { } }; + const isCmdOnly = (dv: DeviceValue) => dv.v === undefined && dv.c; + function formatValue(value: any, uom: number) { if (value === undefined) { return ''; @@ -218,7 +220,7 @@ const DashboardData: FC = () => { if (deviceValue) { return ( setDeviceValue(undefined)}> - Change Value + {isCmdOnly(deviceValue) ? 'Run Command' : 'Change Value'} {deviceValue.l && ( { {hasMask(dv.n, DeviceEntityMask.DV_API_MQTT_EXCLUDE) && ( )} - {dv.v === undefined && dv.c && } ); @@ -519,21 +520,13 @@ const DashboardData: FC = () => { - ENTITY NAME/COMMAND + ENTITY NAME VALUE {deviceData.data.map((dv, i) => ( - sendCommand(dv)} - // sx={ - // hasMask(dv.n, DeviceEntityMask.DV_FAVORITE) - // ? { backgroundColor: '#334900' } - // : { backgroundColor: 'black' } - // } - > + sendCommand(dv)}> {dv.c && me.admin && !hasMask(dv.n, DeviceEntityMask.DV_READONLY) && ( @@ -544,8 +537,10 @@ const DashboardData: FC = () => { {renderNameCell(dv)} - {formatValue(dv.v, dv.u)} - + + {isCmdOnly(dv) ? : formatValue(dv.v, dv.u)} + +
))} From 84e21ab9924d233a95a191ed8571041a209c984e Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 30 Mar 2022 13:15:48 +0200 Subject: [PATCH 158/319] layout changes to help text --- .../src/project/SettingsCustomization.tsx | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 94913af6f..14a0ceb43 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -116,14 +116,27 @@ const SettingsCustomization: FC = () => { return ( <> - - - You can mark an entity as a favorite to be listed first in the Dashboard ( - ) ,or remove it entirely from the Dashboard ( - ) ,or disable it's write operation ( - ) or have it excluded from the MQTT and API outputs ( + + Select a device and customize each entity using the options: + +   + +  mark it as favorite to be listed at the top of the Dashboard + + +   + +  hide from the Dashboard + + +   + +  make it read-only (if it has write operation available) + + +   - ). +  excluded it from MQTT and API outputs Date: Wed, 30 Mar 2022 15:55:24 +0200 Subject: [PATCH 159/319] recreate ha config on readonly changes --- src/emsdevice.cpp | 9 +++++++-- src/emsdevicevalue.h | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 7236f74ae..00c05b64d 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -858,11 +858,16 @@ void EMSdevice::reset_entity_masks() { // disable/exclude/mask_out a device entity based on the id void EMSdevice::mask_entity(const std::string & entity_id) { // first character contains mask flags - uint8_t flag = Helpers::hextoint(entity_id.substr(0, 2).c_str()); + uint8_t flag = (Helpers::hextoint(entity_id.substr(0, 2).c_str()) << 4); for (auto & dv : devicevalues_) { std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); if (entity == entity_id.substr(2)) { - dv.state = (dv.state & 0x0F) | (flag << 4); // set state high bits to flag, turn off active and ha flags + // remove ha config on change of dv_readonly flag + if (Mqtt::ha_enabled() && ((dv.state ^ flag) & DeviceValueState::DV_READONLY)) { + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) + } + dv.state = (dv.state & 0x0F) | flag; // set state high bits to flag return; } } diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 5b8c358ea..dee8f3570 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -114,7 +114,7 @@ class DeviceValue { DV_DEFAULT = 0, // 0 - does not yet have a value DV_ACTIVE = (1 << 0), // 1 - has a validated real value DV_HA_CONFIG_CREATED = (1 << 1), // 2 - set if the HA config topic has been created - DV_HA_CLIMATE_NO_RT = (1 << 2), // 3 - climate created without roomTemp + DV_HA_CLIMATE_NO_RT = (1 << 2), // 4 - climate created without roomTemp // high nibble as mask for exclusions & special functions DV_WEB_EXCLUDE = (1 << 4), // 16 - not shown on web From 55d7ef10363f90e1d66e36cb28703df14f3ba24e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 30 Mar 2022 15:56:05 +0200 Subject: [PATCH 160/319] boiler Errormessage 0xBF to trigger 0xC2 reading --- src/devices/boiler.cpp | 6 ++++++ src/devices/boiler.h | 1 + 2 files changed, 7 insertions(+) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index f52c5fd3d..462bcbbaa 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -48,6 +48,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const // the telegram handlers... // common for all boilers + register_telegram_type(0xBF, F("ErrorMessage"), false, MAKE_PF_CB(process_ErrorMessage)); register_telegram_type(0x10, F("UBAErrorMessage1"), false, MAKE_PF_CB(process_UBAErrorMessage)); register_telegram_type(0x11, F("UBAErrorMessage2"), false, MAKE_PF_CB(process_UBAErrorMessage)); register_telegram_type(0xC2, F("UBAErrorMessage3"), false, MAKE_PF_CB(process_UBAErrorMessage2)); @@ -872,6 +873,11 @@ void Boiler::process_UBAMaintenanceStatus(std::shared_ptr telegr } } +// 0xBF +void Boiler::process_ErrorMessage(std::shared_ptr telegram) { + EMSESP::send_read_request(0xC2, device_id()); // read last errorcode +} + // 0x10, 0x11 void Boiler::process_UBAErrorMessage(std::shared_ptr telegram) { if (telegram->offset > 0 || telegram->message_length < 11) { diff --git a/src/devices/boiler.h b/src/devices/boiler.h index a6e90b44f..d83821457 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -210,6 +210,7 @@ class Boiler : public EMSdevice { void process_MC110Status(std::shared_ptr telegram); void process_UBAMaintenanceStatus(std::shared_ptr telegram); void process_UBAMaintenanceData(std::shared_ptr telegram); + void process_ErrorMessage(std::shared_ptr telegram); void process_UBAErrorMessage(std::shared_ptr telegram); void process_UBAErrorMessage2(std::shared_ptr telegram); void process_UBAMonitorWWPlus(std::shared_ptr telegram); From 744154ccf46fc61b77be3fee28a6b4647bc4ed4f Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 30 Mar 2022 20:59:30 +0200 Subject: [PATCH 161/319] make customization change test data --- mock-api/server.js | 217 +++++++++++++++++++++++++-------------------- 1 file changed, 123 insertions(+), 94 deletions(-) diff --git a/mock-api/server.js b/mock-api/server.js index b0e4e9b61..5b2d5c7d6 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -344,7 +344,7 @@ const emsesp_devices = { i: 1, d: 23, p: 77, - s: 'Thermostat1 (RC20/Moduline 300)', + s: 'Thermostat (RC20/Moduline 300)', }, { i: 2, @@ -356,7 +356,7 @@ const emsesp_devices = { i: 4, d: 16, p: 165, - s: 'Thermostat2 (RC100/Moduline 1000/1010)', + s: 'Thermostat (RC100/Moduline 1000/1010)', }, ], } @@ -377,7 +377,7 @@ const emsesp_coredata = { { i: 1, t: 'Thermostat', - s: 'Thermostat1', + s: 'Thermostat', b: '', n: 'RC20/Moduline 300', d: 23, @@ -388,7 +388,7 @@ const emsesp_coredata = { { i: 4, t: 'Thermostat', - s: 'Thermostat2', + s: 'Thermostat', b: 'Buderus', n: 'RC100/Moduline 1000/1010', d: 16, @@ -596,29 +596,28 @@ const emsesp_deviceentities_1 = [ n: 'error code', s: 'errorcode', m: 0, - i: 1, + w: false, }, { v: '14:54:39 06/06/2021', n: 'date/time', s: 'datetime', m: 0, - i: 2, + w: false, }, { - v: 18.22, + v: 18.2, n: 'hc1 selected room temperature', s: 'hc1/seltemp', m: 0, w: true, - i: 3, }, { v: 22.6, n: 'hc1 current room temperature', s: 'hc1/curtemp', m: 0, - i: 4, + w: false, }, { v: 'auto', @@ -626,90 +625,89 @@ const emsesp_deviceentities_1 = [ s: 'hc1/mode', m: 0, w: true, - i: 5, }, ] const emsesp_deviceentities_2 = [ - { v: false, n: 'heating active', s: 'heatingactive', m: 0, i: 1 }, - { v: false, n: 'tapwater active', s: 'tapwateractive', m: 0, i: 2 }, - { v: 5, n: 'selected flow temperature', s: 'selflowtemp', m: 0, i: 3 }, - { v: 0, n: 'burner selected max power', s: 'selburnpow', m: 0, i: 4 }, - { v: 0, n: 'heating pump modulation', s: 'heatingpumpmod', m: 0, i: 5 }, - { n: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 2, i: 6 }, - { n: 'outside temperature', s: 'outdoortemp', m: 2, i: 7 }, - { v: 53, n: 'current flow temperature', s: 'curflowtemp', m: 0, i: 8 }, - { v: 51.8, n: 'return temperature', s: 'rettemp', m: 0, i: 9 }, - { n: 'mixing switch temperature', s: 'switchtemp', m: 2, i: 10 }, - { v: 1.3, n: 'system pressure', s: 'syspress', m: 0, i: 11 }, - { v: 54.6, n: 'actual boiler temperature', s: 'boiltemp', m: 0, i: 12 }, - { n: 'exhaust temperature', s: 'exhausttemp', m: 2, i: 13 }, - { v: false, n: 'gas', s: 'burngas', m: 0, i: 14 }, - { v: false, n: 'gas stage 2', s: 'burngas2', m: 0, i: 15 }, - { v: 0, n: 'flame current', s: 'flamecurr', m: 0, i: 16 }, - { v: false, n: 'heating pump', s: 'heatingpump', m: 0, i: 17 }, - { v: false, n: 'fan', s: 'fanwork', m: 0, i: 18 }, - { v: false, n: 'ignition', s: 'ignwork', m: 0, i: 19 }, - { v: false, n: 'oil preheating', s: 'oilpreheat', m: 0, i: 20 }, - { v: true, n: 'heating activated', s: 'heatingactivated', m: 0, i: 21 }, - { v: 80, n: 'heating temperature', s: 'heatingtemp', m: 0, i: 22 }, - { v: 70, n: 'burner pump max power', s: 'pumpmodmax', m: 0, i: 23 }, - { v: 30, n: 'burner pump min power', s: 'pumpmodmin', m: 0, i: 24 }, - { v: 1, n: 'pump delay', s: 'pumpdelay', m: 0, i: 25 }, - { v: 10, n: 'burner min period', s: 'burnminperiod', m: 0, i: 26 }, - { v: 0, n: 'burner min power', s: 'burnminpower', m: 0, i: 27 }, - { v: 50, n: 'burner max power', s: 'burnmaxpower', m: 0, i: 28 }, - { v: -6, n: 'hysteresis on temperature', s: 'boilhyston', m: 0, i: 29 }, - { v: 6, n: 'hysteresis off temperature', s: 'boilhystoff', m: 0, i: 30 }, - { v: 0, n: 'set flow temperature', s: 'setflowtemp', m: 0, i: 31 }, - { v: 0, n: 'burner set power', s: 'setburnpow', m: 0, i: 32 }, - { v: 0, n: 'burner current power', s: 'curburnpow', m: 0, i: 33 }, - { v: 326323, n: 'burner starts', s: 'burnstarts', m: 0, i: 34 }, - { v: 553437, n: 'total burner operating time', s: 'burnworkmin', m: 0, i: 35 }, - { v: 451286, n: 'total heat operating time', s: 'heatworkmin', m: 0, i: 36 }, - { v: 4672175, n: 'total UBA operating time', s: 'ubauptime', m: 0, i: 37 }, - { v: '1C(210) 06.06.2020 12:07 (0 min)', n: 'last error code', s: 'lastcode', m: 0, i: 38 }, - { v: '0H', n: 'service code', s: 'servicecode', m: 0, i: 39 }, - { v: 203, n: 'service code number', s: 'servicecodenumber', m: 0, i: 40 }, - { v: 'H00', n: 'maintenance message', s: 'maintenancemessage', m: 0, i: 41 }, - { v: 'manual', n: 'maintenance scheduled', s: 'maintenance', m: 0, i: 42 }, - { v: 6000, n: 'time to next maintenance', s: 'maintenancetime', m: 0, i: 43 }, - { v: '01.01.2012', n: 'next maintenance date', s: 'maintenancedate', m: 0, i: 44 }, - { v: true, n: 'dhw turn on/off', s: 'wwtapactivated', m: 0, i: 45 }, - { v: 62, n: 'dhw set temperature', s: 'wwsettemp', m: 0, i: 46 }, - { v: 60, n: 'dhw selected temperature', s: 'wwseltemp', m: 0, i: 47 }, - { n: 'dhw selected lower temperature', s: 'wwseltemplow', m: 2, i: 48 }, - { n: 'dhw selected temperature for off', s: 'wwseltempoff', m: 2, i: 49 }, - { n: 'dhw single charge temperature', s: 'wwseltempsingle', m: 2, i: 50 }, - { v: 'flow', n: 'dhw type', s: 'wwtype', m: 0, i: 51 }, - { v: 'hot', n: 'dhw comfort', s: 'wwcomfort', m: 0, i: 52 }, - { v: 40, n: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0, i: 53 }, - { v: 100, n: 'dhw max power', s: 'wwmaxpower', m: 0, i: 54 }, - { v: false, n: 'dhw circulation pump available', s: 'wwcircpump', m: 0, i: 55 }, - { v: '3-way valve', n: 'dhw charging type', s: 'wwchargetype', m: 0, i: 56 }, - { v: -5, n: 'dhw hysteresis on temperature', s: 'wwhyston', m: 0, i: 57 }, - { v: 0, n: 'dhw hysteresis off temperature', s: 'wwhystoff', m: 0, i: 58 }, - { v: 70, n: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', m: 0, i: 59 }, - { v: 'off', n: 'dhw circulation pump mode', s: 'wwcircmode', m: 0, i: 60 }, - { v: false, n: 'dhw circulation active', s: 'wwcirc', m: 0, i: 61 }, - { v: 46.4, n: 'dhw current intern temperature', s: 'wwcurtemp', m: 0, i: 62 }, - { n: 'dhw current extern temperature', s: 'wwcurtemp2', m: 2, i: 63 }, - { v: 0, n: 'dhw current tap water flow', s: 'wwcurflow', m: 0, i: 64 }, - { v: 46.3, n: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0, i: 65 }, - { n: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 2, i: 66 }, - { v: true, n: 'dhw activated', s: 'wwactivated', m: 0, i: 67 }, - { v: false, n: 'dhw one time charging', s: 'wwonetime', m: 0, i: 68 }, - { v: false, n: 'dhw disinfecting', s: 'wwdisinfecting', m: 0, i: 69 }, - { v: false, n: 'dhw charging', s: 'wwcharging', m: 0, i: 70 }, - { v: false, n: 'dhw recharging', s: 'wwrecharging', m: 0, i: 71 }, - { v: true, n: 'dhw temperature ok', s: 'wwtempok', m: 0, i: 72 }, - { v: false, n: 'dhw active', s: 'wwactive', m: 0, i: 73 }, - { v: true, n: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0, i: 74 }, - { v: 0, n: 'dhw set pump power', s: 'wwsetpumppower', m: 0, i: 75 }, - { n: 'dhw mixer temperature', s: 'wwmixertemp', m: 2, i: 76 }, - { n: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 2, i: 77 }, - { v: 288768, n: 'dhw starts', s: 'wwstarts', m: 0, i: 78 }, - { v: 102151, n: 'dhw active time', s: 'wwworkm', m: 0, i: 79 }, + { v: false, n: 'heating active', s: 'heatingactive', m: 0 }, + { v: false, n: 'tapwater active', s: 'tapwateractive', m: 0 }, + { v: 5, n: 'selected flow temperature', s: 'selflowtemp', m: 0 }, + { v: 0, n: 'burner selected max power', s: 'selburnpow', m: 0 }, + { v: 0, n: 'heating pump modulation', s: 'heatingpumpmod', m: 0 }, + { n: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 2 }, + { n: 'outside temperature', s: 'outdoortemp', m: 2 }, + { v: 53, n: 'current flow temperature', s: 'curflowtemp', m: 0 }, + { v: 51.8, n: 'return temperature', s: 'rettemp', m: 0 }, + { n: 'mixing switch temperature', s: 'switchtemp', m: 2 }, + { v: 1.3, n: 'system pressure', s: 'syspress', m: 0 }, + { v: 54.6, n: 'actual boiler temperature', s: 'boiltemp', m: 0 }, + { n: 'exhaust temperature', s: 'exhausttemp', m: 2 }, + { v: false, n: 'gas', s: 'burngas', m: 0 }, + { v: false, n: 'gas stage 2', s: 'burngas2', m: 0 }, + { v: 0, n: 'flame current', s: 'flamecurr', m: 0 }, + { v: false, n: 'heating pump', s: 'heatingpump', m: 0 }, + { v: false, n: 'fan', s: 'fanwork', m: 0 }, + { v: false, n: 'ignition', s: 'ignwork', m: 0 }, + { v: false, n: 'oil preheating', s: 'oilpreheat', m: 0 }, + { v: true, n: 'heating activated', s: 'heatingactivated', m: 0 }, + { v: 80, n: 'heating temperature', s: 'heatingtemp', m: 0 }, + { v: 70, n: 'burner pump max power', s: 'pumpmodmax', m: 0 }, + { v: 30, n: 'burner pump min power', s: 'pumpmodmin', m: 0 }, + { v: 1, n: 'pump delay', s: 'pumpdelay', m: 0 }, + { v: 10, n: 'burner min period', s: 'burnminperiod', m: 0 }, + { v: 0, n: 'burner min power', s: 'burnminpower', m: 0 }, + { v: 50, n: 'burner max power', s: 'burnmaxpower', m: 0 }, + { v: -6, n: 'hysteresis on temperature', s: 'boilhyston', m: 0 }, + { v: 6, n: 'hysteresis off temperature', s: 'boilhystoff', m: 0 }, + { v: 0, n: 'set flow temperature', s: 'setflowtemp', m: 0 }, + { v: 0, n: 'burner set power', s: 'setburnpow', m: 0 }, + { v: 0, n: 'burner current power', s: 'curburnpow', m: 0 }, + { v: 326323, n: 'burner starts', s: 'burnstarts', m: 0 }, + { v: 553437, n: 'total burner operating time', s: 'burnworkmin', m: 0 }, + { v: 451286, n: 'total heat operating time', s: 'heatworkmin', m: 0 }, + { v: 4672175, n: 'total UBA operating time', s: 'ubauptime', m: 0 }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', n: 'last error code', s: 'lastcode', m: 0 }, + { v: '0H', n: 'service code', s: 'servicecode', m: 0 }, + { v: 203, n: 'service code number', s: 'servicecodenumber', m: 0 }, + { v: 'H00', n: 'maintenance message', s: 'maintenancemessage', m: 0 }, + { v: 'manual', n: 'maintenance scheduled', s: 'maintenance', m: 0 }, + { v: 6000, n: 'time to next maintenance', s: 'maintenancetime', m: 0 }, + { v: '01.01.2012', n: 'next maintenance date', s: 'maintenancedate', m: 0 }, + { v: true, n: 'dhw turn on/off', s: 'wwtapactivated', m: 0 }, + { v: 62, n: 'dhw set temperature', s: 'wwsettemp', m: 0 }, + { v: 60, n: 'dhw selected temperature', s: 'wwseltemp', m: 0 }, + { n: 'dhw selected lower temperature', s: 'wwseltemplow', m: 2 }, + { n: 'dhw selected temperature for off', s: 'wwseltempoff', m: 2 }, + { n: 'dhw single charge temperature', s: 'wwseltempsingle', m: 2 }, + { v: 'flow', n: 'dhw type', s: 'wwtype', m: 0 }, + { v: 'hot', n: 'dhw comfort', s: 'wwcomfort', m: 0 }, + { v: 40, n: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0 }, + { v: 100, n: 'dhw max power', s: 'wwmaxpower', m: 0 }, + { v: false, n: 'dhw circulation pump available', s: 'wwcircpump', m: 0 }, + { v: '3-way valve', n: 'dhw charging type', s: 'wwchargetype', m: 0 }, + { v: -5, n: 'dhw hysteresis on temperature', s: 'wwhyston', m: 0 }, + { v: 0, n: 'dhw hysteresis off temperature', s: 'wwhystoff', m: 0 }, + { v: 70, n: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', m: 0 }, + { v: 'off', n: 'dhw circulation pump mode', s: 'wwcircmode', m: 0 }, + { v: false, n: 'dhw circulation active', s: 'wwcirc', m: 0 }, + { v: 46.4, n: 'dhw current intern temperature', s: 'wwcurtemp', m: 0 }, + { n: 'dhw current extern temperature', s: 'wwcurtemp2', m: 2 }, + { v: 0, n: 'dhw current tap water flow', s: 'wwcurflow', m: 0 }, + { v: 46.3, n: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0 }, + { n: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 2 }, + { v: true, n: 'dhw activated', s: 'wwactivated', m: 0 }, + { v: false, n: 'dhw one time charging', s: 'wwonetime', m: 0 }, + { v: false, n: 'dhw disinfecting', s: 'wwdisinfecting', m: 0 }, + { v: false, n: 'dhw charging', s: 'wwcharging', m: 0 }, + { v: false, n: 'dhw recharging', s: 'wwrecharging', m: 0 }, + { v: true, n: 'dhw temperature ok', s: 'wwtempok', m: 0 }, + { v: false, n: 'dhw active', s: 'wwactive', m: 0 }, + { v: true, n: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0 }, + { v: 0, n: 'dhw set pump power', s: 'wwsetpumppower', m: 0 }, + { n: 'dhw mixer temperature', s: 'wwmixertemp', m: 2 }, + { n: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 2 }, + { v: 288768, n: 'dhw starts', s: 'wwstarts', m: 0 }, + { v: 102151, n: 'dhw active time', s: 'wwworkm', m: 0 }, ] const emsesp_deviceentities_4 = [ @@ -718,20 +716,21 @@ const emsesp_deviceentities_4 = [ n: 'hc2 selected room temperature', s: 'hc2/seltemp', m: 0, - i: 1, + w: true, }, { + v: 18.5, n: 'hc2 current room temperature', s: 'hc2/curtemp', m: 3, - i: 2, + w: false, }, { v: 'off', n: 'hc2 mode', s: 'hc2/mode', m: 3, - i: 3, + w: true, }, ] @@ -924,9 +923,39 @@ rest_server.post(EMSESP_DEVICEENTITIES_ENDPOINT, (req, res) => { } }) +function myF(entity, de, dd) { + const name = entity.slice(2) + const mask = parseInt(entity.slice(0, 2), 16) + const mask_hex = entity.slice(0, 2) + + objIndex = de.findIndex((obj) => obj.s == name) + if (objIndex !== -1) { + de[objIndex].m = mask + const fullname = de[objIndex].n + objIndex = dd.data.findIndex((obj) => obj.n.slice(2) == fullname) + if (objIndex !== -1) { + dd.data[objIndex].n = mask_hex + fullname + console.log('Updating: ') + console.log(dd.data[objIndex]) + } else { + console.log("can't locate record for " + fullname) + } + } else { + console.log("can't locate record for id " + id) + } +} + rest_server.post(EMSESP_MASKED_ENTITIES_ENDPOINT, (req, res) => { - console.log('list for unique id ' + req.body.id + ' and entities:') - console.log(req.body.entity_ids) + const id = req.body.id + for (const entity of req.body.entity_ids) { + if (id === 1) { + myF(entity, emsesp_deviceentities_1, emsesp_devicedata_1) + } else if (id === 2) { + myF(entity, emsesp_deviceentities_2, emsesp_devicedata_2) + } else if (id === 4) { + myF(entity, emsesp_deviceentities_4, emsesp_devicedata_4) + } + } res.sendStatus(200) }) From 2ebb77ff3765f20c68f764d48ec08dea51047f63 Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 30 Mar 2022 20:59:47 +0200 Subject: [PATCH 162/319] don't prefix a count with more than 1 thermostats --- src/web/WebCustomizationService.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 89cc6af8a..8c81d172c 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -171,6 +171,7 @@ void WebCustomizationService::devices(AsyncWebServerRequest * request) { JsonObject obj = devices.createNestedObject(); obj["i"] = emsdevice->unique_id(); // a unique id + /* // shortname - we prefix the count to make it unique uint8_t device_index = EMSESP::device_index(emsdevice->device_type(), emsdevice->unique_id()); if (device_index) { @@ -179,6 +180,8 @@ void WebCustomizationService::devices(AsyncWebServerRequest * request) { } else { obj["s"] = emsdevice->device_type_name() + " (" + emsdevice->name() + ")"; } + */ + obj["s"] = emsdevice->device_type_name() + " (" + emsdevice->name() + ")"; } } From cf4fa9e76ddf134e760c93732cb52935047b1877 Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 30 Mar 2022 20:59:57 +0200 Subject: [PATCH 163/319] formatting icon table --- .../src/project/SettingsCustomization.tsx | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 14a0ceb43..e9c6cedb8 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -116,28 +116,24 @@ const SettingsCustomization: FC = () => { return ( <> - - Select a device and customize each entity using the options: - -   + + Select a device and customize each of its entities using the options: +  mark it as favorite to be listed at the top of the Dashboard - -   - -  hide from the Dashboard - - -   + -  make it read-only (if it has write operation available) +  make it read-only, only if it has write operation available - -   +  excluded it from MQTT and API outputs + + +  hide it from the Dashboard + { }; return ( - +
OPTIONS @@ -227,7 +223,7 @@ const SettingsCustomization: FC = () => { {deviceEntities.map((de) => ( - + Date: Thu, 31 Mar 2022 12:44:39 +0200 Subject: [PATCH 164/319] seltemp command, check mode first for RC30_n and Junkers --- src/devices/thermostat.cpp | 61 +++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 432817d41..08f08d3b3 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1243,8 +1243,8 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { tm_->tm_min = telegram->message_data[4]; tm_->tm_sec = telegram->message_data[5]; tm_->tm_isdst = telegram->message_data[7] & 0x01; - time_t ttime = mktime(tm_); // thermostat time - if (tset_ && EMSESP::system_.ntp_connected() && has_command(&dateTime_)) { // have NTP time and command + time_t ttime = mktime(tm_); // thermostat time + if (tset_ && EMSESP::system_.ntp_connected() && has_command(&dateTime_)) { // have NTP time and command double difference = difftime(now, ttime); if (difference > 15 || difference < -15) { set_datetime("ntp", -1); // set from NTP @@ -2680,16 +2680,15 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co default: // automatic selection, if no type is defined, we use the standard code validate_typeid = monitor_typeids[hc->hc()]; //get setpoint roomtemp back - if (model == EMS_DEVICE_FLAG_RC35) { - uint8_t mode_ = hc->get_mode(); - if (mode_ == HeatingCircuit::Mode::NIGHT) { - offset = EMS_OFFSET_RC35Set_temp_night; - } else if (mode_ == HeatingCircuit::Mode::DAY) { - offset = EMS_OFFSET_RC35Set_temp_day; - } else { - offset = EMS_OFFSET_RC35Set_seltemp; // https://github.com/emsesp/EMS-ESP/issues/310 - } + uint8_t mode_ = hc->get_mode(); + if (mode_ == HeatingCircuit::Mode::NIGHT) { + offset = EMS_OFFSET_RC35Set_temp_night; + } else if (mode_ == HeatingCircuit::Mode::DAY) { + offset = EMS_OFFSET_RC35Set_temp_day; + } else if (model == EMS_DEVICE_FLAG_RC35) { + offset = EMS_OFFSET_RC35Set_seltemp; // https://github.com/emsesp/EMS-ESP/issues/310 } else { + // RC30_N missing temporary auto temperature https://github.com/emsesp/EMS-ESP32/issues/395 uint8_t modetype = hc->get_mode_type(); offset = (modetype == HeatingCircuit::Mode::NIGHT) ? EMS_OFFSET_RC35Set_temp_night : EMS_OFFSET_RC35Set_temp_day; } @@ -2714,14 +2713,24 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = EMS_OFFSET_JunkersSetMessage_day_temp; break; default: - // automatic selection, if no type is defined, we use the standard code - uint8_t modetype = hc->get_mode_type(); - if (modetype == HeatingCircuit::Mode::NIGHT || modetype == HeatingCircuit::Mode::ECO) { + // automatic selection, if no type is defined, we check mode and modetype + uint8_t mode_ = hc->get_mode(); + if (mode_ == HeatingCircuit::Mode::NIGHT || mode_ == HeatingCircuit::Mode::ECO) { offset = EMS_OFFSET_JunkersSetMessage_night_temp; - } else if (modetype == HeatingCircuit::Mode::DAY || modetype == HeatingCircuit::Mode::HEAT) { + } else if (mode_ == HeatingCircuit::Mode::DAY || mode_ == HeatingCircuit::Mode::HEAT) { offset = EMS_OFFSET_JunkersSetMessage_day_temp; - } else { + } else if (mode_ == HeatingCircuit::Mode::NOFROST) { offset = EMS_OFFSET_JunkersSetMessage_no_frost_temp; + } else { + // auto mode, missing temporary parameter, use modetype https://github.com/emsesp/EMS-ESP32/issues/400 + uint8_t modetype = hc->get_mode_type(); + if (modetype == HeatingCircuit::Mode::NIGHT || modetype == HeatingCircuit::Mode::ECO) { + offset = EMS_OFFSET_JunkersSetMessage_night_temp; + } else if (modetype == HeatingCircuit::Mode::DAY || modetype == HeatingCircuit::Mode::HEAT) { + offset = EMS_OFFSET_JunkersSetMessage_day_temp; + } else { + offset = EMS_OFFSET_JunkersSetMessage_no_frost_temp; + } } break; } @@ -2741,14 +2750,24 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co offset = EMS_OFFSET_JunkersSetMessage2_heat_temp; break; default: - // automatic selection, if no type is defined, we use the standard code - uint8_t modetype = hc->get_mode_type(); - if (modetype == HeatingCircuit::Mode::NIGHT || modetype == HeatingCircuit::Mode::ECO) { + // automatic selection, if no type is defined, we check mode and modetype + uint8_t mode_ = hc->get_mode(); + if (mode_ == HeatingCircuit::Mode::NIGHT || mode_ == HeatingCircuit::Mode::ECO) { offset = EMS_OFFSET_JunkersSetMessage2_eco_temp; - } else if (modetype == HeatingCircuit::Mode::DAY || modetype == HeatingCircuit::Mode::HEAT) { + } else if (mode_ == HeatingCircuit::Mode::DAY || mode_ == HeatingCircuit::Mode::HEAT) { offset = EMS_OFFSET_JunkersSetMessage2_heat_temp; - } else { + } else if (mode_ == HeatingCircuit::Mode::NOFROST) { offset = EMS_OFFSET_JunkersSetMessage2_no_frost_temp; + } else { + // auto mode, missing temporary parameter, use modetype https://github.com/emsesp/EMS-ESP32/issues/400 + uint8_t modetype = hc->get_mode_type(); + if (modetype == HeatingCircuit::Mode::NIGHT || modetype == HeatingCircuit::Mode::ECO) { + offset = EMS_OFFSET_JunkersSetMessage2_eco_temp; + } else if (modetype == HeatingCircuit::Mode::DAY || modetype == HeatingCircuit::Mode::HEAT) { + offset = EMS_OFFSET_JunkersSetMessage2_heat_temp; + } else { + offset = EMS_OFFSET_JunkersSetMessage2_no_frost_temp; + } } break; } From eeec7142c78057115d13716303a4cb5eb0e89122 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 31 Mar 2022 13:59:57 +0200 Subject: [PATCH 165/319] fix mode preset after change for different thermostats --- src/devices/thermostat.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 08f08d3b3..e909b3f52 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1968,7 +1968,8 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { break; } - switch (model()) { + uint8_t model_ = model(); + switch (model_) { case EMSdevice::EMS_DEVICE_FLAG_RC10: offset = 0; validate_typeid = 0xB1; @@ -2032,8 +2033,12 @@ bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) { write_command(set_typeid, offset, set_mode_value, validate_typeid); // set hc->mode temporary until validate is received - if (model() == EMSdevice::EMS_DEVICE_FLAG_RC10) { + if (model_ == EMSdevice::EMS_DEVICE_FLAG_RC10) { hc->mode = set_mode_value >> 1; + } else if (model_ == EMSdevice::EMS_DEVICE_FLAG_RC300 || model_ == EMSdevice::EMS_DEVICE_FLAG_RC100) { + hc->mode = set_mode_value ? 1 : 0; + } else if (model_ == EMSdevice::EMS_DEVICE_FLAG_JUNKERS) { + hc->mode = set_mode_value - 1; } else { hc->mode = set_mode_value; } From ad27f76c4aa1f5d762d5418fc4e61456d63ae06c Mon Sep 17 00:00:00 2001 From: Proddy Date: Thu, 31 Mar 2022 21:50:19 +0200 Subject: [PATCH 166/319] update packages --- interface/package-lock.json | 30 +++++++++++++++--------------- interface/package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index e1fb81411..6de544137 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -30,7 +30,7 @@ "react-dom": "^17.0.2", "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", - "react-router-dom": "^6.2.2", + "react-router-dom": "^6.3.0", "react-scripts": "5.0.0", "sockette": "^2.0.6", "typescript": "^4.6.3" @@ -14524,9 +14524,9 @@ } }, "node_modules/react-router": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz", - "integrity": "sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", "dependencies": { "history": "^5.2.0" }, @@ -14535,12 +14535,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz", - "integrity": "sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", "dependencies": { "history": "^5.2.0", - "react-router": "6.2.2" + "react-router": "6.3.0" }, "peerDependencies": { "react": ">=16.8", @@ -27978,20 +27978,20 @@ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, "react-router": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz", - "integrity": "sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", "requires": { "history": "^5.2.0" } }, "react-router-dom": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz", - "integrity": "sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", "requires": { "history": "^5.2.0", - "react-router": "6.2.2" + "react-router": "6.3.0" } }, "react-scripts": { diff --git a/interface/package.json b/interface/package.json index adf5abcec..d821af756 100644 --- a/interface/package.json +++ b/interface/package.json @@ -26,7 +26,7 @@ "react-app-rewired": "^2.2.1", "react-dropzone": "^12.0.4", "react-icons": "^4.3.1", - "react-router-dom": "^6.2.2", + "react-router-dom": "^6.3.0", "react-scripts": "5.0.0", "sockette": "^2.0.6", "typescript": "^4.6.3" From d427a4bd6ce845eae36e6c3f1e92caa6a17b6a73 Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 1 Apr 2022 09:16:12 +0200 Subject: [PATCH 167/319] smaller icons --- .../src/project/SettingsCustomization.tsx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index e9c6cedb8..1e43fcfe8 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -41,12 +41,12 @@ import { DeviceShort, Devices, DeviceEntity } from './types'; const StyledTableCell = styled(TableCell)(({ theme }) => ({ [`&.${tableCellClasses.head}`]: { - backgroundColor: '#607d8b', - color: theme.palette.common.white, - fontSize: 11 + backgroundColor: '#607d8b' + // color: theme.palette.common.white, + // fontSize: 12 }, [`&.${tableCellClasses.body}`]: { - fontSize: 12 + // fontSize: 12 } })); @@ -119,19 +119,19 @@ const SettingsCustomization: FC = () => { Select a device and customize each of its entities using the options: - +  mark it as favorite to be listed at the top of the Dashboard - +  make it read-only, only if it has write operation available - +  excluded it from MQTT and API outputs - +  hide it from the Dashboard @@ -233,16 +233,16 @@ const SettingsCustomization: FC = () => { }} > - + - + - + - + From d747ba0b14924c4eabdafbbbb46c1eaafcd8d238 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 1 Apr 2022 16:01:22 +0200 Subject: [PATCH 168/319] check readonly before set datetime to thermostat --- src/devices/thermostat.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index e909b3f52..d382b307d 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1243,8 +1243,9 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { tm_->tm_min = telegram->message_data[4]; tm_->tm_sec = telegram->message_data[5]; tm_->tm_isdst = telegram->message_data[7] & 0x01; - time_t ttime = mktime(tm_); // thermostat time - if (tset_ && EMSESP::system_.ntp_connected() && has_command(&dateTime_)) { // have NTP time and command + time_t ttime = mktime(tm_); // thermostat time + // correct thermostat clock if we have valid ntp time, and could write the command + if (tset_ && EMSESP::system_.ntp_connected() && !EMSESP::system_.readonly_mode() && has_command(&dateTime_)) { double difference = difftime(now, ttime); if (difference > 15 || difference < -15) { set_datetime("ntp", -1); // set from NTP From 4c2408dfdac65aa22037fc68dd6e9dabb5ede791 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 2 Apr 2022 19:10:04 +0200 Subject: [PATCH 169/319] add ISM2 and DHW module #437 --- src/device_library.h | 4 ++++ src/devices/generic.cpp | 17 +++++++++++++++++ src/devices/generic.h | 6 +++++- src/devices/solar.cpp | 13 +++++++++++++ src/devices/solar.h | 1 + 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/device_library.h b/src/device_library.h index 8d89f7591..f375910e3 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -112,6 +112,7 @@ // Solar Modules - 0x30, 0x2A (for ww) { 73, DeviceType::SOLAR, F("SM10"), DeviceFlags::EMS_DEVICE_FLAG_SM10}, {101, DeviceType::SOLAR, F("ISM1"), DeviceFlags::EMS_DEVICE_FLAG_ISM}, +{103, DeviceType::SOLAR, F("ISM2"), DeviceFlags::EMS_DEVICE_FLAG_ISM}, {162, DeviceType::SOLAR, F("SM50"), DeviceFlags::EMS_DEVICE_FLAG_SM100}, {163, DeviceType::SOLAR, F("SM100/MS100"), DeviceFlags::EMS_DEVICE_FLAG_SM100}, {164, DeviceType::SOLAR, F("SM200/MS200"), DeviceFlags::EMS_DEVICE_FLAG_SM100}, @@ -143,6 +144,9 @@ // Gateways - 0x48 {189, DeviceType::GATEWAY, F("KM200/MB LAN 2"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, +// generic 0x41 DHW module +{100, DeviceType::GENERIC, F("DHW module"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, + // Generic - 0x40 or other with no product-id and no version {0, DeviceType::GENERIC, F("unknown"), DeviceFlags::EMS_DEVICE_FLAG_NONE} diff --git a/src/devices/generic.cpp b/src/devices/generic.cpp index d5a5a72c6..2cb1dfc8d 100644 --- a/src/devices/generic.cpp +++ b/src/devices/generic.cpp @@ -31,11 +31,28 @@ Generic::Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, con register_telegram_type(0x435, F("RFSensorMessage"), false, MAKE_PF_CB(process_RFSensorMessage)); register_device_value(DeviceValueTAG::TAG_NONE, &rfTemp_, DeviceValueType::SHORT, FL_(div10), FL_(RFTemp), DeviceValueUOM::DEGREES); } + if (device_id == 0x41) { // DHW module + register_telegram_type(0x34, F("MonitorWW"), false, MAKE_PF_CB(process_MonitorWW)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCurTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCurTemp2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); + } } + // type 0x435 rf remote sensor void Generic::process_RFSensorMessage(std::shared_ptr telegram) { has_update(telegram, rfTemp_, 0); // is * 10 } +/* + * MonitorWW - type 0x34 - dhw monitor. 10 bytes long + * received every 10 seconds + * Unknown(0x41) -> All(0x00), UBAMonitorWW(0x34), data: 37 02 25 02 25 00 00 00 00 +*/ +void Generic::process_MonitorWW(std::shared_ptr telegram) { + has_update(telegram, wwSetTemp_, 0); + has_update(telegram, wwCurTemp_, 1); + has_update(telegram, wwCurTemp2_, 3); +} } // namespace emsesp diff --git a/src/devices/generic.h b/src/devices/generic.h index 8c1e6427a..e4beb5a44 100644 --- a/src/devices/generic.h +++ b/src/devices/generic.h @@ -30,9 +30,13 @@ class Generic : public EMSdevice { private: static uuid::log::Logger logger_; - int16_t rfTemp_; + int16_t rfTemp_; + uint8_t wwSetTemp_; // DHW set temperature + uint16_t wwCurTemp_; // DHW current temperature + uint16_t wwCurTemp2_; // DHW current temperature storage void process_RFSensorMessage(std::shared_ptr telegram); + void process_MonitorWW(std::shared_ptr telegram); }; } // namespace emsesp diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index 68650deaa..c7a97ad96 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -65,6 +65,7 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c if (flags == EMSdevice::EMS_DEVICE_FLAG_ISM) { register_telegram_type(0x0103, F("ISM1StatusMessage"), true, MAKE_PF_CB(process_ISM1StatusMessage)); register_telegram_type(0x0101, F("ISM1Set"), true, MAKE_PF_CB(process_ISM1Set)); + register_telegram_type(0x0104, F("ISM2StatusMessage"), false, MAKE_PF_CB(process_ISM2StatusMessage)); } // device values... @@ -762,6 +763,18 @@ void Solar::process_ISM1StatusMessage(std::shared_ptr telegram) has_bitupdate(telegram, cylHeated_, 9, 2); // cyl full } +/* + * Junkers ISM12 Solar Module - type 0x0104 EMS+ for heat assist + * ?(0x103), data: 00 00 00 00 00 7A 01 15 00 00 05 37 F0 + * ?(0x104), data: 01 A9 01 22 27 0F 27 0F 27 0F 27 0F 27 0F 27 0F + * ?(0x104), data: 01 01 00 00 00 00 00 27 0F 27 0F (offset 16) + */ +void Solar::process_ISM2StatusMessage(std::shared_ptr telegram) { + has_update(telegram, cylMiddleTemp_, 0); // Temperature Middle of Solar Boiler cyl + has_update(telegram, retHeatAssist_, 2); // return temperature from heating T4 + has_bitupdate(telegram, m1Valve_, 17, 0); // return valve DUW1 (also 16,0) +} + /* * Junkers ISM1 Solar Module - type 0x0101 EMS+ for setting values */ diff --git a/src/devices/solar.h b/src/devices/solar.h index 54920ac84..6d664d81f 100644 --- a/src/devices/solar.h +++ b/src/devices/solar.h @@ -187,6 +187,7 @@ class Solar : public EMSdevice { void process_ISM1StatusMessage(std::shared_ptr telegram); void process_ISM1Set(std::shared_ptr telegram); + void process_ISM2StatusMessage(std::shared_ptr telegram); bool set_CollectorMaxTemp(const char * value, const int8_t id); From 6069af3e90b543f022b3bbb5b1fbca0a58ce4bc3 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Apr 2022 09:43:53 +0200 Subject: [PATCH 170/319] ISM2 missing values, ISM2dhw in solar class --- src/device_library.h | 6 ++--- src/devices/generic.cpp | 16 ------------ src/devices/generic.h | 4 --- src/devices/solar.cpp | 54 ++++++++++++++++++++++++++++++++++------- src/devices/solar.h | 8 +++--- 5 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/device_library.h b/src/device_library.h index f375910e3..2681c409e 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -109,8 +109,9 @@ {191, DeviceType::THERMOSTAT, F("FR120"), DeviceFlags::EMS_DEVICE_FLAG_JUNKERS | DeviceFlags::EMS_DEVICE_FLAG_JUNKERS_OLD}, // older model {192, DeviceType::THERMOSTAT, F("FW120"), DeviceFlags::EMS_DEVICE_FLAG_JUNKERS}, -// Solar Modules - 0x30, 0x2A (for ww) +// Solar Modules - 0x30 (for solar), 0x2A, 0x41 (for ww) { 73, DeviceType::SOLAR, F("SM10"), DeviceFlags::EMS_DEVICE_FLAG_SM10}, +{100, DeviceType::SOLAR, F("ISM DHW"), DeviceFlags::EMS_DEVICE_FLAG_ISM}, {101, DeviceType::SOLAR, F("ISM1"), DeviceFlags::EMS_DEVICE_FLAG_ISM}, {103, DeviceType::SOLAR, F("ISM2"), DeviceFlags::EMS_DEVICE_FLAG_ISM}, {162, DeviceType::SOLAR, F("SM50"), DeviceFlags::EMS_DEVICE_FLAG_SM100}, @@ -144,9 +145,6 @@ // Gateways - 0x48 {189, DeviceType::GATEWAY, F("KM200/MB LAN 2"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, -// generic 0x41 DHW module -{100, DeviceType::GENERIC, F("DHW module"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, - // Generic - 0x40 or other with no product-id and no version {0, DeviceType::GENERIC, F("unknown"), DeviceFlags::EMS_DEVICE_FLAG_NONE} diff --git a/src/devices/generic.cpp b/src/devices/generic.cpp index 2cb1dfc8d..7f7f7c984 100644 --- a/src/devices/generic.cpp +++ b/src/devices/generic.cpp @@ -31,12 +31,6 @@ Generic::Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, con register_telegram_type(0x435, F("RFSensorMessage"), false, MAKE_PF_CB(process_RFSensorMessage)); register_device_value(DeviceValueTAG::TAG_NONE, &rfTemp_, DeviceValueType::SHORT, FL_(div10), FL_(RFTemp), DeviceValueUOM::DEGREES); } - if (device_id == 0x41) { // DHW module - register_telegram_type(0x34, F("MonitorWW"), false, MAKE_PF_CB(process_MonitorWW)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCurTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCurTemp2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); - } } @@ -44,15 +38,5 @@ Generic::Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, con void Generic::process_RFSensorMessage(std::shared_ptr telegram) { has_update(telegram, rfTemp_, 0); // is * 10 } -/* - * MonitorWW - type 0x34 - dhw monitor. 10 bytes long - * received every 10 seconds - * Unknown(0x41) -> All(0x00), UBAMonitorWW(0x34), data: 37 02 25 02 25 00 00 00 00 -*/ -void Generic::process_MonitorWW(std::shared_ptr telegram) { - has_update(telegram, wwSetTemp_, 0); - has_update(telegram, wwCurTemp_, 1); - has_update(telegram, wwCurTemp2_, 3); -} } // namespace emsesp diff --git a/src/devices/generic.h b/src/devices/generic.h index e4beb5a44..f48632693 100644 --- a/src/devices/generic.h +++ b/src/devices/generic.h @@ -31,12 +31,8 @@ class Generic : public EMSdevice { static uuid::log::Logger logger_; int16_t rfTemp_; - uint8_t wwSetTemp_; // DHW set temperature - uint16_t wwCurTemp_; // DHW current temperature - uint16_t wwCurTemp2_; // DHW current temperature storage void process_RFSensorMessage(std::shared_ptr telegram); - void process_MonitorWW(std::shared_ptr telegram); }; } // namespace emsesp diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index c7a97ad96..739290ff9 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -34,7 +34,7 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c } if (flags == EMSdevice::EMS_DEVICE_FLAG_SM100) { - if (device_id == 0x2A) { + if (device_id == 0x2A) { // SM100 DHW register_telegram_type(0x07D6, F("SM100wwTemperature"), false, MAKE_PF_CB(process_SM100wwTemperature)); register_telegram_type(0x07AA, F("SM100wwStatus"), false, MAKE_PF_CB(process_SM100wwStatus)); register_telegram_type(0x07AB, F("SM100wwCommand"), false, MAKE_PF_CB(process_SM100wwCommand)); @@ -63,14 +63,31 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c } if (flags == EMSdevice::EMS_DEVICE_FLAG_ISM) { - register_telegram_type(0x0103, F("ISM1StatusMessage"), true, MAKE_PF_CB(process_ISM1StatusMessage)); - register_telegram_type(0x0101, F("ISM1Set"), true, MAKE_PF_CB(process_ISM1Set)); - register_telegram_type(0x0104, F("ISM2StatusMessage"), false, MAKE_PF_CB(process_ISM2StatusMessage)); + if (device_id == 0x41) { // ISM DHW module + register_telegram_type(0x34, F("UBAMonitorWW"), false, MAKE_PF_CB(process_MonitorWW)); + } else { + register_telegram_type(0x0103, F("ISM1StatusMessage"), true, MAKE_PF_CB(process_ISM1StatusMessage)); + register_telegram_type(0x0101, F("ISM1Set"), true, MAKE_PF_CB(process_ISM1Set)); + register_telegram_type(0x0104, F("ISM2StatusMessage"), false, MAKE_PF_CB(process_ISM2StatusMessage)); + } } // device values... - // special case for a device_id with 0x2A where it's not actual a solar module + // special case ISM DHW module + if (device_id == 0x41) { // ISM DHW module + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwSelTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwSelTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwSelTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_3_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); + return; + } + // special case for a SM100 DHW device_id with 0x2A where it's not actual a solar module if (device_id == 0x2A) { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp1), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_3_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp3), DeviceValueUOM::DEGREES); @@ -86,7 +103,7 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_, DeviceValueType::UINT, nullptr, FL_(wwTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwTemp)); + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwSelTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwRedTemp_, DeviceValueType::UINT, @@ -129,6 +146,7 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c return; } + // common solar values for all modules (except dhw) register_device_value(DeviceValueTAG::TAG_NONE, &collectorTemp_, DeviceValueType::SHORT, FL_(div10), FL_(collectorTemp), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_NONE, &cylBottomTemp_, DeviceValueType::SHORT, FL_(div10), FL_(cylBottomTemp), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_NONE, &solarPump_, DeviceValueType::BOOL, nullptr, FL_(solarPump), DeviceValueUOM::NONE); @@ -138,6 +156,7 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(DeviceValueTAG::TAG_NONE, &collectorShutdown_, DeviceValueType::BOOL, nullptr, FL_(collectorShutdown), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_NONE, &cylHeated_, DeviceValueType::BOOL, nullptr, FL_(cylHeated), DeviceValueUOM::NONE); + // values per device flag if (flags == EMSdevice::EMS_DEVICE_FLAG_SM10) { register_device_value(DeviceValueTAG::TAG_NONE, &solarPumpMod_, DeviceValueType::UINT, nullptr, FL_(solarPumpMod), DeviceValueUOM::PERCENT); register_device_value( @@ -186,6 +205,9 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c */ } if (flags == EMSdevice::EMS_DEVICE_FLAG_ISM) { + register_device_value(DeviceValueTAG::TAG_NONE, &cylMiddleTemp_, DeviceValueType::SHORT, FL_(div10), FL_(cylMiddleTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &retHeatAssist_, DeviceValueType::SHORT, FL_(div10), FL_(retHeatAssist), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_NONE, &m1Valve_, DeviceValueType::BOOL, nullptr, FL_(m1Valve), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_NONE, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); } @@ -583,7 +605,7 @@ void Solar::process_SM100wwStatus(std::shared_ptr telegram) { // data: FF 05 0F 5F 00 01 3C 3C 3C 3C 28 12 46 01 3C 1E 03 07 3C 00 0F 00 05 void Solar::process_SM100wwParam(std::shared_ptr telegram) { has_update(telegram, wwMaxTemp_, 8); - has_update(telegram, wwTemp_, 9); + has_update(telegram, wwSelTemp_, 9); has_update(telegram, wwRedTemp_, 10); has_update(telegram, wwDailyTemp_, 6); has_update(telegram, wwDisinfectionTemp_, 12); @@ -782,6 +804,16 @@ void Solar::process_ISM1Set(std::shared_ptr telegram) { has_update(telegram, cylMaxTemp_, 6); } +/* + * Junkers ISM1 Solar DHW Module - type 0x34 ww + */ +void Solar::process_MonitorWW(std::shared_ptr telegram) { + has_update(telegram, wwSelTemp_, 0); + has_update(telegram, wwTemp_1_, 1); + has_update(telegram, wwTemp_3_, 3); +} + + /* * Settings */ @@ -1121,12 +1153,16 @@ bool Solar::set_diffControl(const char * value, const int8_t id) { return true; } -bool Solar::set_wwTemp(const char * value, const int8_t id) { +bool Solar::set_wwSelTemp(const char * value, const int8_t id) { float v = 0; if (!Helpers::value2temperature(value, v)) { return false; } - write_command(0x7A6, 9, (uint8_t)v, 0x7A6); + if (flags() == EMSdevice::EMS_DEVICE_FLAG_ISM) { + write_command(0x35, 3, (uint8_t)v, 0x34); + } else { // SM100 + write_command(0x7A6, 9, (uint8_t)v, 0x7A6); + } return true; } diff --git a/src/devices/solar.h b/src/devices/solar.h index 6d664d81f..a0bfda887 100644 --- a/src/devices/solar.h +++ b/src/devices/solar.h @@ -125,7 +125,7 @@ class Solar : public EMSdevice { // SM100wwParam - 0x07A6 uint8_t wwMaxTemp_; - uint8_t wwTemp_; + uint8_t wwSelTemp_; uint8_t wwRedTemp_; uint8_t wwDailyTemp_; uint8_t wwDisinfectionTemp_; @@ -188,8 +188,9 @@ class Solar : public EMSdevice { void process_ISM1StatusMessage(std::shared_ptr telegram); void process_ISM1Set(std::shared_ptr telegram); void process_ISM2StatusMessage(std::shared_ptr telegram); + void process_MonitorWW(std::shared_ptr telegram); - + // settings bool set_CollectorMaxTemp(const char * value, const int8_t id); bool set_CollectorMinTemp(const char * value, const int8_t id); bool set_cylMaxTemp(const char * value, const int8_t id); @@ -225,7 +226,7 @@ class Solar : public EMSdevice { bool set_heatAssist(const char * value, const int8_t id); bool set_diffControl(const char * value, const int8_t id); - bool set_wwTemp(const char * value, const int8_t id); + bool set_wwSelTemp(const char * value, const int8_t id); bool set_wwMaxTemp(const char * value, const int8_t id); bool set_wwRedTemp(const char * value, const int8_t id); bool set_wwCirc(const char * value, const int8_t id); @@ -233,6 +234,7 @@ class Solar : public EMSdevice { bool set_wwKeepWarm(const char * value, const int8_t id); bool set_wwDisinfectionTemp(const char * value, const int8_t id); bool set_wwDailyTemp(const char * value, const int8_t id); + }; } // namespace emsesp From ae16d017348315a41facd94612ddb679a9c19cc5 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:41:38 +0200 Subject: [PATCH 171/319] add comment about has_cmd --- src/mqtt.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 3733e3a93..abc0af963 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -919,6 +919,10 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, int16_t dv_set_min, dv_set_max; (void)dv.get_min_max(dv_set_min, dv_set_max); + // determine if we're creating the command topics which we use special HA configs + // unless the entity has been marked as read-only and so it'll default to using the sensor/ type + bool has_cmd = dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY); + publish_ha_sensor_config(dv.type, dv.tag, dv.full_name, @@ -926,7 +930,7 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, dv.short_name, dv.uom, remove, - dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY), + has_cmd, dv.options, dv.options_size, dv_set_min, From 14593f6a519ba73da40df906f2e17b9f5c84751c Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:41:57 +0200 Subject: [PATCH 172/319] reset some test data --- mock-api/server.js | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/mock-api/server.js b/mock-api/server.js index 5b2d5c7d6..6c232f54a 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -634,14 +634,14 @@ const emsesp_deviceentities_2 = [ { v: 5, n: 'selected flow temperature', s: 'selflowtemp', m: 0 }, { v: 0, n: 'burner selected max power', s: 'selburnpow', m: 0 }, { v: 0, n: 'heating pump modulation', s: 'heatingpumpmod', m: 0 }, - { n: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 2 }, - { n: 'outside temperature', s: 'outdoortemp', m: 2 }, + { n: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 0 }, + { n: 'outside temperature', s: 'outdoortemp', m: 0 }, { v: 53, n: 'current flow temperature', s: 'curflowtemp', m: 0 }, { v: 51.8, n: 'return temperature', s: 'rettemp', m: 0 }, - { n: 'mixing switch temperature', s: 'switchtemp', m: 2 }, + { n: 'mixing switch temperature', s: 'switchtemp', m: 0 }, { v: 1.3, n: 'system pressure', s: 'syspress', m: 0 }, { v: 54.6, n: 'actual boiler temperature', s: 'boiltemp', m: 0 }, - { n: 'exhaust temperature', s: 'exhausttemp', m: 2 }, + { n: 'exhaust temperature', s: 'exhausttemp', m: 0 }, { v: false, n: 'gas', s: 'burngas', m: 0 }, { v: false, n: 'gas stage 2', s: 'burngas2', m: 0 }, { v: 0, n: 'flame current', s: 'flamecurr', m: 0 }, @@ -923,22 +923,23 @@ rest_server.post(EMSESP_DEVICEENTITIES_ENDPOINT, (req, res) => { } }) -function myF(entity, de, dd) { +function updateMask(entity, de, dd) { const name = entity.slice(2) - const mask = parseInt(entity.slice(0, 2), 16) - const mask_hex = entity.slice(0, 2) + const new_mask = parseInt(entity.slice(0, 2), 16) objIndex = de.findIndex((obj) => obj.s == name) if (objIndex !== -1) { - de[objIndex].m = mask + de[objIndex].m = new_mask const fullname = de[objIndex].n objIndex = dd.data.findIndex((obj) => obj.n.slice(2) == fullname) if (objIndex !== -1) { - dd.data[objIndex].n = mask_hex + fullname - console.log('Updating: ') - console.log(dd.data[objIndex]) - } else { - console.log("can't locate record for " + fullname) + // see if the mask has changed + const old_mask = parseInt(dd.data[objIndex].n.slice(0, 2), 16) + if (old_mask !== new_mask) { + const mask_hex = entity.slice(0, 2) + console.log('Updating ' + dd.data[objIndex].n + ' -> ' + mask_hex + fullname) + dd.data[objIndex].n = mask_hex + fullname + } } } else { console.log("can't locate record for id " + id) @@ -949,11 +950,11 @@ rest_server.post(EMSESP_MASKED_ENTITIES_ENDPOINT, (req, res) => { const id = req.body.id for (const entity of req.body.entity_ids) { if (id === 1) { - myF(entity, emsesp_deviceentities_1, emsesp_devicedata_1) + updateMask(entity, emsesp_deviceentities_1, emsesp_devicedata_1) } else if (id === 2) { - myF(entity, emsesp_deviceentities_2, emsesp_devicedata_2) + updateMask(entity, emsesp_deviceentities_2, emsesp_devicedata_2) } else if (id === 4) { - myF(entity, emsesp_deviceentities_4, emsesp_devicedata_4) + updateMask(entity, emsesp_deviceentities_4, emsesp_devicedata_4) } } res.sendStatus(200) From 4f3dacf81a2f4ee177c6baf94c5c51da7627d035 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:42:18 +0200 Subject: [PATCH 173/319] make deviceentity.w mandatory --- interface/src/project/types.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index a2c2d9185..4b62d6f52 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -131,10 +131,10 @@ export interface DeviceValue { n: string; // name c: string; // command l: string[]; // list - h?: string; // help text - s?: string; // steps for up/down - m?: string; // min - x?: string; // max + h?: string; // help text, optional + s?: string; // steps for up/down, optional + m?: string; // min, optional + x?: string; // max, optional } export interface DeviceData { @@ -147,7 +147,7 @@ export interface DeviceEntity { n: string; // name s: string; // shortname m: number; // mask - w?: boolean; // writeable + w: boolean; // writeable } export interface MaskedEntities { From 4a56726f61bb0dbad107894e3cb511ff68de4fc9 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:42:32 +0200 Subject: [PATCH 174/319] bump version --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index bf2f94b81..b64112942 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b10" +#define EMSESP_APP_VERSION "3.4.0b11" From 77f583f91f272b9588fbc9026d85f5ac2e71f513 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:43:08 +0200 Subject: [PATCH 175/319] only add entities who's mask has changed to list --- src/web/WebCustomizationService.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 8c81d172c..7d2f579e7 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -172,11 +172,10 @@ void WebCustomizationService::devices(AsyncWebServerRequest * request) { obj["i"] = emsdevice->unique_id(); // a unique id /* - // shortname - we prefix the count to make it unique uint8_t device_index = EMSESP::device_index(emsdevice->device_type(), emsdevice->unique_id()); if (device_index) { char s[10]; - obj["s"] = emsdevice->device_type_name() + Helpers::smallitoa(s, device_index) + " (" + emsdevice->name() + ")"; + obj["s"] = emsdevice->device_type_name() + Helpers::smallitoa(s, device_index) + " (" + emsdevice->name() + ")"; // shortname - we prefix the count to make it unique } else { obj["s"] = emsdevice->device_type_name() + " (" + emsdevice->name() + ")"; } @@ -221,16 +220,16 @@ void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, J if (emsdevice) { uint8_t unique_device_id = json["id"]; if (emsdevice->unique_id() == unique_device_id) { - // first reset all the entity ids - emsdevice->reset_entity_masks(); - // build a list of entities JsonArray entity_ids_json = json["entity_ids"]; std::vector entity_ids; - for (JsonVariant id : entity_ids_json) { + for (const JsonVariant id : entity_ids_json) { std::string entity_id = id.as(); - emsdevice->mask_entity(entity_id); // this will have immediate affect - entity_ids.push_back(entity_id); + // handle the mask change and add to the list of customized entities + // if the value is different from the default (mask == 0) + if (emsdevice->mask_entity(entity_id)) { + entity_ids.push_back(entity_id); + } } // Save the list to the customization file From b2de5d47dd917ccb65dad424fbafb417fe44a7bd Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:43:24 +0200 Subject: [PATCH 176/319] small code changes --- src/emsdevicevalue.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index dee8f3570..5d6ac776e 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -168,20 +168,20 @@ class DeviceValue { , state(state) { } - bool hasValue(); + bool hasValue() const; bool get_min_max(int16_t & dv_set_min, int16_t & dv_set_max); // state flags - inline void add_state(uint8_t s) { + void add_state(uint8_t s) { state |= s; } - inline bool has_state(uint8_t s) const { + bool has_state(uint8_t s) const { return (state & s) == s; } - inline void remove_state(uint8_t s) { + void remove_state(uint8_t s) { state &= ~s; } - inline uint8_t get_state() const { + uint8_t get_state() const { return state; } From fce9a2528092741f966f562fe8981bacdc75cc8a Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:43:37 +0200 Subject: [PATCH 177/319] add const function --- src/emsdevicevalue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp index a8a9bfd34..450f53aff 100644 --- a/src/emsdevicevalue.cpp +++ b/src/emsdevicevalue.cpp @@ -134,7 +134,7 @@ size_t DeviceValue::tag_count = sizeof(DeviceValue::DeviceValueTAG_s) / sizeof(_ // checks whether the device value has an actual value // returns true if its valid // state is stored in the dv object -bool DeviceValue::hasValue() { +bool DeviceValue::hasValue() const { bool has_value = false; switch (type) { case DeviceValueType::BOOL: From 1f8213e3155bd8129f4e283f890872c7a93a3ef1 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:44:02 +0200 Subject: [PATCH 178/319] changes for handling entities in customization --- src/emsdevice.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/emsdevice.h b/src/emsdevice.h index 99e780bd2..fdfbba7e2 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -183,8 +183,7 @@ class EMSdevice { char * show_telegram_handlers(char * result, const size_t len, const uint8_t handlers); void show_mqtt_handlers(uuid::console::Shell & shell) const; void list_device_entries(JsonObject & output) const; - void mask_entity(const std::string & entity_id); - void reset_entity_masks(); + bool mask_entity(const std::string & entity_id); using process_function_p = std::function)>; From 38128f7864e55ad0a5cde81b17f0a76ac60c0d54 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:44:37 +0200 Subject: [PATCH 179/319] changes to mask_entity() --- src/emsdevice.cpp | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 00c05b64d..35b749998 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -404,9 +404,9 @@ void EMSdevice::register_device_value(uint8_t tag, if ((entityCustomization.product_id == product_id()) && (entityCustomization.device_id == device_id())) { std::string entity = tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(short_name) : tag_to_string(tag) + "/" + read_flash_string(short_name); for (std::string entity_id : entityCustomization.entity_ids) { - uint8_t flag = Helpers::hextoint(entity_id.substr(0, 2).c_str()); if (entity_id.substr(2) == entity) { - state = flag << 4; // set state high bits to flag, turn off active and ha flags + uint8_t mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); + state = mask << 4; // set state high bits to flag, turn off active and ha flags break; } } @@ -759,7 +759,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { // as generate_values_web() but stripped down to only show all entities and their state // this is used only for WebCustomizationService::device_entities() void EMSdevice::generate_values_web_all(JsonArray & output) { - for (auto & dv : devicevalues_) { + for (const auto & dv : devicevalues_) { // also show commands and entities that have an empty full name JsonObject obj = output.createNestedObject(); @@ -847,30 +847,24 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { } } -// reset all entities to being visible -// this is called before loading in the exclude entities list from the customization service -void EMSdevice::reset_entity_masks() { - for (auto & dv : devicevalues_) { - dv.state &= 0x0F; // clear high nibble - } -} - -// disable/exclude/mask_out a device entity based on the id -void EMSdevice::mask_entity(const std::string & entity_id) { - // first character contains mask flags - uint8_t flag = (Helpers::hextoint(entity_id.substr(0, 2).c_str()) << 4); +// set mask per device entity based on the id which is prefixed with the 2 char hex mask value +// returns true if the entity has a mask set +bool EMSdevice::mask_entity(const std::string & entity_id) { for (auto & dv : devicevalues_) { std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); if (entity == entity_id.substr(2)) { - // remove ha config on change of dv_readonly flag - if (Mqtt::ha_enabled() && ((dv.state ^ flag) & DeviceValueState::DV_READONLY)) { + uint8_t mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); // first character contains mask flags + if (Mqtt::ha_enabled() && (((dv.state >> 4) ^ mask) & (DeviceValueState::DV_READONLY >> 4))) { + // remove ha config on change of dv_readonly flag dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) } - dv.state = (dv.state & 0x0F) | flag; // set state high bits to flag - return; + dv.state = ((dv.state & 0x0F) | (mask << 4)); // set state high bits to flag + return mask; // true if entity mask is not the deafult 0 } } + + return false; } // builds json for a specific device value / entity From 9774661a4014a1dec2d99fbec481905afe03d7de Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 3 Apr 2022 13:44:54 +0200 Subject: [PATCH 180/319] send complete list of entites to server --- interface/src/project/SettingsCustomization.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 1e43fcfe8..880a1a9a6 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -161,7 +161,7 @@ const SettingsCustomization: FC = () => { const saveCustomization = async () => { if (deviceEntities && selectedDevice) { const masked_entities = deviceEntities - .filter((de) => de.m) + // .filter((de) => de.m) .map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.s); try { const response = await EMSESP.writeMaskedEntities({ From d94eb26fa8ae3e5756e99e21818d7ac9195dbb09 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Apr 2022 13:49:17 +0200 Subject: [PATCH 181/319] solar mqtt --- src/emsesp.cpp | 1 - src/system.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/emsesp.cpp b/src/emsesp.cpp index d367b677a..aef1cb0e3 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -630,7 +630,6 @@ void EMSESP::publish_device_values(uint8_t device_type) { } else { // for all other devices add the values to the json - json = doc.to(); need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } diff --git a/src/system.cpp b/src/system.cpp index d01726b4e..74503cd3a 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1205,7 +1205,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp obj["product id"] = emsdevice->product_id(); obj["version"] = emsdevice->version(); obj["entities"] = emsdevice->count_entities(); - char result[250]; + char result[300]; (void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::RECEIVED); if (result[0] != '\0') { obj["handlers received"] = result; // don't show handlers if there aren't any From 728ccaefa74365b62c590fed9f1b13c07564bddb Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Apr 2022 18:34:09 +0200 Subject: [PATCH 182/319] dont set ivt clock automaically --- src/devices/thermostat.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index d382b307d..bda9f1eb6 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1236,7 +1236,7 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { time_t now = time(nullptr); tm * tm_ = localtime(&now); bool tset_ = tm_->tm_year > 110; // year 2010 and up, time is valid - tm_->tm_year = telegram->message_data[0] + 100; + tm_->tm_year = (telegram->message_data[0] & 0x7F) + 100; // IVT tm_->tm_mon = telegram->message_data[1] - 1; tm_->tm_mday = telegram->message_data[3]; tm_->tm_hour = telegram->message_data[2]; @@ -1244,8 +1244,9 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { tm_->tm_sec = telegram->message_data[5]; tm_->tm_isdst = telegram->message_data[7] & 0x01; time_t ttime = mktime(tm_); // thermostat time + bool ivtclock = (telegram->message_data[0] & 0x80) == 0x80; // dont set clock on ivt, #439 // correct thermostat clock if we have valid ntp time, and could write the command - if (tset_ && EMSESP::system_.ntp_connected() && !EMSESP::system_.readonly_mode() && has_command(&dateTime_)) { + if (!ivtclock && tset_ && EMSESP::system_.ntp_connected() && !EMSESP::system_.readonly_mode() && has_command(&dateTime_)) { double difference = difftime(now, ttime); if (difference > 15 || difference < -15) { set_datetime("ntp", -1); // set from NTP From 755368440b29b35dc9fcad942d097b5f75b694d5 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Apr 2022 18:34:38 +0200 Subject: [PATCH 183/319] customization advice with selected icons --- interface/src/project/SettingsCustomization.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 1e43fcfe8..7cff1c4d8 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -123,15 +123,15 @@ const SettingsCustomization: FC = () => {  mark it as favorite to be listed at the top of the Dashboard - +  make it read-only, only if it has write operation available - +  excluded it from MQTT and API outputs - +  hide it from the Dashboard From f02621d1d8f082f7a9e67ade988f3b6659ea8922 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 3 Apr 2022 19:18:05 +0200 Subject: [PATCH 184/319] formatting --- src/devices/generic.cpp | 1 - src/devices/generic.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/devices/generic.cpp b/src/devices/generic.cpp index 7f7f7c984..d5a5a72c6 100644 --- a/src/devices/generic.cpp +++ b/src/devices/generic.cpp @@ -33,7 +33,6 @@ Generic::Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, con } } - // type 0x435 rf remote sensor void Generic::process_RFSensorMessage(std::shared_ptr telegram) { has_update(telegram, rfTemp_, 0); // is * 10 diff --git a/src/devices/generic.h b/src/devices/generic.h index f48632693..8c1e6427a 100644 --- a/src/devices/generic.h +++ b/src/devices/generic.h @@ -30,7 +30,7 @@ class Generic : public EMSdevice { private: static uuid::log::Logger logger_; - int16_t rfTemp_; + int16_t rfTemp_; void process_RFSensorMessage(std::shared_ptr telegram); }; From 917e4f5cbfc58b46898a6463df2fe8ca283b75dd Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 4 Apr 2022 11:10:52 +0200 Subject: [PATCH 185/319] check/format solar --- src/devices/solar.cpp | 151 ++++++++++++++++++++++-------------------- 1 file changed, 78 insertions(+), 73 deletions(-) diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index 739290ff9..919b9a135 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -102,8 +102,13 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwSelTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwSelTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwSelTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwSelTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwRedTemp_, DeviceValueType::UINT, @@ -962,54 +967,54 @@ bool Solar::set_SM10MaxFlow(const char * value, const int8_t id) { // switch heat transfer system on/off bool Solar::set_heatTransferSystem(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x358, 5, v ? 0x01 : 0x00, 0x358); + write_command(0x358, 5, b ? 0x01 : 0x00, 0x358); return true; } // switch external cylinder on/off bool Solar::set_externalCyl(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x358, 9, v ? 0x01 : 0x00, 0x358); + write_command(0x358, 9, b ? 0x01 : 0x00, 0x358); return true; } // switch thermal disinfection on/off bool Solar::set_thermalDisinfect(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x358, 10, v ? 0x01 : 0x00, 0x358); + write_command(0x358, 10, b ? 0x01 : 0x00, 0x358); return true; } // switch heat metering on/off bool Solar::set_heatMetering(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x358, 14, v ? 0x01 : 0x00, 0x358); + write_command(0x358, 14, b ? 0x01 : 0x00, 0x358); return true; } // switch solar system on/off bool Solar::set_solarEnabled(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } if (flags() == EMSdevice::EMS_DEVICE_FLAG_SM10) { - write_command(0x96, 0, v ? 0xFF : 0x00, 0x96); + write_command(0x96, 0, b ? 0xFF : 0x00, 0x96); } else { - write_command(0x358, 19, v ? 0x01 : 0x00, 0x358); + write_command(0x358, 19, b ? 0x01 : 0x00, 0x358); } return true; } @@ -1037,71 +1042,71 @@ bool Solar::set_solarMode2(const char * value, const int8_t id) { // switch pumpkick on/off bool Solar::set_solarPumpKick(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x35A, 9, v ? 0x01 : 0x00, 0x35A); + write_command(0x35A, 9, b ? 0x01 : 0x00, 0x35A); return true; } // switch pump2kick on/off bool Solar::set_solarPump2Kick(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x35D, 0, v ? 0x01 : 0x00, 0x35D); + write_command(0x35D, 0, b ? 0x01 : 0x00, 0x35D); return true; } // switch plain water mode on/off bool Solar::set_plainWaterMode(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x35A, 10, v ? 0x01 : 0x00, 0x35A); + write_command(0x35A, 10, b ? 0x01 : 0x00, 0x35A); return true; } // switch double match flow on/off bool Solar::set_doubleMatchFlow(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x35A, 11, v ? 0x01 : 0x00, 0x35A); + write_command(0x35A, 11, b ? 0x01 : 0x00, 0x35A); return true; } // set climate zone number bool Solar::set_climateZone(const char * value, const int8_t id) { - int v = 0; - if (!Helpers::value2number(value, v)) { + int zone; + if (!Helpers::value2number(value, zone)) { return false; } - write_command(0x380, 0, v, 0x380); + write_command(0x380, 0, zone, 0x380); return true; } // collector area in squaremeters bool Solar::set_collector1Area(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2float(value, v)) { + float area; + if (!Helpers::value2float(value, area)) { return false; } - write_command(0x380, 3, (uint16_t)(v * 10), 0x380); + write_command(0x380, 3, (uint16_t)(area * 10), 0x380); return true; } // collector area in squaremeters bool Solar::set_collector2Area(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2float(value, v)) { + float area; + if (!Helpers::value2float(value, area)) { return false; } - write_command(0x380, 6, (uint16_t)(v * 10), 0x380); + write_command(0x380, 6, (uint16_t)(area * 10), 0x380); return true; } @@ -1127,105 +1132,105 @@ bool Solar::set_collector2Type(const char * value, const int8_t id) { // priority of cylinders if there are 2 bool Solar::set_cylPriority(const char * value, const int8_t id) { - uint8_t n; - if (!Helpers::value2enum(value, n, FL_(enum_cylprio))) { + uint8_t num; + if (!Helpers::value2enum(value, num, FL_(enum_cylprio))) { return false; } - write_command(0x35F, 3, n, 0x35F); + write_command(0x35F, 3, num, 0x35F); return true; } bool Solar::set_heatAssist(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2temperature(value, v)) { + float temperature; + if (!Helpers::value2temperature(value, temperature)) { return false; } - write_command(0x35C, 0, (uint8_t)(v * 10), 0x35C); + write_command(0x35C, 0, (uint8_t)(temperature * 10), 0x35C); return true; } bool Solar::set_diffControl(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2temperature(value, v)) { + float temperature; + if (!Helpers::value2temperature(value, temperature)) { return false; } - write_command(0x361, 4, (uint8_t)(v * 10), 0x361); + write_command(0x361, 4, (uint8_t)(temperature * 10), 0x361); return true; } bool Solar::set_wwSelTemp(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2temperature(value, v)) { + int temperature; + if (!Helpers::value2temperature(value, temperature)) { return false; } if (flags() == EMSdevice::EMS_DEVICE_FLAG_ISM) { - write_command(0x35, 3, (uint8_t)v, 0x34); + write_command(0x35, 3, (uint8_t)temperature, 0x34); } else { // SM100 - write_command(0x7A6, 9, (uint8_t)v, 0x7A6); + write_command(0x7A6, 9, (uint8_t)temperature, 0x7A6); } return true; } bool Solar::set_wwMaxTemp(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2temperature(value, v)) { + int temperature; + if (!Helpers::value2temperature(value, temperature)) { return false; } - write_command(0x7A6, 8, (uint8_t)v, 0x7A6); + write_command(0x7A6, 8, (uint8_t)temperature, 0x7A6); return true; } bool Solar::set_wwRedTemp(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2temperature(value, v)) { + int temperature; + if (!Helpers::value2temperature(value, temperature)) { return false; } - write_command(0x7A6, 10, (uint8_t)v, 0x7A6); + write_command(0x7A6, 10, (uint8_t)temperature, 0x7A6); return true; } bool Solar::set_wwDailyTemp(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2temperature(value, v)) { + int temperature; + if (!Helpers::value2temperature(value, temperature)) { return false; } - write_command(0x7A6, 6, (uint8_t)v, 0x7A6); + write_command(0x7A6, 6, (uint8_t)temperature, 0x7A6); return true; } bool Solar::set_wwDisinfectionTemp(const char * value, const int8_t id) { - float v = 0; - if (!Helpers::value2temperature(value, v)) { + int temperature; + if (!Helpers::value2temperature(value, temperature)) { return false; } - write_command(0x7A6, 12, (uint8_t)v, 0x7A6); + write_command(0x7A6, 12, (uint8_t)temperature, 0x7A6); return true; } bool Solar::set_wwCirc(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x7A5, 0, v ? 0xFF : 0x00, 0x7A5); + write_command(0x7A5, 0, b ? 0xFF : 0x00, 0x7A5); return true; } bool Solar::set_wwCircMode(const char * value, const int8_t id) { - uint8_t n; - if (!Helpers::value2enum(value, n, FL_(enum_wwCircMode))) { + uint8_t num; + if (!Helpers::value2enum(value, num, FL_(enum_wwCircMode))) { return false; } - write_command(0x7A5, 3, n, 0x7A5); + write_command(0x7A5, 3, num, 0x7A5); return true; } bool Solar::set_wwKeepWarm(const char * value, const int8_t id) { - bool v = false; - if (!Helpers::value2bool(value, v)) { + bool b; + if (!Helpers::value2bool(value, b)) { return false; } - write_command(0x7AE, 0, v ? 0xFF : 0x00, 0x7AE); + write_command(0x7AE, 0, b ? 0xFF : 0x00, 0x7AE); return true; } From 26758b965dda6b65a6ca59dadc8841f80c47aa09 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 4 Apr 2022 11:11:37 +0200 Subject: [PATCH 186/319] ivt clock check dst --- src/devices/thermostat.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index bda9f1eb6..88ebc440c 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1233,18 +1233,18 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { has_update(dateTime_, date, sizeof(dateTime_)); // check clock - time_t now = time(nullptr); - tm * tm_ = localtime(&now); - bool tset_ = tm_->tm_year > 110; // year 2010 and up, time is valid - tm_->tm_year = (telegram->message_data[0] & 0x7F) + 100; // IVT - tm_->tm_mon = telegram->message_data[1] - 1; - tm_->tm_mday = telegram->message_data[3]; - tm_->tm_hour = telegram->message_data[2]; - tm_->tm_min = telegram->message_data[4]; - tm_->tm_sec = telegram->message_data[5]; - tm_->tm_isdst = telegram->message_data[7] & 0x01; - time_t ttime = mktime(tm_); // thermostat time - bool ivtclock = (telegram->message_data[0] & 0x80) == 0x80; // dont set clock on ivt, #439 + time_t now = time(nullptr); + tm * tm_ = localtime(&now); + bool tset_ = tm_->tm_year > 110; // year 2010 and up, time is valid + tm_->tm_year = (telegram->message_data[0] & 0x7F) + 100; // IVT + tm_->tm_mon = telegram->message_data[1] - 1; + tm_->tm_mday = telegram->message_data[3]; + tm_->tm_hour = telegram->message_data[2]; + tm_->tm_min = telegram->message_data[4]; + tm_->tm_sec = telegram->message_data[5]; + tm_->tm_isdst = telegram->message_data[7] & 0x01; + time_t ttime = mktime(tm_); // thermostat time + bool ivtclock = (telegram->message_data[0] & 0x80) == 0x80; // dont sync ivt-clock, #439 // correct thermostat clock if we have valid ntp time, and could write the command if (!ivtclock && tset_ && EMSESP::system_.ntp_connected() && !EMSESP::system_.readonly_mode() && has_command(&dateTime_)) { double difference = difftime(now, ttime); @@ -1255,6 +1255,10 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { } #ifndef EMSESP_STANDALONE if (!tset_ && tm_->tm_year > 110) { // emsesp clock not set, but thermostat clock + if (ivtclock) { + tm_->tm_isdst = -1; // determine dst + ttime = mktime(tm_); // thermostat time + } struct timeval newnow = {.tv_sec = ttime}; settimeofday(&newnow, nullptr); LOG_INFO(F("ems-esp time set from thermostat")); From 462bf81be16fdf1c02e8c82016ef36e98746469b Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 4 Apr 2022 11:12:18 +0200 Subject: [PATCH 187/319] ntp status and time button --- interface/src/framework/ntp/NTPStatusForm.tsx | 9 +++++++-- interface/src/types/ntp.ts | 5 +++-- lib/framework/NTPSettingsService.cpp | 2 +- lib/framework/NTPStatus.cpp | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/interface/src/framework/ntp/NTPStatusForm.tsx b/interface/src/framework/ntp/NTPStatusForm.tsx index 22ce282d4..2e0f03957 100644 --- a/interface/src/framework/ntp/NTPStatusForm.tsx +++ b/interface/src/framework/ntp/NTPStatusForm.tsx @@ -32,11 +32,14 @@ import { extractErrorMessage, formatDateTime, formatLocalDateTime, useRest } fro import { AuthenticatedContext } from '../../contexts/authentication'; export const isNtpActive = ({ status }: NTPStatus) => status === NTPSyncStatus.NTP_ACTIVE; +export const isNtpEnabled = ({ status }: NTPStatus) => status !== NTPSyncStatus.NTP_DISABLED; export const ntpStatusHighlight = ({ status }: NTPStatus, theme: Theme) => { switch (status) { - case NTPSyncStatus.NTP_INACTIVE: + case NTPSyncStatus.NTP_DISABLED: return theme.palette.info.main; + case NTPSyncStatus.NTP_INACTIVE: + return theme.palette.error.main; case NTPSyncStatus.NTP_ACTIVE: return theme.palette.success.main; default: @@ -46,6 +49,8 @@ export const ntpStatusHighlight = ({ status }: NTPStatus, theme: Theme) => { export const ntpStatus = ({ status }: NTPStatus) => { switch (status) { + case NTPSyncStatus.NTP_DISABLED: + return 'Disabled'; case NTPSyncStatus.NTP_INACTIVE: return 'Inactive'; case NTPSyncStatus.NTP_ACTIVE: @@ -143,7 +148,7 @@ const NTPStatusForm: FC = () => { - {isNtpActive(data) && ( + {isNtpEnabled(data) && ( <> diff --git a/interface/src/types/ntp.ts b/interface/src/types/ntp.ts index 06c87ef06..e22a9fa59 100644 --- a/interface/src/types/ntp.ts +++ b/interface/src/types/ntp.ts @@ -1,6 +1,7 @@ export enum NTPSyncStatus { - NTP_INACTIVE = 0, - NTP_ACTIVE = 1 + NTP_DISABLED = 0, + NTP_INACTIVE = 1, + NTP_ACTIVE = 2 } export interface NTPStatus { diff --git a/lib/framework/NTPSettingsService.cpp b/lib/framework/NTPSettingsService.cpp index 672f0b496..e4b73bf9f 100644 --- a/lib/framework/NTPSettingsService.cpp +++ b/lib/framework/NTPSettingsService.cpp @@ -59,7 +59,7 @@ void NTPSettingsService::configureNTP() { } void NTPSettingsService::configureTime(AsyncWebServerRequest * request, JsonVariant & json) { - if (!sntp_enabled() && json.is()) { + if (json.is()) { struct tm tm = {0}; String timeLocal = json["local_time"]; char * s = strptime(timeLocal.c_str(), "%Y-%m-%dT%H:%M:%S", &tm); diff --git a/lib/framework/NTPStatus.cpp b/lib/framework/NTPStatus.cpp index 4f026c77f..9433d6253 100644 --- a/lib/framework/NTPStatus.cpp +++ b/lib/framework/NTPStatus.cpp @@ -36,7 +36,7 @@ void NTPStatus::ntpStatus(AsyncWebServerRequest * request) { time_t now = time(nullptr); // only provide enabled/disabled status for now - root["status"] = sntp_enabled() && emsesp::EMSESP::system_.ntp_connected() ? 1 : 0; + root["status"] = sntp_enabled() ? emsesp::EMSESP::system_.ntp_connected() ? 2 : 1 : 0; // the current time in UTC root["utc_time"] = toUTCTimeString(gmtime(&now)); From 30d6fc0fc1329e26fe412eb8dadad72e835c2e44 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 4 Apr 2022 12:03:39 +0200 Subject: [PATCH 188/319] customization buffer 4k, log(debug) buffer size --- src/web/WebCustomizationService.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 7d2f579e7..908a80b19 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -46,8 +46,8 @@ WebCustomizationService::WebCustomizationService(AsyncWebServer * server, FS * f securityManager->wrapRequest(std::bind(&WebCustomizationService::reset_customization, this, _1), AuthenticationPredicates::IS_ADMIN)); _masked_entities_handler.setMethod(HTTP_POST); - _masked_entities_handler.setMaxContentLength(2048); - _masked_entities_handler.setMaxJsonBufferSize(2048); + _masked_entities_handler.setMaxContentLength(4096); + _masked_entities_handler.setMaxJsonBufferSize(4096); server->addHandler(&_masked_entities_handler); _device_entities_handler.setMethod(HTTP_POST); @@ -215,6 +215,7 @@ void WebCustomizationService::device_entities(AsyncWebServerRequest * request, J // and updates the entity list real-time void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { + EMSESP::logger().debug(F("Masked entities json size: %d"), measureJson(json)); // find the device using the unique_id for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice) { From 51af4b32d247720cb5e5149e1c66f7955a6685c5 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 4 Apr 2022 21:43:08 +0200 Subject: [PATCH 189/319] removed comments --- interface/src/framework/system/FirmwareFileUpload.tsx | 1 - interface/src/project/api.ts | 1 - interface/src/project/types.ts | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/framework/system/FirmwareFileUpload.tsx b/interface/src/framework/system/FirmwareFileUpload.tsx index 79da9fc48..546670103 100644 --- a/interface/src/framework/system/FirmwareFileUpload.tsx +++ b/interface/src/framework/system/FirmwareFileUpload.tsx @@ -19,7 +19,6 @@ const FirmwareFileUpload: FC = ({ uploadFirmware }) => { my={2} /> { return AXIOS.post('/resetCustomizations'); } -// EMS-ESP API calls export function API(apiCall: APIcall): AxiosPromise { return AXIOS_API.post('/', apiCall); } diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 4b62d6f52..dc73bbe5e 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -147,6 +147,7 @@ export interface DeviceEntity { n: string; // name s: string; // shortname m: number; // mask + om?: number; // original mask before edits w: boolean; // writeable } From d9716ceb42d08b85e6c45a76ab7ce5a2f75cc937 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 4 Apr 2022 21:43:30 +0200 Subject: [PATCH 190/319] added debug line for customization --- mock-api/server.js | 1 + 1 file changed, 1 insertion(+) diff --git a/mock-api/server.js b/mock-api/server.js index 6c232f54a..49e86fa46 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -948,6 +948,7 @@ function updateMask(entity, de, dd) { rest_server.post(EMSESP_MASKED_ENTITIES_ENDPOINT, (req, res) => { const id = req.body.id + console.log(req.body.entity_ids) for (const entity of req.body.entity_ids) { if (id === 1) { updateMask(entity, emsesp_deviceentities_1, emsesp_devicedata_1) From 077c20fd3448d4af41f2ff61228f0ceb4c91788a Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 4 Apr 2022 21:44:23 +0200 Subject: [PATCH 191/319] minor formatting --- src/devices/solar.h | 1 - src/emsdevice.cpp | 19 +++++++++++-------- src/web/WebCustomizationService.cpp | 7 +++---- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/devices/solar.h b/src/devices/solar.h index a0bfda887..68c98e478 100644 --- a/src/devices/solar.h +++ b/src/devices/solar.h @@ -234,7 +234,6 @@ class Solar : public EMSdevice { bool set_wwKeepWarm(const char * value, const int8_t id); bool set_wwDisinfectionTemp(const char * value, const int8_t id); bool set_wwDailyTemp(const char * value, const int8_t id); - }; } // namespace emsesp diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 35b749998..54bbd16f0 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -848,23 +848,26 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { } // set mask per device entity based on the id which is prefixed with the 2 char hex mask value -// returns true if the entity has a mask set +// returns true if the entity has a mask set (not 0 the default) bool EMSdevice::mask_entity(const std::string & entity_id) { for (auto & dv : devicevalues_) { - std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); - if (entity == entity_id.substr(2)) { - uint8_t mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); // first character contains mask flags - if (Mqtt::ha_enabled() && (((dv.state >> 4) ^ mask) & (DeviceValueState::DV_READONLY >> 4))) { + std::string entity_name = + dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); + uint8_t current_mask = dv.state >> 4; + if (entity_name == entity_id.substr(2)) { + // this entity has a new mask set + uint8_t new_mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); // first character contains mask flags + if (Mqtt::ha_enabled() && ((current_mask ^ new_mask) & (DeviceValueState::DV_READONLY >> 4))) { // remove ha config on change of dv_readonly flag dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) } - dv.state = ((dv.state & 0x0F) | (mask << 4)); // set state high bits to flag - return mask; // true if entity mask is not the deafult 0 + dv.state = ((dv.state & 0x0F) | (new_mask << 4)); // set state high bits to flag + return new_mask; // true if entity mask is not the deafult 0 } } - return false; + return false; // we didn't find the entity } // builds json for a specific device value / entity diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 908a80b19..7c51ecf0e 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -215,7 +215,7 @@ void WebCustomizationService::device_entities(AsyncWebServerRequest * request, J // and updates the entity list real-time void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { - EMSESP::logger().debug(F("Masked entities json size: %d"), measureJson(json)); + // EMSESP::logger().debug(F("Masked entities json size: %d"), measureJson(json)); // find the device using the unique_id for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice) { @@ -226,17 +226,16 @@ void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, J std::vector entity_ids; for (const JsonVariant id : entity_ids_json) { std::string entity_id = id.as(); - // handle the mask change and add to the list of customized entities - // if the value is different from the default (mask == 0) + // set the new mask and add to the list of customized entities if the value is different from the default (mask == 0) if (emsdevice->mask_entity(entity_id)) { entity_ids.push_back(entity_id); } } - // Save the list to the customization file uint8_t product_id = emsdevice->product_id(); uint8_t device_id = emsdevice->device_id(); + // Save the list to the customization file EMSESP::webCustomizationService.update( [&](WebCustomization & settings) { // if it exists (productid and deviceid match) overwrite it From 4fc59328999b902dfbbf9bb757b61b2f0b2d71e6 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 4 Apr 2022 21:44:51 +0200 Subject: [PATCH 192/319] only send back changed entities, put in limit at 50 #444 --- .../src/project/SettingsCustomization.tsx | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index fa276bba6..3eba6cbc2 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -42,11 +42,6 @@ import { DeviceShort, Devices, DeviceEntity } from './types'; const StyledTableCell = styled(TableCell)(({ theme }) => ({ [`&.${tableCellClasses.head}`]: { backgroundColor: '#607d8b' - // color: theme.palette.common.white, - // fontSize: 12 - }, - [`&.${tableCellClasses.body}`]: { - // fontSize: 12 } })); @@ -70,9 +65,14 @@ const SettingsCustomization: FC = () => { } }, []); + const setInitialMask = (data: DeviceEntity[]) => { + setDeviceEntities(data.map((de) => ({ ...de, om: de.m }))); + }; + const fetchDeviceEntities = async (unique_id: number) => { try { - setDeviceEntities((await EMSESP.readDeviceEntities({ id: unique_id })).data); + const data = (await EMSESP.readDeviceEntities({ id: unique_id })).data; + setInitialMask(data); } catch (error: any) { setErrorMessage(extractErrorMessage(error, 'Problem fetching device entities')); } @@ -161,8 +161,17 @@ const SettingsCustomization: FC = () => { const saveCustomization = async () => { if (deviceEntities && selectedDevice) { const masked_entities = deviceEntities - // .filter((de) => de.m) + .filter((de) => de.m !== de.om) .map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.s); + + if (masked_entities.length > 50) { + enqueueSnackbar( + 'Too many selected entities (' + masked_entities.length + '). Limit is 50. Please Save in batches', + { variant: 'warning' } + ); + return; + } + try { const response = await EMSESP.writeMaskedEntities({ id: selectedDevice, @@ -176,6 +185,7 @@ const SettingsCustomization: FC = () => { } catch (error: any) { enqueueSnackbar(extractErrorMessage(error, 'Problem sending entity list'), { variant: 'error' }); } + setInitialMask(deviceEntities); } }; From 2674b3a20e0376b75731219388d511edae68fec0 Mon Sep 17 00:00:00 2001 From: kwertie01 <48419274+kwertie01@users.noreply.github.com> Date: Tue, 5 Apr 2022 08:23:30 +0200 Subject: [PATCH 193/319] added moduline 400 installation parameters --- interface/package-lock.json | 17859 +--------------------------------- src/devices/thermostat.cpp | 194 +- src/devices/thermostat.h | 11 + src/locale_DE.h | 6 + src/locale_EN.h | 6 + 5 files changed, 239 insertions(+), 17837 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 6de544137..ce238bac4 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -1,17739 +1,8 @@ { "name": "EMS-ESP", "version": "3.4.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "EMS-ESP", - "version": "3.4.0", - "dependencies": { - "@emotion/react": "^11.8.2", - "@emotion/styled": "^11.8.1", - "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.5.1", - "@mui/material": "^5.5.3", - "@types/lodash": "^4.14.181", - "@types/node": "^17.0.23", - "@types/react": "^17.0.43", - "@types/react-dom": "^17.0.14", - "@types/react-router-dom": "^5.3.3", - "async-validator": "^4.0.7", - "axios": "^0.26.1", - "http-proxy-middleware": "^2.0.4", - "jwt-decode": "^3.1.2", - "lodash": "^4.17.21", - "notistack": "^2.0.3", - "parse-ms": "^3.0.0", - "react": "^17.0.2", - "react-app-rewired": "^2.2.1", - "react-dom": "^17.0.2", - "react-dropzone": "^12.0.4", - "react-icons": "^4.3.1", - "react-router-dom": "^6.3.0", - "react-scripts": "5.0.0", - "sockette": "^2.0.6", - "typescript": "^4.6.3" - }, - "devDependencies": { - "nodemon": "^2.0.15", - "npm-run-all": "^4.1.5" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", - "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", - "dependencies": { - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/eslint-parser/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz", - "integrity": "sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.17.0", - "charcodes": "^0.2.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", - "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", - "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", - "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-flow": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", - "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", - "dependencies": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", - "dependencies": { - "regenerator-transform": "^0.14.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", - "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", - "dependencies": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", - "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", - "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.0.3.tgz", - "integrity": "sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", - "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", - "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.1.tgz", - "integrity": "sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", - "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.0.2.tgz", - "integrity": "sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", - "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.0.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", - "dependencies": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz", - "integrity": "sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==", - "dependencies": { - "@emotion/memoize": "^0.7.4" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" - }, - "node_modules/@emotion/react": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.2.tgz", - "integrity": "sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.7.1", - "@emotion/serialize": "^1.0.2", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", - "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", - "dependencies": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" - }, - "node_modules/@emotion/styled": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.8.1.tgz", - "integrity": "sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/is-prop-valid": "^1.1.2", - "@emotion/serialize": "^1.0.2", - "@emotion/utils": "^1.1.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, - "node_modules/@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@msgpack/msgpack": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", - "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@mui/base": { - "version": "5.0.0-alpha.74", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.74.tgz", - "integrity": "sha512-pw3T1xNXpW8pLo9+BvtyazZb0CSjNJsjbzznlbV/aNkBfjNPXQVI3X1NDm3WSI8y6M96WDIVO7XrHAohOwALSQ==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@emotion/is-prop-valid": "^1.1.2", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.5.3", - "@popperjs/core": "^2.11.4", - "clsx": "^1.1.1", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^17.0.0", - "react-dom": "^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/icons-material": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.5.1.tgz", - "integrity": "sha512-40f68p5+Yhq3dCn3QYHqQt5RETPyR3AkDw+fma8PtcjqvZ+d+jF84kFmT6NqwA3he7TlwluEtkyAmPzUE4uPdA==", - "dependencies": { - "@babel/runtime": "^7.17.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/material": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.3.tgz", - "integrity": "sha512-eADa3kUYbbr1jNjcufn0a7HeU8cSo0agbrkj720hodxVFNIfzq7a2e58Z+PaZqll55kMGBvlYJ7rTcXU399x5A==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.74", - "@mui/system": "^5.5.3", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.5.3", - "@types/react-transition-group": "^4.4.4", - "clsx": "^1.1.1", - "csstype": "^3.0.11", - "hoist-non-react-statics": "^3.3.2", - "prop-types": "^15.7.2", - "react-is": "^17.0.2", - "react-transition-group": "^4.4.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^17.0.0", - "react-dom": "^17.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.5.3.tgz", - "integrity": "sha512-Wf7NurY7lk8SBWelSBY2U02zxLt1773JpIcXTHuEC9/GZdQA4CXCJGl2cVQzheKhee5rZ+8JwGulrRiVl1m+4A==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.5.3", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.5.2.tgz", - "integrity": "sha512-jkz5AHHbA43akBo5L3y1X1/X0f+RvXvCp3eXKt+iOf3qnKSAausbtlVz7gBbC4xIWDnP1Jb/6T+t/0/7gObRYA==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.7.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.3.tgz", - "integrity": "sha512-J9JcySJuEqfEoP334K/2gEWm2vOx73Uqjii3qlFVhWRBOAJ0Pjyk0sN5W/eVRbwhUm95DNgh2V5s8dRK3vzyVw==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.5.3", - "@mui/styled-engine": "^5.5.2", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.5.3", - "clsx": "^1.1.1", - "csstype": "^3.0.11", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^17.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", - "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.5.3.tgz", - "integrity": "sha512-t627eVRpl3SlxVya0cIVNs8jPl4KCEiGaTSWY9iKKTcMNaeDbuRML+zv/CFHDPr1zFv+FjJSP02ySB+tZ8xIag==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@types/prop-types": "^15.7.4", - "@types/react-is": "^16.7.1 || ^17.0.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "react": "^17.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz", - "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==", - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.8.1", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <3.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.4.tgz", - "integrity": "sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz", - "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "node_modules/@types/lodash": { - "version": "4.14.181", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", - "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" - }, - "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/react": { - "version": "17.0.43", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.43.tgz", - "integrity": "sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.14", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.14.tgz", - "integrity": "sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-is": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", - "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.18", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", - "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", - "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", - "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.17.0", - "@typescript-eslint/type-utils": "5.17.0", - "@typescript-eslint/utils": "5.17.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.17.0.tgz", - "integrity": "sha512-U4sM5z0/ymSYqQT6I7lz8l0ZZ9zrya5VIwrwAP5WOJVabVtVsIpTMxPQe+D3qLyePT+VlETUTO2nA1+PufPx9Q==", - "dependencies": { - "@typescript-eslint/utils": "5.17.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", - "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.17.0", - "@typescript-eslint/types": "5.17.0", - "@typescript-eslint/typescript-estree": "5.17.0", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", - "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", - "dependencies": { - "@typescript-eslint/types": "5.17.0", - "@typescript-eslint/visitor-keys": "5.17.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", - "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", - "dependencies": { - "@typescript-eslint/utils": "5.17.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", - "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", - "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", - "dependencies": { - "@typescript-eslint/types": "5.17.0", - "@typescript-eslint/visitor-keys": "5.17.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", - "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.17.0", - "@typescript-eslint/types": "5.17.0", - "@typescript-eslint/typescript-estree": "5.17.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", - "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", - "dependencies": { - "@typescript-eslint/types": "5.17.0", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-validator": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", - "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/attr-accept": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axe-core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "node_modules/babel-preset-react-app/node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-preset-react-app/node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "node_modules/bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", - "dependencies": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "node_modules/builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001322", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001322.tgz", - "integrity": "sha512-neRmrmIrCGuMnxGSoh+x7zYtQFFgnSY2jaomjU56sCkTA6JINqQrxutF459JpWcWRajvoyn95sOXq4Pqrnyjew==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/charcodes": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", - "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/check-types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" - }, - "node_modules/clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" - }, - "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", - "dependencies": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-js-pure": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", - "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-what": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.0.1.tgz", - "integrity": "sha512-z93ZGFLNc6yaoXAmVhqoSIb+BduplteCt1fepvwhBUQK6MNE4g6fgjpuZKJKp0esUe+vXWlIkwZZjNWoOKw0ZA==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz", - "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==", - "dependencies": { - "cssnano-preset-default": "^5.2.5", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz", - "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==", - "dependencies": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.3", - "postcss-merge-rules": "^5.1.1", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dependencies": { - "buffer-indexof": "^1.0.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", - "dependencies": { - "jake": "^10.6.1" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.99", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.99.tgz", - "integrity": "sha512-YXMzbvlo6pW12KWw0bj6cIGCJi1Moy8PLCuuzgRzg6WYIcHILK3szU+HHnHFx2b373qRv+cfmHhbmRbatyAbPA==" - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", - "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", - "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", - "dependencies": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-react-app": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", - "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", - "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "aria-query": "^4.2.2", - "array-includes": "^3.1.4", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.3.5", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.7", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.2.1", - "language-tags": "^1.0.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-testing-library": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.1.0.tgz", - "integrity": "sha512-YSNzasJUbyhOTe14ZPygeOBvcPvcaNkwHwrj4vdf+uirr2D32JTDaKi6CP5Os2aWtOcvt4uBSPXp9h5xGoqvWQ==", - "dependencies": { - "@typescript-eslint/utils": "^5.13.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==", - "dependencies": { - "@types/eslint": "^7.28.2", - "jest-worker": "^27.3.1", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-selector": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", - "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", - "dependencies": { - "tslib": "^2.0.3" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" - }, - "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "dependencies": { - "@babel/runtime": "^7.7.6" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", - "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "node_modules/immer": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", - "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake": { - "version": "10.8.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz", - "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==", - "dependencies": { - "async": "0.9.x", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-jasmine2/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-jasmine2/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz", - "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^27.0.0", - "jest-watcher": "^27.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watch-typeahead/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", - "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", - "dependencies": { - "array-includes": "^3.1.3", - "object.assign": "^4.1.2" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", - "dependencies": { - "fs-monkey": "1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "node_modules/nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" - }, - "node_modules/nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/notistack": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz", - "integrity": "sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==", - "dependencies": { - "clsx": "^1.1.0", - "hoist-non-react-statics": "^3.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/notistack" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "@mui/material": "^5.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", - "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-ms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", - "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.2" - }, - "peerDependencies": { - "postcss": "^8.0.2" - } - }, - "node_modules/postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "browserslist": ">=4", - "postcss": ">=8" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", - "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", - "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz", - "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", - "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.2" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", - "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", - "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "peerDependencies": { - "postcss": "^8.1.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", - "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.2.tgz", - "integrity": "sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz", - "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", - "dependencies": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dependencies": { - "postcss-selector-parser": "^6.0.6" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nesting": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.3.tgz", - "integrity": "sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "dependencies": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "browserslist": ">= 4", - "postcss": ">= 8" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dependencies": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", - "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", - "dependencies": { - "@csstools/postcss-color-function": "^1.0.3", - "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", - "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", - "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", - "postcss-attribute-case-insensitive": "^5.0.0", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.2", - "postcss-color-hex-alpha": "^8.0.3", - "postcss-color-rebeccapurple": "^7.0.2", - "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", - "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.1", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.3", - "postcss-image-set-function": "^4.0.6", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.3", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz", - "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", - "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", - "dependencies": { - "balanced-match": "^1.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-app-rewired": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.2.1.tgz", - "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==", - "dependencies": { - "semver": "^5.6.0" - }, - "bin": { - "react-app-rewired": "bin/index.js" - }, - "peerDependencies": { - "react-scripts": ">=2.1.3" - } - }, - "node_modules/react-app-rewired/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", - "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.10", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/react-dev-utils/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/react-dev-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-dropzone": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz", - "integrity": "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==", - "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.4.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", - "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" - }, - "node_modules/react-icons": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz", - "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", - "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", - "dependencies": { - "history": "^5.2.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", - "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", - "dependencies": { - "history": "^5.2.0", - "react-router": "6.3.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-scripts": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", - "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dependencies": { - "minimatch": "3.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" - }, - "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" - }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } - } - }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.70.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", - "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" - }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "node_modules/selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sockette": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/sockette/-/sockette-2.0.6.tgz", - "integrity": "sha512-W6iG8RGV6Zife3Cj+FhuyHV447E6fqFM2hKmnaQrTvg3OydINV3Msj3WPFbX76blUlUxvQSMMMdrJxce8NqI5Q==" - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", - "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", - "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", - "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", - "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dependencies": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/tailwindcss": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", - "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", - "dependencies": { - "arg": "^5.0.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "cosmiconfig": "^7.0.1", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "normalize-path": "^3.0.0", - "object-hash": "^2.2.0", - "postcss": "^8.4.6", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "autoprefixer": "^10.0.2", - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/tailwindcss/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/tailwindcss/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/tailwindcss/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/tailwindcss/node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tailwindcss/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tailwindcss/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", - "dependencies": { - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "dependencies": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/update-notifier/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.1", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", - "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "webpack": "^4.44.2 || ^5.47.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-background-sync": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.2.tgz", - "integrity": "sha512-EjG37LSMDJ1TFlFg56wx6YXbH4/NkG09B9OHvyxx+cGl2gP5OuOzsCY3rOPJSpbcz6jpuA40VIC3HzSD4OvE1g==", - "dependencies": { - "idb": "^6.1.4", - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.2.tgz", - "integrity": "sha512-DjJYraYnprTZE/AQNoeogaxI1dPuYmbw+ZJeeP8uXBSbg9SNv5wLYofQgywXeRepv4yr/vglMo9yaHUmBMc+4Q==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-build": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.2.tgz", - "integrity": "sha512-TVi4Otf6fgwikBeMpXF9n0awHfZTMNu/nwlMIT9W+c13yvxkmDFMPb7vHYK6RUmbcxwPnz4I/R+uL76+JxG4JQ==", - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.5.2", - "workbox-broadcast-update": "6.5.2", - "workbox-cacheable-response": "6.5.2", - "workbox-core": "6.5.2", - "workbox-expiration": "6.5.2", - "workbox-google-analytics": "6.5.2", - "workbox-navigation-preload": "6.5.2", - "workbox-precaching": "6.5.2", - "workbox-range-requests": "6.5.2", - "workbox-recipes": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2", - "workbox-streams": "6.5.2", - "workbox-sw": "6.5.2", - "workbox-window": "6.5.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz", - "integrity": "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.2.tgz", - "integrity": "sha512-UnHGih6xqloV808T7ve1iNKZMbpML0jGLqkkmyXkJbZc5j16+HRSV61Qrh+tiq3E3yLvFMGJ3AUBODOPNLWpTg==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-core": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.2.tgz", - "integrity": "sha512-IlxLGQf+wJHCR+NM0UWqDh4xe/Gu6sg2i4tfZk6WIij34IVk9BdOQgi6WvqSHd879jbQIUgL2fBdJUJyAP5ypQ==" - }, - "node_modules/workbox-expiration": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.2.tgz", - "integrity": "sha512-5Hfp0uxTZJrgTiy9W7AjIIec+9uTOtnxY/tRBm4DbqcWKaWbVTa+izrKzzOT4MXRJJIJUmvRhWw4oo8tpmMouw==", - "dependencies": { - "idb": "^6.1.4", - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.2.tgz", - "integrity": "sha512-8SMar+N0xIreP5/2we3dwtN1FUmTMScoopL86aKdXBpio8vXc8Oqb5fCJG32ialjN8BAOzDqx/FnGeCtkIlyvw==", - "dependencies": { - "workbox-background-sync": "6.5.2", - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.2.tgz", - "integrity": "sha512-iqDNWWMswjCsZuvGFDpcX1Z8InBVAlVBELJ28xShsWWntALzbtr0PXMnm2WHkXCc56JimmGldZi1N5yDPiTPOg==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-precaching": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.2.tgz", - "integrity": "sha512-OZAlQ8AAT20KugGKKuJMHdQ8X1IyNQaLv+mPTHj+8Dmv8peBq5uWNzs4g/1OSFmXsbXZ6a1CBC6YtQWVPhJQ9w==", - "dependencies": { - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.2.tgz", - "integrity": "sha512-zi5VqF1mWqfCyJLTMXn1EuH/E6nisqWDK1VmOJ+TnjxGttaQrseOhMn+BMvULFHeF8AvrQ0ogfQ6bSv0rcfAlg==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-recipes": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.2.tgz", - "integrity": "sha512-2lcUKMYDiJKvuvRotOxLjH2z9K7jhj8GNUaHxHNkJYbTCUN3LsX1cWrsgeJFDZ/LgI565t3fntpbG9J415ZBXA==", - "dependencies": { - "workbox-cacheable-response": "6.5.2", - "workbox-core": "6.5.2", - "workbox-expiration": "6.5.2", - "workbox-precaching": "6.5.2", - "workbox-routing": "6.5.2", - "workbox-strategies": "6.5.2" - } - }, - "node_modules/workbox-routing": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.2.tgz", - "integrity": "sha512-nR1w5PjF6IVwo0SX3oE88LhmGFmTnqqU7zpGJQQPZiKJfEKgDENQIM9mh3L1ksdFd9Y3CZVkusopHfxQvit/BA==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-strategies": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.2.tgz", - "integrity": "sha512-fgbwaUMxbG39BHjJIs2y2X21C0bmf1Oq3vMQxJ1hr6y5JMJIm8rvKCcf1EIdAr+PjKdSk4ddmgyBQ4oO8be4Uw==", - "dependencies": { - "workbox-core": "6.5.2" - } - }, - "node_modules/workbox-streams": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.2.tgz", - "integrity": "sha512-ovD0P4UrgPtZ2Lfc/8E8teb1RqNOSZr+1ZPqLR6sGRZnKZviqKbQC3zVvvkhmOIwhWbpL7bQlWveLVONHjxd5w==", - "dependencies": { - "workbox-core": "6.5.2", - "workbox-routing": "6.5.2" - } - }, - "node_modules/workbox-sw": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.2.tgz", - "integrity": "sha512-2KhlYqtkoqlnPdllj2ujXUKRuEFsRDIp6rdE4l1PsxiFHRAFaRTisRQpGvRem5yxgXEr+fcEKiuZUW2r70KZaw==" - }, - "node_modules/workbox-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-StrJ7wKp5tZuGVcoKLVjFWlhDy+KT7ZWsKnNcD6F08wA9Cpt6JN+PLIrplcsTHbQpoAV8+xg6RvcG0oc9z+RpQ==", - "dependencies": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.5.2" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.9.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/workbox-window": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.2.tgz", - "integrity": "sha512-2kZH37r9Wx8swjEOL4B8uGM53lakMxsKkQ7mOKzGA/QAn/DQTEZGrdHWtypk2tbhKY5S0jvPS+sYDnb2Z3378A==", - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.2" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, "dependencies": { "@ampproject/remapping": { "version": "2.1.2", @@ -19755,8 +2024,7 @@ "@mui/types": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", - "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==", - "requires": {} + "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==" }, "@mui/utils": { "version": "5.5.3", @@ -20723,14 +2991,12 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" }, "acorn-node": { "version": "1.8.2", @@ -20825,8 +3091,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "ansi-align": { "version": "3.0.1", @@ -21132,8 +3397,7 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "requires": {} + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -21935,8 +4199,7 @@ "css-declaration-sorter": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "requires": {} + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==" }, "css-has-pseudo": { "version": "3.0.4", @@ -22029,8 +4292,7 @@ "css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "requires": {} + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" }, "css-select": { "version": "4.3.0", @@ -22129,8 +4391,7 @@ "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" }, "csso": { "version": "4.2.0", @@ -23096,8 +5357,7 @@ "eslint-plugin-react-hooks": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", - "requires": {} + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==" }, "eslint-plugin-testing-library": { "version": "5.1.0", @@ -24097,8 +6357,7 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" }, "idb": { "version": "6.1.5", @@ -25194,8 +7453,7 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "requires": {} + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" }, "jest-regex-util": { "version": "27.5.1", @@ -26931,8 +9189,7 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "requires": {} + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" }, "postcss-calc": { "version": "8.2.4", @@ -26997,8 +9254,7 @@ "postcss-custom-media": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "requires": {} + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==" }, "postcss-custom-properties": { "version": "12.1.5", @@ -27027,26 +9283,22 @@ "postcss-discard-comments": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "requires": {} + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==" }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" }, "postcss-double-position-gradients": { "version": "3.1.1", @@ -27068,8 +9320,7 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "requires": {} + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" }, "postcss-focus-visible": { "version": "6.0.4", @@ -27090,14 +9341,12 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" }, "postcss-gap-properties": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "requires": {} + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==" }, "postcss-image-set-function": { "version": "4.0.6", @@ -27110,8 +9359,7 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "requires": {} + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" }, "postcss-js": { "version": "4.0.0", @@ -27174,14 +9422,12 @@ "postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "requires": {} + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "requires": {} + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" }, "postcss-merge-longhand": { "version": "5.1.3", @@ -27242,8 +9488,7 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -27300,8 +9545,7 @@ "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -27386,14 +9630,12 @@ "postcss-overflow-shorthand": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "requires": {} + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==" }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" }, "postcss-place": { "version": "7.0.4", @@ -27481,8 +9723,7 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" }, "postcss-selector-not": { "version": "5.0.0", @@ -27964,8 +10205,7 @@ "react-icons": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz", - "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==", - "requires": {} + "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==" }, "react-is": { "version": "17.0.2", @@ -28808,21 +11048,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -28898,6 +11123,21 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -28946,8 +11186,7 @@ "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "requires": {} + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" }, "stylehacks": { "version": "5.1.0", @@ -29898,8 +12137,7 @@ "ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "requires": {} + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" } } }, @@ -30342,8 +12580,7 @@ "ws": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "requires": {} + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" }, "xdg-basedir": { "version": "4.0.0", diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index e909b3f52..e222bbf91 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1046,7 +1046,18 @@ void Thermostat::process_RC30Set(std::shared_ptr telegram) { if (hc == nullptr) { return; } + has_update(telegram, ibaLanguage_, 0); // language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian + has_update(telegram, ibaCalIntTemperature_, 1); // offset int. temperature sensor, by * 0.1 Kelvin + has_update(telegram, autodst_, 2); // Automatic change Daylight Saving time: (0x00 = off, 0xFF = on) + has_update(telegram, ibaBuildingType_, 4); // building type: 0 = light, 1 = medium, 2 = heavy + has_update(telegram, ibaClockOffset_, 10); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s + has_update(telegram, backlight_, 12); // Keyboard lighting: (0x00 = off, 0xFF = on) + has_update(telegram, mixingvalves_, 17); // Number of Mixing Valves: (0x00=0, 0x01=1, 0x02=2) + has_update(telegram, brightness_, 18); // Screen brightness 0F=dark F1=light has_update(telegram, hc->mode, 23); + has_update(telegram, offtemp_, 24); // Set Temperature when mode is Off / 10 (e.g.: 0x0F = 7.5 degrees Celsius) + has_update(telegram, heatingpid_, 25); // PID setting 00=1 01=2 02=3 + has_update(telegram, preheating_, 26); // Preheating in the clock program: (0x00 = off, 0xFF = on) } // type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4) - data from the RC35 thermostat (0x10) - 16 bytes @@ -1323,19 +1334,23 @@ bool Thermostat::set_minexttemp(const char * value, const int8_t id) { return true; } -// 0xA5 - Clock offset +// 0xA5/0xA7 - Clock offset bool Thermostat::set_clockoffset(const char * value, const int8_t id) { int co = 0; if (!Helpers::value2number(value, co)) { return false; } - write_command(EMS_TYPE_IBASettings, 12, co, EMS_TYPE_IBASettings); + if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30Settings, 10, co, EMS_TYPE_RC30Settings); + } else { + write_command(EMS_TYPE_IBASettings, 12, co, EMS_TYPE_IBASettings); + } return true; } -// 0xA5 - Calibrate internal temperature +// 0xA5/0xA7 - Calibrate internal temperature bool Thermostat::set_calinttemp(const char * value, const int8_t id) { float ct = 0; if (!Helpers::value2temperature(value, ct, true)) { @@ -1347,6 +1362,8 @@ bool Thermostat::set_calinttemp(const char * value, const int8_t id) { if (model() == EMS_DEVICE_FLAG_RC10) { write_command(0xB0, 0, t, 0xB0); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30Settings, 1, t, EMS_TYPE_RC30Settings); } else { write_command(EMS_TYPE_IBASettings, 2, t, EMS_TYPE_IBASettings); } @@ -1366,6 +1383,18 @@ bool Thermostat::set_display(const char * value, const int8_t id) { return true; } +// 0xA7 - Set Screen brightness +bool Thermostat::set_brightness(const char * value, const int8_t id) { + int bo = 0; + if (!Helpers::value2number(value, bo, -15, 15)) { + return false; + } + + write_command(EMS_TYPE_RC30Settings, 18, bo, EMS_TYPE_RC30Settings); + + return true; +} + bool Thermostat::set_remotetemp(const char * value, const int8_t id) { float f = 0; if (!Helpers::value2temperature(value, f)) { @@ -1390,7 +1419,7 @@ bool Thermostat::set_remotetemp(const char * value, const int8_t id) { return true; } -// 0xA5 - Set the building settings +// 0xA5/0xA7 - Set the building settings bool Thermostat::set_building(const char * value, const int8_t id) { uint8_t bd = 0; if (!Helpers::value2enum(value, bd, FL_(enum_ibaBuildingType))) { @@ -1399,6 +1428,8 @@ bool Thermostat::set_building(const char * value, const int8_t id) { if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x240, 9, bd + 1, 0x240); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30Settings, 4, bd, EMS_TYPE_RC30Settings); } else { write_command(EMS_TYPE_IBASettings, 6, bd, EMS_TYPE_IBASettings); } @@ -1406,7 +1437,7 @@ bool Thermostat::set_building(const char * value, const int8_t id) { return true; } -// 0xB0 - Set RC10 heating pid +// 0xB0/0xA7 - Set RC10 heating pid bool Thermostat::set_heatingpid(const char * value, const int8_t id) { uint8_t pid = 0; if (!Helpers::value2enum(value, pid, FL_(enum_PID))) { @@ -1415,12 +1446,14 @@ bool Thermostat::set_heatingpid(const char * value, const int8_t id) { if (model() == EMS_DEVICE_FLAG_RC10) { write_command(0xB0, 6, pid, 0xB0); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30Settings, 25, pid, EMS_TYPE_RC30Settings); } return true; } -// 0xA5 - Set the building settings +// 0xA5 - Set the damping settings bool Thermostat::set_damping(const char * value, const int8_t id) { bool dmp; if (Helpers::value2bool(value, dmp)) { @@ -1431,14 +1464,21 @@ bool Thermostat::set_damping(const char * value, const int8_t id) { return false; } -// 0xA5 Set the language settings +// 0xA5/0xA7 Set the language settings bool Thermostat::set_language(const char * value, const int8_t id) { uint8_t lg = 0; - if (!Helpers::value2enum(value, lg, FL_(enum_ibaLanguage))) { - return false; - } - write_command(EMS_TYPE_IBASettings, 1, lg, EMS_TYPE_IBASettings); + if (model() == EMS_DEVICE_FLAG_RC30) { + if (!Helpers::value2enum(value, lg, FL_(enum_ibaLanguage_RC30))) { + return false; + } + write_command(EMS_TYPE_RC30Settings, 0, lg, EMS_TYPE_RC30Settings); + } else { + if (!Helpers::value2enum(value, lg, FL_(enum_ibaLanguage))) { + return false; + } + write_command(EMS_TYPE_IBASettings, 1, lg, EMS_TYPE_IBASettings); + } return true; } @@ -1671,14 +1711,63 @@ bool Thermostat::set_wwOneTimeKey(const char * value, const int8_t id) { return true; } -// only RC10, 0xB0 +// for RC10, 0xB0 or RC30, 0xA7 bool Thermostat::set_backlight(const char * value, const int8_t id) { bool b = false; if (!Helpers::value2bool(value, b)) { return false; } - write_command(0xB0, 1, b ? 0xFF : 0x00, 0xB0); + if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30Settings, 12, b ? 0xFF : 0x00, EMS_TYPE_RC30Settings); + } else { + write_command(0xB0, 1, b ? 0xFF : 0x00, 0xB0); + } + + return true; +} + +bool Thermostat::set_autodst(const char * value, const int8_t id) { + bool b = false; + if (!Helpers::value2bool(value, b)) { + return false; + } + + write_command(EMS_TYPE_RC30Settings, 2, b ? 0xFF : 0x00, EMS_TYPE_RC30Settings); + + return true; +} + +bool Thermostat::set_preheating(const char * value, const int8_t id) { + bool b = false; + if (!Helpers::value2bool(value, b)) { + return false; + } + + write_command(EMS_TYPE_RC30Settings, 26, b ? 0xFF : 0x00, EMS_TYPE_RC30Settings); + + return true; +} + +bool Thermostat::set_offtemp(const char * value, const int8_t id) { + int ot = 0; + if (!Helpers::value2temperature(value, ot, true)) { + return false; + } + + auto t = (int8_t)(ot * 2); + write_command(EMS_TYPE_RC30Settings, 24, t, EMS_TYPE_RC30Settings); + + return true; +} + +bool Thermostat::set_mixingvalves(const char * value, const int8_t id) { + int m = 0; + if (!Helpers::value2number(value, m, 0, 2)) { + return false; + } + + write_command(EMS_TYPE_RC30Settings, 17, m, EMS_TYPE_RC30Settings); return true; } @@ -3021,24 +3110,77 @@ void Thermostat::register_device_values() { break; case EMS_DEVICE_FLAG_RC30: register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime - register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, - &ibaMainDisplay_, - DeviceValueType::ENUM, - FL_(enum_ibaMainDisplay), - FL_(ibaMainDisplay), - DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, - &ibaLanguage_, - DeviceValueType::ENUM, - FL_(enum_ibaLanguage), - FL_(ibaLanguage), - DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaClockOffset_, DeviceValueType::INT, nullptr, FL_(ibaClockOffset), - DeviceValueUOM::SECONDS); // offset (in sec) to clock, 0xff=-1s, 0x02=2s + DeviceValueUOM::SECONDS, + MAKE_CF_CB(set_clockoffset)); // offset (in sec) to clock, 0xff=-1s, 0x02=2s + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &autodst_, DeviceValueType::BOOL, nullptr, FL_(autodst), DeviceValueUOM::NONE, MAKE_CF_CB(set_autodst)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &ibaLanguage_, + DeviceValueType::ENUM, + FL_(enum_ibaLanguage_RC30), + FL_(ibaLanguage), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_language)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &ibaMainDisplay_, + DeviceValueType::ENUM, + FL_(enum_ibaMainDisplay), + FL_(ibaMainDisplay), + DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &backlight_, DeviceValueType::BOOL, nullptr, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &brightness_, + DeviceValueType::INT, + nullptr, + FL_(brightness), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_brightness), + -15, + 15); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &mixingvalves_, + DeviceValueType::UINT, + nullptr, + FL_(mixingvalves), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_mixingvalves), + 0, + 2); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &ibaBuildingType_, + DeviceValueType::ENUM, + FL_(enum_ibaBuildingType), + FL_(ibaBuildingType), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_building)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &heatingpid_, + DeviceValueType::ENUM, + FL_(enum_PID), + FL_(heatingPID), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_heatingpid)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &preheating_, DeviceValueType::BOOL, nullptr, FL_(preheating), DeviceValueUOM::NONE, MAKE_CF_CB(set_preheating)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &ibaCalIntTemperature_, + DeviceValueType::INT, + FL_(div10), + FL_(ibaCalIntTemperature), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_calinttemp)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &offtemp_, + DeviceValueType::UINT, + FL_(div2), + FL_(offtemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_offtemp), + 5, + 30); break; case EMS_DEVICE_FLAG_RC30_N: register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 9793d1645..4c0a42b6c 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -182,6 +182,11 @@ class Thermostat : public EMSdevice { uint8_t ibaDamping_; // damping 0-off, 0xff-on uint8_t backlight_; uint8_t heatingpid_; + int8_t brightness_; // Screen brightness 0F=dark F1=light + uint8_t preheating_; // Preheating in the clock program: (0x00 = off, 0xFF = on) + uint8_t autodst_; // Automatic change Daylight Saving time: (0x00 = off, 0xFF = on) + uint8_t offtemp_; // Set Temperature when mode is Off / 10 (e.g.: 0x0F = 7.5 degrees Celsius) + uint8_t mixingvalves_; // Number of Mixing Valves: (0x00=0, 0x01=1, 0x02=2) int8_t dampedoutdoortemp_; uint16_t tempsensor1_; @@ -296,6 +301,7 @@ class Thermostat : public EMSdevice { // Installation settings static constexpr uint8_t EMS_TYPE_IBASettings = 0xA5; // installation settings + static constexpr uint8_t EMS_TYPE_RC30Settings = 0xA7; // RC30 settings static constexpr uint8_t EMS_TYPE_wwSettings = 0x37; // ww settings static constexpr uint8_t EMS_TYPE_time = 0x06; // time @@ -430,6 +436,11 @@ class Thermostat : public EMSdevice { bool set_reducehours(const char * value, const int8_t id); bool set_backlight(const char * value, const int8_t id); bool set_heatingpid(const char * value, const int8_t id); + bool set_brightness(const char * value, const int8_t id); + bool set_autodst(const char * value, const int8_t id); + bool set_preheating(const char * value, const int8_t id); + bool set_mixingvalves(const char * value, const int8_t id); + bool set_offtemp(const char * value, const int8_t id); }; } // namespace emsesp diff --git a/src/locale_DE.h b/src/locale_DE.h index f32464a03..703e33a9b 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -347,6 +347,7 @@ MAKE_PSTR_LIST(enum_ibaMainDisplay, F_(date), F_(smoke_temperature)) MAKE_PSTR_LIST(enum_ibaLanguage, F_(german), F_(dutch), F_(french), F_(italian)) +MAKE_PSTR_LIST(enum_ibaLanguage_RC30, F_(german), F_(dutch)) MAKE_PSTR_LIST(enum_floordrystatus, F_(off), F_(start), F_(heat), F_(hold), F_(cool), F_(end)) MAKE_PSTR_LIST(enum_ibaBuildingType, F_(light), F_(medium), F_(heavy)) // RC300 MAKE_PSTR_LIST(enum_PID, F("fast"), F_(medium), F("slow")) @@ -581,6 +582,11 @@ MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("Temperatursensor 2")) MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("gedämpfte Aussentemperatur")) MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("Estrichtrocknung")) MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("Estrichtrocknungs Temperatur")) +MAKE_PSTR_LIST(brightness, F("brightness"), F("bildschirmhelligkeit")) +MAKE_PSTR_LIST(autodst, F("autodst"), F("automatische sommerzeit umstellung")) +MAKE_PSTR_LIST(preheating, F("preheating"), F("vorheizen im uhrenprogramm")) +MAKE_PSTR_LIST(offtemp, F("offtemp"), F("temperatur bei ausgeschaltetem modus")) +MAKE_PSTR_LIST(mixingvalves, F("mixingvalves"), F("mischventile")) // thermostat ww MAKE_PSTR_LIST(wwMode, F("wwmode"), F("modus")) MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("untere Solltemperatur")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 9ba68d017..3823a7bde 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -347,6 +347,7 @@ MAKE_PSTR_LIST(enum_ibaMainDisplay, F_(date), F_(smoke_temperature)) MAKE_PSTR_LIST(enum_ibaLanguage, F_(german), F_(dutch), F_(french), F_(italian)) +MAKE_PSTR_LIST(enum_ibaLanguage_RC30, F_(german), F_(dutch)) MAKE_PSTR_LIST(enum_floordrystatus, F_(off), F_(start), F_(heat), F_(hold), F_(cool), F_(end)) MAKE_PSTR_LIST(enum_ibaBuildingType, F_(light), F_(medium), F_(heavy)) MAKE_PSTR_LIST(enum_PID, F("fast"), F_(medium), F("slow")) @@ -571,6 +572,11 @@ MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("temperature sensor 2")) MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("damped outdoor temperature")) MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("floor drying")) MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("floor drying temperature")) +MAKE_PSTR_LIST(brightness, F("brightness"), F("screen brightness")) +MAKE_PSTR_LIST(autodst, F("autodst"), F("automatic change daylight saving time")) +MAKE_PSTR_LIST(preheating, F("preheating"), F("preheating in the clock program")) +MAKE_PSTR_LIST(offtemp, F("offtemp"), F("temperature when mode is off")) +MAKE_PSTR_LIST(mixingvalves, F("mixingvalves"), F("mixing valves")) // thermostat ww MAKE_PSTR_LIST(wwMode, F("wwmode"), F("mode")) MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("set low temperature")) From 4a93adb1f8dfcd83c5b6db5ace24388e18641fc2 Mon Sep 17 00:00:00 2001 From: Proddy Date: Tue, 5 Apr 2022 23:28:10 +0200 Subject: [PATCH 194/319] remove aliases --- src/command.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/command.h b/src/command.h index 3ff3c3c38..e12eab87a 100644 --- a/src/command.h +++ b/src/command.h @@ -139,13 +139,10 @@ class Command { } }; -using KeyValueMap_t = std::unordered_map; -using Folder_t = std::vector; - class SUrlParser { private: - KeyValueMap_t m_keysvalues; - Folder_t m_folders; + std::unordered_map m_keysvalues; + std::vector m_folders; public: SUrlParser() = default; @@ -153,11 +150,11 @@ class SUrlParser { bool parse(const char * url); - Folder_t & paths() { + std::vector & paths() { return m_folders; }; - KeyValueMap_t & params() { + std::unordered_map & params() { return m_keysvalues; }; From 503df0842bd92d820dbfc66f378c41a9a37e19b1 Mon Sep 17 00:00:00 2001 From: Proddy Date: Tue, 5 Apr 2022 23:28:34 +0200 Subject: [PATCH 195/319] fix saving customizatons #450 --- src/emsdevice.cpp | 23 +++++++++---- src/emsdevice.h | 4 ++- src/web/WebCustomizationService.cpp | 53 +++++++++++++++-------------- 3 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 54bbd16f0..105d15002 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -849,27 +849,38 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { // set mask per device entity based on the id which is prefixed with the 2 char hex mask value // returns true if the entity has a mask set (not 0 the default) -bool EMSdevice::mask_entity(const std::string & entity_id) { +void EMSdevice::mask_entity(const std::string & entity_id) { for (auto & dv : devicevalues_) { std::string entity_name = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); - uint8_t current_mask = dv.state >> 4; if (entity_name == entity_id.substr(2)) { // this entity has a new mask set - uint8_t new_mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); // first character contains mask flags + uint8_t current_mask = dv.state >> 4; + uint8_t new_mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); // first character contains mask flags if (Mqtt::ha_enabled() && ((current_mask ^ new_mask) & (DeviceValueState::DV_READONLY >> 4))) { // remove ha config on change of dv_readonly flag dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) } dv.state = ((dv.state & 0x0F) | (new_mask << 4)); // set state high bits to flag - return new_mask; // true if entity mask is not the deafult 0 + return; } } - - return false; // we didn't find the entity } +// populate a string vector with entities that have masks set +void EMSdevice::getMaskedEntities(std::vector & entity_ids) { + for (auto & dv : devicevalues_) { + std::string entity_name = + dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); + uint8_t mask = dv.state >> 4; + if (mask) { + entity_ids.push_back(Helpers::hextoa(mask, false) + entity_name); + } + } +} + + // builds json for a specific device value / entity // cmd is the endpoint or name of the device entity // returns false if failed, otherwise true diff --git a/src/emsdevice.h b/src/emsdevice.h index fdfbba7e2..99cadae76 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -183,7 +183,9 @@ class EMSdevice { char * show_telegram_handlers(char * result, const size_t len, const uint8_t handlers); void show_mqtt_handlers(uuid::console::Shell & shell) const; void list_device_entries(JsonObject & output) const; - bool mask_entity(const std::string & entity_id); + + void mask_entity(const std::string & entity_id); + void getMaskedEntities(std::vector & entity_ids); using process_function_p = std::function)>; diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 7c51ecf0e..3b01c0291 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -210,52 +210,53 @@ void WebCustomizationService::device_entities(AsyncWebServerRequest * request, J request->send(response); } -// takes a list of masked ids sent from the webUI +// takes a list of updated entities with new masks from the web UI // saves it in the customization service // and updates the entity list real-time void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { - // EMSESP::logger().debug(F("Masked entities json size: %d"), measureJson(json)); // find the device using the unique_id for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice) { uint8_t unique_device_id = json["id"]; if (emsdevice->unique_id() == unique_device_id) { - // build a list of entities - JsonArray entity_ids_json = json["entity_ids"]; - std::vector entity_ids; - for (const JsonVariant id : entity_ids_json) { - std::string entity_id = id.as(); - // set the new mask and add to the list of customized entities if the value is different from the default (mask == 0) - if (emsdevice->mask_entity(entity_id)) { - entity_ids.push_back(entity_id); - } - } - uint8_t product_id = emsdevice->product_id(); uint8_t device_id = emsdevice->device_id(); + // and set the mask immediately for the changed entities + JsonArray entity_ids_json = json["entity_ids"]; + for (const JsonVariant id : entity_ids_json) { + emsdevice->mask_entity(id.as()); + } + // Save the list to the customization file EMSESP::webCustomizationService.update( [&](WebCustomization & settings) { - // if it exists (productid and deviceid match) overwrite it - for (auto & entityCustomization : settings.entityCustomizations) { - if ((entityCustomization.product_id == product_id) && (entityCustomization.device_id == device_id)) { - // already exists, clear the list and add the new values - entityCustomization.entity_ids.clear(); - for (uint8_t i = 0; i < entity_ids.size(); i++) { - entityCustomization.entity_ids.push_back(entity_ids[i]); - } - return StateUpdateResult::CHANGED; + // see if we already have a mask list for this device, if so remove it + for (auto it = settings.entityCustomizations.begin(); it != settings.entityCustomizations.end();) { + if ((*it).product_id == product_id && (*it).device_id == device_id) { + it = settings.entityCustomizations.erase(it); + break; + } else { + ++it; } } - // create a new entry in the list + + if (!entity_ids_json.size()) { + return StateUpdateResult::UNCHANGED; // nothing to add + } + + // create a new entry for this device if there are values EntityCustomization new_entry; new_entry.product_id = product_id; new_entry.device_id = device_id; - for (uint8_t i = 0; i < entity_ids.size(); i++) { - new_entry.entity_ids.push_back(entity_ids[i]); - } + + // get list of entities that have masks + std::vector entity_ids; + emsdevice->getMaskedEntities(entity_ids); + new_entry.entity_ids = entity_ids; + + // add the record and save settings.entityCustomizations.push_back(new_entry); return StateUpdateResult::CHANGED; }, From 3d8396a35a99210291a0ba26edb873a64ea6697a Mon Sep 17 00:00:00 2001 From: Proddy Date: Wed, 6 Apr 2022 20:20:18 +0200 Subject: [PATCH 196/319] added moduline 400 additions --- CHANGELOG_LATEST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 186abadbf..d5958bf8d 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -31,6 +31,7 @@ - set mode has immediate effect [#395](https://github.com/emsesp/EMS-ESP32/issues/395) - min/max in web value setting - Extend customization to select if an entity is to be shown in the WebUI or forced as read-only [#317](https://github.com/emsesp/EMS-ESP32/issues/317) +- Added Moduline 400 installation parameters [PR #449 by @kwertie01](https://github.com/emsesp/EMS-ESP32/pull/449) ### Fixed @@ -76,4 +77,3 @@ - Boiler `ww` tag renamed to `dhw`. Any custom Home Assistant lovelace dashboards will need updating. - Renamed description of `wwtapactivated` to "turn on/off DHW". Otherwise would have looked like "boiler_dhw_turn_on_off_dhw" in HA. - `/api/system/info` endpoint has updated keys. Now lowercase, no underscores and not capitalized. Replace "handlers" with "handlers received", "handlers fetched" and "handlers pending". - - exclude list changed from 3.4.0b8 to 3.4.0b9 and has to be updated by user. From 56bb5433a040a10870b49ee02d7b151ea72f069a Mon Sep 17 00:00:00 2001 From: Proddy Date: Wed, 6 Apr 2022 20:20:24 +0200 Subject: [PATCH 197/319] updated packages --- interface/package-lock.json | 18420 +++++++++++++++++++++++++++++++++- interface/package.json | 6 +- 2 files changed, 17958 insertions(+), 468 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index ce238bac4..3272ddc92 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -1,8 +1,17591 @@ { "name": "EMS-ESP", "version": "3.4.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "EMS-ESP", + "version": "3.4.0", + "dependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@msgpack/msgpack": "^2.7.2", + "@mui/icons-material": "^5.6.0", + "@mui/material": "^5.6.0", + "@types/lodash": "^4.14.181", + "@types/node": "^17.0.23", + "@types/react": "^17.0.43", + "@types/react-dom": "^17.0.14", + "@types/react-router-dom": "^5.3.3", + "async-validator": "^4.0.7", + "axios": "^0.26.1", + "http-proxy-middleware": "^2.0.4", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "notistack": "^2.0.3", + "parse-ms": "^3.0.0", + "react": "^17.0.2", + "react-app-rewired": "^2.2.1", + "react-dom": "^17.0.2", + "react-dropzone": "^12.0.4", + "react-icons": "^4.3.1", + "react-router-dom": "^6.3.0", + "react-scripts": "5.0.0", + "sockette": "^2.0.6", + "typescript": "^4.6.3" + }, + "devDependencies": { + "nodemon": "^2.0.15", + "npm-run-all": "^4.1.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", + "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", + "dependencies": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "dependencies": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", + "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.9", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.17.0", + "charcodes": "^0.2.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "dependencies": { + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", + "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", + "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", + "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-flow": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", + "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", + "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", + "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", + "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "dependencies": { + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", + "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dependencies": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", + "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", + "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", + "dependencies": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@csstools/normalize.css": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", + "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", + "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", + "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", + "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz", + "integrity": "sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", + "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz", + "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", + "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "dependencies": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz", + "integrity": "sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==", + "dependencies": { + "@emotion/memoize": "^0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "node_modules/@emotion/react": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.3", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", + "dependencies": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + }, + "node_modules/@emotion/styled": { + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.8.1.tgz", + "integrity": "sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/is-prop-valid": "^1.1.2", + "@emotion/serialize": "^1.0.2", + "@emotion/utils": "^1.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@emotion/utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, + "node_modules/@eslint/eslintrc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.1", + "globals": "^13.9.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", + "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==" + }, + "node_modules/@msgpack/msgpack": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", + "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-alpha.75", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.75.tgz", + "integrity": "sha512-eQ8SP2ML5nJyOdSqmk26ezg/eEP1k42Z+k6uMfNbgHZc8iZwgw9iVe+6g5j/qZPKS88AtxVG8YsLLZkXT82/Bw==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@emotion/is-prop-valid": "^1.1.2", + "@mui/types": "^7.1.3", + "@mui/utils": "^5.6.0", + "@popperjs/core": "^2.11.4", + "clsx": "^1.1.1", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/icons-material": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.0.tgz", + "integrity": "sha512-2GDGt+/BbwM3oVkF84b9FFKQdQ9TxBJIRnTwT99vO2mimdfJaojxMRB2lkysm9tUY4HOf0yoU6O//X6GTC0Zhw==", + "dependencies": { + "@babel/runtime": "^7.17.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.0.tgz", + "integrity": "sha512-yh4FoRRPTgJWjv1oIu3YuvfYGD/WOEnyGizQ9fKs+hlMjIc0rzFpyUCo++P/3BUd0/hRKcI8D8mrpJK9OiOy1g==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@mui/base": "5.0.0-alpha.75", + "@mui/system": "^5.6.0", + "@mui/types": "^7.1.3", + "@mui/utils": "^5.6.0", + "@types/react-transition-group": "^4.4.4", + "clsx": "^1.1.1", + "csstype": "^3.0.11", + "hoist-non-react-statics": "^3.3.2", + "prop-types": "^15.7.2", + "react-is": "^17.0.2", + "react-transition-group": "^4.4.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.0.tgz", + "integrity": "sha512-62jUFaMGfW3nvq/worcOAEiY++rWd44tpWShq4o97DybWmmWvEFYlBIuHEcXrtBIK/cloaQw8jqelQIFZeiVdw==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@mui/utils": "^5.6.0", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.0.tgz", + "integrity": "sha512-K1WPKTruJTPA49cub0HtDCBBvosPKizqgZ4RenAfWz/ldlFtM4p7e7Mt3YEnNWTOJMHvDGcEke1tCuELkVAMyA==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@emotion/cache": "^11.7.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.0.tgz", + "integrity": "sha512-FoytH73hY78Dll6F0fg7AI/hnpplygbFeW0HsqBfwFWrt2PMc2YSq2ICqHzd2CZPIhzEgRHDTSI8bMTLtG9W7A==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@mui/private-theming": "^5.6.0", + "@mui/styled-engine": "^5.6.0", + "@mui/types": "^7.1.3", + "@mui/utils": "^5.6.0", + "clsx": "^1.1.1", + "csstype": "^3.0.11", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", + "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.0.tgz", + "integrity": "sha512-LbZKkCOn4243vbEVGbaKV7t6eN6kz7t95DR6AcUCRk4daH3l7CXPYkWsyzysRWdXgSzHmIyrgg4FZKzTy0dTHQ==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@types/prop-types": "^15.7.4", + "@types/react-is": "^16.7.1 || ^17.0.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz", + "integrity": "sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ==", + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.8.1", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <3.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz", + "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + }, + "node_modules/@types/lodash": { + "version": "4.14.181", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", + "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prettier": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", + "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/react": { + "version": "17.0.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.43.tgz", + "integrity": "sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.14.tgz", + "integrity": "sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-is": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", + "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", + "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", + "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", + "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.18.0", + "@typescript-eslint/type-utils": "5.18.0", + "@typescript-eslint/utils": "5.18.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "dependencies": { + "lru-cache": "^7.4.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz", + "integrity": "sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA==", + "dependencies": { + "@typescript-eslint/utils": "5.18.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", + "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.18.0", + "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/typescript-estree": "5.18.0", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", + "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", + "dependencies": { + "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/visitor-keys": "5.18.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", + "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", + "dependencies": { + "@typescript-eslint/utils": "5.18.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", + "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", + "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", + "dependencies": { + "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/visitor-keys": "5.18.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "dependencies": { + "lru-cache": "^7.4.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", + "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.18.0", + "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/typescript-estree": "5.18.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", + "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", + "dependencies": { + "@typescript-eslint/types": "5.18.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-validator": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", + "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axe-core": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", + "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-preset-react-app/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "node_modules/bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/bonjour-service": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", + "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/charcodes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", + "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "node_modules/clean-css": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/core-js": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", + "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", + "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "dependencies": { + "browserslist": "^4.19.1", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", + "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "dependencies": { + "lru-cache": "^7.4.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", + "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", + "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", + "dependencies": { + "cssnano-preset-default": "^5.2.7", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", + "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", + "dependencies": { + "css-declaration-sorter": "^6.2.2", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.4", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.2", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/csstype": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "node_modules/dns-packet": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.104", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.104.tgz", + "integrity": "sha512-2kjoAyiG7uMyGRM9mx25s3HAzmQG2ayuYXxsFmYugHSDcwxREgLtscZvbL1JcW9S/OemeQ3f/SG6JhDwpnCclQ==" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", + "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/es-abstract": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", + "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", + "dependencies": { + "@eslint/eslintrc": "^1.2.1", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", + "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", + "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "aria-query": "^4.2.2", + "array-includes": "^3.1.4", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.3.5", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", + "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz", + "integrity": "sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA==", + "dependencies": { + "@typescript-eslint/utils": "^5.13.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz", + "integrity": "sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==", + "dependencies": { + "@types/eslint": "^7.28.2", + "jest-worker": "^27.3.1", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dependencies": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-selector": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", + "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" + }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", + "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "dependencies": { + "lru-cache": "^7.4.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", + "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "node_modules/immer": { + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", + "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.8.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz", + "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==", + "dependencies": { + "async": "0.9.x", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "dependencies": { + "lru-cache": "^7.4.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz", + "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^27.0.0", + "jest-watcher": "^27.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-watch-typeahead/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", + "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", + "dependencies": { + "array-includes": "^3.1.4", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.3.tgz", + "integrity": "sha512-WY9wjJNQt9+PZilnLbuFKM+SwDull9+6IAguOrarOMoOHTcJ9GnXSO11+Gw6c7xtDkBkthR57OZMtZKYr+1CEw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "dependencies": { + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node_modules/node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + }, + "node_modules/nodemon": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/notistack": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz", + "integrity": "sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==", + "dependencies": { + "clsx": "^1.1.0", + "hoist-non-react-statics": "^3.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/notistack" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "@mui/material": "^5.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dependencies": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/postcss": { + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.2" + }, + "peerDependencies": { + "postcss": "^8.0.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", + "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.6.tgz", + "integrity": "sha512-QEnQkDkb+J+j2bfJisJJpTAFL+lUFl66rUNvnjPBIvRbZACLG4Eu5bmBCIY4FJCqhwsfbBpmJUyb3FcR/31lAg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.2" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", + "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", + "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "dependencies": { + "lru-cache": "^7.4.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", + "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", + "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "dependencies": { + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", + "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "dependencies": { + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", + "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^12 || ^14 || >=16" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", + "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", + "dependencies": { + "@csstools/postcss-color-function": "^1.0.3", + "@csstools/postcss-font-format-keywords": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.0", + "@csstools/postcss-ic-unit": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.1", + "@csstools/postcss-normalize-display-values": "^1.0.0", + "@csstools/postcss-oklab-function": "^1.0.2", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "autoprefixer": "^10.4.4", + "browserslist": "^4.20.2", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^6.5.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.2", + "postcss-color-hex-alpha": "^8.0.3", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.5", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.4", + "postcss-double-position-gradients": "^3.1.1", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.3", + "postcss-image-set-function": "^4.0.6", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.1.2", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.3", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.3", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.4", + "postcss-pseudo-class-any-link": "^7.1.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", + "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "dependencies": { + "balanced-match": "^1.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-app-rewired": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-app-rewired/-/react-app-rewired-2.2.1.tgz", + "integrity": "sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==", + "dependencies": { + "semver": "^5.6.0" + }, + "bin": { + "react-app-rewired": "bin/index.js" + }, + "peerDependencies": { + "react-scripts": ">=2.1.3" + } + }, + "node_modules/react-app-rewired/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", + "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.10", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/react-dev-utils/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/react-dev-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-dropzone": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz", + "integrity": "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", + "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" + }, + "node_modules/react-icons": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz", + "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", + "dependencies": { + "history": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", + "dependencies": { + "history": "^5.2.0", + "react-router": "6.3.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-scripts": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", + "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.0", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.0", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "dependencies": { + "lru-cache": "^7.4.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.70.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", + "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "node_modules/selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockette": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/sockette/-/sockette-2.0.6.tgz", + "integrity": "sha512-W6iG8RGV6Zife3Cj+FhuyHV447E6fqFM2hKmnaQrTvg3OydINV3Msj3WPFbX76blUlUxvQSMMMdrJxce8NqI5Q==" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", + "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", + "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "dependencies": { + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", + "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/tailwindcss": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", + "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", + "dependencies": { + "arg": "^5.0.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss": "^8.4.6", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tailwindcss/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tailwindcss/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tailwindcss/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/tailwindcss/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "dependencies": { + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.4.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.1", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", + "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.2.tgz", + "integrity": "sha512-EjG37LSMDJ1TFlFg56wx6YXbH4/NkG09B9OHvyxx+cGl2gP5OuOzsCY3rOPJSpbcz6jpuA40VIC3HzSD4OvE1g==", + "dependencies": { + "idb": "^6.1.4", + "workbox-core": "6.5.2" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.2.tgz", + "integrity": "sha512-DjJYraYnprTZE/AQNoeogaxI1dPuYmbw+ZJeeP8uXBSbg9SNv5wLYofQgywXeRepv4yr/vglMo9yaHUmBMc+4Q==", + "dependencies": { + "workbox-core": "6.5.2" + } + }, + "node_modules/workbox-build": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.2.tgz", + "integrity": "sha512-TVi4Otf6fgwikBeMpXF9n0awHfZTMNu/nwlMIT9W+c13yvxkmDFMPb7vHYK6RUmbcxwPnz4I/R+uL76+JxG4JQ==", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.5.2", + "workbox-broadcast-update": "6.5.2", + "workbox-cacheable-response": "6.5.2", + "workbox-core": "6.5.2", + "workbox-expiration": "6.5.2", + "workbox-google-analytics": "6.5.2", + "workbox-navigation-preload": "6.5.2", + "workbox-precaching": "6.5.2", + "workbox-range-requests": "6.5.2", + "workbox-recipes": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2", + "workbox-streams": "6.5.2", + "workbox-sw": "6.5.2", + "workbox-window": "6.5.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz", + "integrity": "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.2.tgz", + "integrity": "sha512-UnHGih6xqloV808T7ve1iNKZMbpML0jGLqkkmyXkJbZc5j16+HRSV61Qrh+tiq3E3yLvFMGJ3AUBODOPNLWpTg==", + "dependencies": { + "workbox-core": "6.5.2" + } + }, + "node_modules/workbox-core": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.2.tgz", + "integrity": "sha512-IlxLGQf+wJHCR+NM0UWqDh4xe/Gu6sg2i4tfZk6WIij34IVk9BdOQgi6WvqSHd879jbQIUgL2fBdJUJyAP5ypQ==" + }, + "node_modules/workbox-expiration": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.2.tgz", + "integrity": "sha512-5Hfp0uxTZJrgTiy9W7AjIIec+9uTOtnxY/tRBm4DbqcWKaWbVTa+izrKzzOT4MXRJJIJUmvRhWw4oo8tpmMouw==", + "dependencies": { + "idb": "^6.1.4", + "workbox-core": "6.5.2" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.2.tgz", + "integrity": "sha512-8SMar+N0xIreP5/2we3dwtN1FUmTMScoopL86aKdXBpio8vXc8Oqb5fCJG32ialjN8BAOzDqx/FnGeCtkIlyvw==", + "dependencies": { + "workbox-background-sync": "6.5.2", + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.2.tgz", + "integrity": "sha512-iqDNWWMswjCsZuvGFDpcX1Z8InBVAlVBELJ28xShsWWntALzbtr0PXMnm2WHkXCc56JimmGldZi1N5yDPiTPOg==", + "dependencies": { + "workbox-core": "6.5.2" + } + }, + "node_modules/workbox-precaching": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.2.tgz", + "integrity": "sha512-OZAlQ8AAT20KugGKKuJMHdQ8X1IyNQaLv+mPTHj+8Dmv8peBq5uWNzs4g/1OSFmXsbXZ6a1CBC6YtQWVPhJQ9w==", + "dependencies": { + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.2.tgz", + "integrity": "sha512-zi5VqF1mWqfCyJLTMXn1EuH/E6nisqWDK1VmOJ+TnjxGttaQrseOhMn+BMvULFHeF8AvrQ0ogfQ6bSv0rcfAlg==", + "dependencies": { + "workbox-core": "6.5.2" + } + }, + "node_modules/workbox-recipes": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.2.tgz", + "integrity": "sha512-2lcUKMYDiJKvuvRotOxLjH2z9K7jhj8GNUaHxHNkJYbTCUN3LsX1cWrsgeJFDZ/LgI565t3fntpbG9J415ZBXA==", + "dependencies": { + "workbox-cacheable-response": "6.5.2", + "workbox-core": "6.5.2", + "workbox-expiration": "6.5.2", + "workbox-precaching": "6.5.2", + "workbox-routing": "6.5.2", + "workbox-strategies": "6.5.2" + } + }, + "node_modules/workbox-routing": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.2.tgz", + "integrity": "sha512-nR1w5PjF6IVwo0SX3oE88LhmGFmTnqqU7zpGJQQPZiKJfEKgDENQIM9mh3L1ksdFd9Y3CZVkusopHfxQvit/BA==", + "dependencies": { + "workbox-core": "6.5.2" + } + }, + "node_modules/workbox-strategies": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.2.tgz", + "integrity": "sha512-fgbwaUMxbG39BHjJIs2y2X21C0bmf1Oq3vMQxJ1hr6y5JMJIm8rvKCcf1EIdAr+PjKdSk4ddmgyBQ4oO8be4Uw==", + "dependencies": { + "workbox-core": "6.5.2" + } + }, + "node_modules/workbox-streams": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.2.tgz", + "integrity": "sha512-ovD0P4UrgPtZ2Lfc/8E8teb1RqNOSZr+1ZPqLR6sGRZnKZviqKbQC3zVvvkhmOIwhWbpL7bQlWveLVONHjxd5w==", + "dependencies": { + "workbox-core": "6.5.2", + "workbox-routing": "6.5.2" + } + }, + "node_modules/workbox-sw": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.2.tgz", + "integrity": "sha512-2KhlYqtkoqlnPdllj2ujXUKRuEFsRDIp6rdE4l1PsxiFHRAFaRTisRQpGvRem5yxgXEr+fcEKiuZUW2r70KZaw==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-StrJ7wKp5tZuGVcoKLVjFWlhDy+KT7ZWsKnNcD6F08wA9Cpt6JN+PLIrplcsTHbQpoAV8+xg6RvcG0oc9z+RpQ==", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.5.2" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.2.tgz", + "integrity": "sha512-2kZH37r9Wx8swjEOL4B8uGM53lakMxsKkQ7mOKzGA/QAn/DQTEZGrdHWtypk2tbhKY5S0jvPS+sYDnb2Z3378A==", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.5.2" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { "@ampproject/remapping": { "version": "2.1.2", @@ -26,24 +17609,24 @@ "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" }, "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", + "@babel/generator": "^7.17.9", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" } }, @@ -79,9 +17662,9 @@ } }, "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -117,14 +17700,14 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", "@babel/helper-optimise-call-expression": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7" @@ -171,21 +17754,12 @@ } }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "requires": { - "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { @@ -308,19 +17882,19 @@ } }, "@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0" } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -328,9 +17902,9 @@ } }, "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==" + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -380,13 +17954,14 @@ } }, "@babel/plugin-proposal-decorators": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz", - "integrity": "sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", + "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-create-class-features-plugin": "^7.17.9", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "@babel/plugin-syntax-decorators": "^7.17.0", "charcodes": "^0.2.0" } @@ -810,9 +18385,9 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", - "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "requires": { "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -928,11 +18503,11 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "requires": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { @@ -1141,17 +18716,17 @@ } }, "@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", - "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", + "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", "requires": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -1168,17 +18743,17 @@ } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", + "@babel/generator": "^7.17.9", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", + "@babel/parser": "^7.17.9", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -1204,9 +18779,9 @@ "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" }, "@csstools/postcss-color-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.0.3.tgz", - "integrity": "sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", + "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==", "requires": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -1238,11 +18813,11 @@ } }, "@csstools/postcss-is-pseudo-class": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.1.tgz", - "integrity": "sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz", + "integrity": "sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==", "requires": { - "postcss-selector-parser": "^6.0.9" + "postcss-selector-parser": "^6.0.10" } }, "@csstools/postcss-normalize-display-values": { @@ -1254,9 +18829,9 @@ } }, "@csstools/postcss-oklab-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.0.2.tgz", - "integrity": "sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz", + "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==", "requires": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -1320,23 +18895,23 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "@emotion/react": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.2.tgz", - "integrity": "sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", "requires": { "@babel/runtime": "^7.13.10", "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", - "@emotion/serialize": "^1.0.2", + "@emotion/serialize": "^1.0.3", "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" } }, "@emotion/serialize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", - "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", "requires": { "@emotion/hash": "^0.8.0", "@emotion/memoize": "^0.7.4", @@ -1939,20 +19514,25 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@leichtgewicht/ip-codec": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", + "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==" + }, "@msgpack/msgpack": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.74", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.74.tgz", - "integrity": "sha512-pw3T1xNXpW8pLo9+BvtyazZb0CSjNJsjbzznlbV/aNkBfjNPXQVI3X1NDm3WSI8y6M96WDIVO7XrHAohOwALSQ==", + "version": "5.0.0-alpha.75", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.75.tgz", + "integrity": "sha512-eQ8SP2ML5nJyOdSqmk26ezg/eEP1k42Z+k6uMfNbgHZc8iZwgw9iVe+6g5j/qZPKS88AtxVG8YsLLZkXT82/Bw==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/types": "^7.1.3", - "@mui/utils": "^5.5.3", + "@mui/utils": "^5.6.0", "@popperjs/core": "^2.11.4", "clsx": "^1.1.1", "prop-types": "^15.7.2", @@ -1960,23 +19540,23 @@ } }, "@mui/icons-material": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.5.1.tgz", - "integrity": "sha512-40f68p5+Yhq3dCn3QYHqQt5RETPyR3AkDw+fma8PtcjqvZ+d+jF84kFmT6NqwA3he7TlwluEtkyAmPzUE4uPdA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.0.tgz", + "integrity": "sha512-2GDGt+/BbwM3oVkF84b9FFKQdQ9TxBJIRnTwT99vO2mimdfJaojxMRB2lkysm9tUY4HOf0yoU6O//X6GTC0Zhw==", "requires": { "@babel/runtime": "^7.17.2" } }, "@mui/material": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.5.3.tgz", - "integrity": "sha512-eADa3kUYbbr1jNjcufn0a7HeU8cSo0agbrkj720hodxVFNIfzq7a2e58Z+PaZqll55kMGBvlYJ7rTcXU399x5A==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.0.tgz", + "integrity": "sha512-yh4FoRRPTgJWjv1oIu3YuvfYGD/WOEnyGizQ9fKs+hlMjIc0rzFpyUCo++P/3BUd0/hRKcI8D8mrpJK9OiOy1g==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.74", - "@mui/system": "^5.5.3", + "@mui/base": "5.0.0-alpha.75", + "@mui/system": "^5.6.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.5.3", + "@mui/utils": "^5.6.0", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -1987,19 +19567,19 @@ } }, "@mui/private-theming": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.5.3.tgz", - "integrity": "sha512-Wf7NurY7lk8SBWelSBY2U02zxLt1773JpIcXTHuEC9/GZdQA4CXCJGl2cVQzheKhee5rZ+8JwGulrRiVl1m+4A==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.0.tgz", + "integrity": "sha512-62jUFaMGfW3nvq/worcOAEiY++rWd44tpWShq4o97DybWmmWvEFYlBIuHEcXrtBIK/cloaQw8jqelQIFZeiVdw==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.5.3", + "@mui/utils": "^5.6.0", "prop-types": "^15.7.2" } }, "@mui/styled-engine": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.5.2.tgz", - "integrity": "sha512-jkz5AHHbA43akBo5L3y1X1/X0f+RvXvCp3eXKt+iOf3qnKSAausbtlVz7gBbC4xIWDnP1Jb/6T+t/0/7gObRYA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.0.tgz", + "integrity": "sha512-K1WPKTruJTPA49cub0HtDCBBvosPKizqgZ4RenAfWz/ldlFtM4p7e7Mt3YEnNWTOJMHvDGcEke1tCuELkVAMyA==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -2007,15 +19587,15 @@ } }, "@mui/system": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.5.3.tgz", - "integrity": "sha512-J9JcySJuEqfEoP334K/2gEWm2vOx73Uqjii3qlFVhWRBOAJ0Pjyk0sN5W/eVRbwhUm95DNgh2V5s8dRK3vzyVw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.0.tgz", + "integrity": "sha512-FoytH73hY78Dll6F0fg7AI/hnpplygbFeW0HsqBfwFWrt2PMc2YSq2ICqHzd2CZPIhzEgRHDTSI8bMTLtG9W7A==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.5.3", - "@mui/styled-engine": "^5.5.2", + "@mui/private-theming": "^5.6.0", + "@mui/styled-engine": "^5.6.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.5.3", + "@mui/utils": "^5.6.0", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.7.2" @@ -2024,12 +19604,13 @@ "@mui/types": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", - "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==" + "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==", + "requires": {} }, "@mui/utils": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.5.3.tgz", - "integrity": "sha512-t627eVRpl3SlxVya0cIVNs8jPl4KCEiGaTSWY9iKKTcMNaeDbuRML+zv/CFHDPr1zFv+FjJSP02ySB+tZ8xIag==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.0.tgz", + "integrity": "sha512-LbZKkCOn4243vbEVGbaKV7t6eN6kz7t95DR6AcUCRk4daH3l7CXPYkWsyzysRWdXgSzHmIyrgg4FZKzTy0dTHQ==", "requires": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", @@ -2062,9 +19643,9 @@ } }, "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz", - "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz", + "integrity": "sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ==", "requires": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -2085,9 +19666,9 @@ } }, "@popperjs/core": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.4.tgz", - "integrity": "sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg==" + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" }, "@rollup/plugin-babel": { "version": "5.3.1", @@ -2676,13 +20257,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", - "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", + "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", "requires": { - "@typescript-eslint/scope-manager": "5.17.0", - "@typescript-eslint/type-utils": "5.17.0", - "@typescript-eslint/utils": "5.17.0", + "@typescript-eslint/scope-manager": "5.18.0", + "@typescript-eslint/type-utils": "5.18.0", + "@typescript-eslint/utils": "5.18.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -2692,65 +20273,65 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" } } } }, "@typescript-eslint/experimental-utils": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.17.0.tgz", - "integrity": "sha512-U4sM5z0/ymSYqQT6I7lz8l0ZZ9zrya5VIwrwAP5WOJVabVtVsIpTMxPQe+D3qLyePT+VlETUTO2nA1+PufPx9Q==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz", + "integrity": "sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA==", "requires": { - "@typescript-eslint/utils": "5.17.0" + "@typescript-eslint/utils": "5.18.0" } }, "@typescript-eslint/parser": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", - "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", + "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", "requires": { - "@typescript-eslint/scope-manager": "5.17.0", - "@typescript-eslint/types": "5.17.0", - "@typescript-eslint/typescript-estree": "5.17.0", + "@typescript-eslint/scope-manager": "5.18.0", + "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/typescript-estree": "5.18.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", - "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", + "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", "requires": { - "@typescript-eslint/types": "5.17.0", - "@typescript-eslint/visitor-keys": "5.17.0" + "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/visitor-keys": "5.18.0" } }, "@typescript-eslint/type-utils": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", - "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", + "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", "requires": { - "@typescript-eslint/utils": "5.17.0", + "@typescript-eslint/utils": "5.18.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", - "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==" + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", + "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==" }, "@typescript-eslint/typescript-estree": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", - "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", + "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", "requires": { - "@typescript-eslint/types": "5.17.0", - "@typescript-eslint/visitor-keys": "5.17.0", + "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/visitor-keys": "5.18.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -2759,24 +20340,24 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" } } } }, "@typescript-eslint/utils": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", - "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", + "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.17.0", - "@typescript-eslint/types": "5.17.0", - "@typescript-eslint/typescript-estree": "5.17.0", + "@typescript-eslint/scope-manager": "5.18.0", + "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/typescript-estree": "5.18.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -2798,11 +20379,11 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", - "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", + "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", "requires": { - "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/types": "5.18.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -2991,12 +20572,14 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -3042,15 +20625,6 @@ "debug": "4" } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3091,7 +20665,8 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "ansi-align": { "version": "3.0.1", @@ -3397,7 +20972,8 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "requires": {} }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -3587,17 +21163,15 @@ } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "bonjour-service": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", + "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" } }, "boolbase": { @@ -3725,11 +21299,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, "builtin-modules": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", @@ -3823,9 +21392,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001322", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001322.tgz", - "integrity": "sha512-neRmrmIrCGuMnxGSoh+x7zYtQFFgnSY2jaomjU56sCkTA6JINqQrxutF459JpWcWRajvoyn95sOXq4Pqrnyjew==" + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -3895,9 +21464,9 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "requires": { "source-map": "~0.6.0" }, @@ -3909,11 +21478,6 @@ } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, "cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -4199,7 +21763,8 @@ "css-declaration-sorter": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==" + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "requires": {} }, "css-has-pseudo": { "version": "3.0.4", @@ -4225,11 +21790,11 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" } } } @@ -4292,7 +21857,8 @@ "css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "requires": {} }, "css-select": { "version": "4.3.0", @@ -4328,9 +21894,9 @@ } }, "css-what": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.0.1.tgz", - "integrity": "sha512-z93ZGFLNc6yaoXAmVhqoSIb+BduplteCt1fepvwhBUQK6MNE4g6fgjpuZKJKp0esUe+vXWlIkwZZjNWoOKw0ZA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "cssdb": { "version": "6.5.0", @@ -4343,21 +21909,21 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz", - "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", + "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", "requires": { - "cssnano-preset-default": "^5.2.5", + "cssnano-preset-default": "^5.2.7", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz", - "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", + "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", "requires": { - "css-declaration-sorter": "^6.0.3", + "css-declaration-sorter": "^6.2.2", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", @@ -4366,7 +21932,7 @@ "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.3", + "postcss-merge-longhand": "^5.1.4", "postcss-merge-rules": "^5.1.1", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", @@ -4391,7 +21957,8 @@ "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "requires": {} }, "csso": { "version": "4.2.0", @@ -4489,19 +22056,6 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -4550,21 +22104,6 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4653,20 +22192,11 @@ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "requires": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "doctrine": { @@ -4795,9 +22325,9 @@ } }, "electron-to-chromium": { - "version": "1.4.99", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.99.tgz", - "integrity": "sha512-YXMzbvlo6pW12KWw0bj6cIGCJi1Moy8PLCuuzgRzg6WYIcHILK3szU+HHnHFx2b373qRv+cfmHhbmRbatyAbPA==" + "version": "1.4.104", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.104.tgz", + "integrity": "sha512-2kjoAyiG7uMyGRM9mx25s3HAzmQG2ayuYXxsFmYugHSDcwxREgLtscZvbL1JcW9S/OemeQ3f/SG6JhDwpnCclQ==" }, "emittery": { "version": "0.8.1", @@ -5245,23 +22775,23 @@ } }, "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "requires": { "array-includes": "^3.1.4", "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" }, "dependencies": { "debug": { @@ -5357,12 +22887,13 @@ "eslint-plugin-react-hooks": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==" + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "requires": {} }, "eslint-plugin-testing-library": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.1.0.tgz", - "integrity": "sha512-YSNzasJUbyhOTe14ZPygeOBvcPvcaNkwHwrj4vdf+uirr2D32JTDaKi6CP5Os2aWtOcvt4uBSPXp9h5xGoqvWQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz", + "integrity": "sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA==", "requires": { "@typescript-eslint/utils": "^5.13.0" } @@ -5847,11 +23378,11 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" } }, "supports-color": { @@ -6084,9 +23615,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "gzip-size": { "version": "6.0.0", @@ -6357,7 +23888,8 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} }, "idb": { "version": "6.1.5", @@ -6417,11 +23949,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6451,25 +23978,11 @@ "side-channel": "^1.0.4" } }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -6598,9 +24111,9 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "requires": { "has-tostringtag": "^1.0.0" } @@ -6611,15 +24124,11 @@ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" - }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true }, "is-plain-obj": { "version": "3.0.0", @@ -6651,9 +24160,12 @@ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } }, "is-stream": { "version": "2.0.1", @@ -7453,7 +24965,8 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} }, "jest-regex-util": { "version": "27.5.1", @@ -7753,11 +25266,11 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" } }, "supports-color": { @@ -8165,11 +25678,11 @@ "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==" }, "jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", + "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", "requires": { - "array-includes": "^3.1.3", + "array-includes": "^3.1.4", "object.assign": "^4.1.2" } }, @@ -8354,12 +25867,9 @@ "dev": true }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.3.tgz", + "integrity": "sha512-WY9wjJNQt9+PZilnLbuFKM+SwDull9+6IAguOrarOMoOHTcJ9GnXSO11+Gw6c7xtDkBkthR57OZMtZKYr+1CEw==" }, "magic-string": { "version": "0.25.9", @@ -8544,19 +26054,14 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", "requires": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, "nanoid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", @@ -8593,9 +26098,9 @@ } }, "node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-int64": { "version": "0.4.0", @@ -8755,15 +26260,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -8908,14 +26404,6 @@ "p-limit": "^3.0.2" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-retry": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", @@ -9189,7 +26677,8 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "requires": {} }, "postcss-calc": { "version": "8.2.4", @@ -9254,12 +26743,13 @@ "postcss-custom-media": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==" + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "requires": {} }, "postcss-custom-properties": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz", - "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.6.tgz", + "integrity": "sha512-QEnQkDkb+J+j2bfJisJJpTAFL+lUFl66rUNvnjPBIvRbZACLG4Eu5bmBCIY4FJCqhwsfbBpmJUyb3FcR/31lAg==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -9283,22 +26773,26 @@ "postcss-discard-comments": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==" + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "requires": {} }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "requires": {} }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "requires": {} }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "requires": {} }, "postcss-double-position-gradients": { "version": "3.1.1", @@ -9320,7 +26814,8 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "requires": {} }, "postcss-focus-visible": { "version": "6.0.4", @@ -9341,12 +26836,14 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "requires": {} }, "postcss-gap-properties": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==" + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "requires": {} }, "postcss-image-set-function": { "version": "4.0.6", @@ -9359,7 +26856,8 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "requires": {} }, "postcss-js": { "version": "4.0.0", @@ -9370,9 +26868,9 @@ } }, "postcss-lab-function": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.2.tgz", - "integrity": "sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", + "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", "requires": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -9410,11 +26908,11 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" } } } @@ -9422,17 +26920,19 @@ "postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "requires": {} }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "requires": {} }, "postcss-merge-longhand": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz", - "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", + "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", "requires": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" @@ -9488,7 +26988,8 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -9525,11 +27026,11 @@ } }, "postcss-nesting": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.3.tgz", - "integrity": "sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", + "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", "requires": { - "postcss-selector-parser": "^6.0.9" + "postcss-selector-parser": "^6.0.10" } }, "postcss-normalize": { @@ -9545,7 +27046,8 @@ "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "requires": {} }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -9630,12 +27132,14 @@ "postcss-overflow-shorthand": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==" + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "requires": {} }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "requires": {} }, "postcss-place": { "version": "7.0.4", @@ -9696,11 +27200,11 @@ } }, "postcss-pseudo-class-any-link": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz", - "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", + "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", "requires": { - "postcss-selector-parser": "^6.0.9" + "postcss-selector-parser": "^6.0.10" } }, "postcss-reduce-initial": { @@ -9723,7 +27227,8 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "requires": {} }, "postcss-selector-not": { "version": "5.0.0", @@ -9734,9 +27239,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -10205,7 +27710,8 @@ "react-icons": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz", - "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==" + "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==", + "requires": {} }, "react-is": { "version": "17.0.2", @@ -10290,11 +27796,11 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" } } } @@ -10387,9 +27893,9 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "requires": { "@babel/runtime": "^7.8.4" } @@ -11048,6 +28554,21 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -11123,21 +28644,6 @@ "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -11186,7 +28692,8 @@ "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "requires": {} }, "stylehacks": { "version": "5.1.0", @@ -11803,12 +29310,12 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" } }, "supports-color": { @@ -11954,9 +29461,9 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -12050,38 +29557,37 @@ } }, "webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", + "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", + "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", "sockjs": "^0.3.21", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" }, @@ -12105,11 +29611,6 @@ "fast-deep-equal": "^3.1.3" } }, - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -12126,18 +29627,11 @@ "ajv-keywords": "^5.0.0" } }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, "ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "requires": {} } } }, @@ -12580,7 +30074,8 @@ "ws": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "requires": {} }, "xdg-basedir": { "version": "4.0.0", @@ -12608,11 +30103,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", diff --git a/interface/package.json b/interface/package.json index d821af756..c3688025f 100644 --- a/interface/package.json +++ b/interface/package.json @@ -4,11 +4,11 @@ "private": true, "proxy": "http://localhost:3080", "dependencies": { - "@emotion/react": "^11.8.2", + "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.5.1", - "@mui/material": "^5.5.3", + "@mui/icons-material": "^5.6.0", + "@mui/material": "^5.6.0", "@types/lodash": "^4.14.181", "@types/node": "^17.0.23", "@types/react": "^17.0.43", From d5245f7e7c4cf98b6de8726d11f8d50663e86a25 Mon Sep 17 00:00:00 2001 From: Proddy Date: Wed, 6 Apr 2022 20:22:14 +0200 Subject: [PATCH 198/319] added missing v3.3.1 to the changelog history --- CHANGELOG.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e07faec1b..bf8fd774f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,76 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +# [3.3.1] January 20 2022 + +- lastcode broke MQTT JSON structure [#228](https://github.com/emsesp/EMS-ESP32/issues/228) +- overlapping while reading sequence of EMS1.0 telegrams +- redundant telegram readings (because of offset overflow) +- added missing RC30/Moduline400 [#243](https://github.com/emsesp/EMS-ESP32/issues/243) +- check received status before toggling fetch on empty telegram [#268][#282] + +# [3.3.0] November 28 2021 + +## Added + +- Add system commands for syslog level and watch [#98](https://github.com/emsesp/EMS-ESP32/issues/98) +- Added pool data to telegrams 0x494 & 0x495 [#102](https://github.com/emsesp/EMS-ESP32/issues/102) +- Add RC300 second summermode telegram [#108](https://github.com/emsesp/EMS-ESP32/issues/108) +- Add support for the RC25 thermostat [#106](https://github.com/emsesp/EMS-ESP32/issues/106) +- Add new command 'entities' for a device, e.g. http://ems-esp/api/boiler/entities to show the shortname, description and HA Entity name (if HA enabled) [#116](https://github.com/emsesp/EMS-ESP32/issues/116) +- Support for Junkers program and remote (fb10/fb110) temperature +- Home Assistant `state_class` attribute for Wh, kWh, W and KW [#129](https://github.com/emsesp/EMS-ESP32/issues/129) +- Add current room influence for RC300 [#136](https://github.com/emsesp/EMS-ESP32/issues/136) +- Added Home Assistant device_class to sensor entities +- Added another Buderus RC10 thermostat with Product ID 65 [#160](https://github.com/emsesp/EMS-ESP32/issues/160) +- Added support for mDNS [#161](https://github.com/emsesp/EMS-ESP32/issues/161) +- Added last system ESP32 reset code to log (and `system info` output) +- Firmware Checker in WebUI [#168](https://github.com/emsesp/EMS-ESP32/issues/168) +- Added new MQTT setting for enabling 'response' topic +- Support for non-standard Thermostats like Tado [#174](https://github.com/emsesp/EMS-ESP32/issues/174) +- Include MQTT connection status in 'api/system/info' +- Include Network status in 'api/system/info' and also the MQTT topic `info` [#202](https://github.com/emsesp/EMS-ESP32/issues/202) +- Added Ethernet PHY module as an option in the Board Profile [#210](https://github.com/emsesp/EMS-ESP32/issues/210) + +## Fixed + +- MQTT reconnecting after WiFi reconnect [#99](https://github.com/emsesp/EMS-ESP32/issues/99) +- Manually Controlling Solar Circuit [#107](https://github.com/emsesp/EMS-ESP32/issues/107) +- Fix thermostat commands not defaulting to the master thermostat [#110](https://github.com/emsesp/EMS-ESP32/issues/110) +- Enlarge parse-buffer for long names like `cylinderpumpmodulation` +- MQTT not subscribing to all device entities [#166](https://github.com/emsesp/EMS-ESP32/issues/166) +- Help fix issues with WebUI unable to fully load UI over Ethernet [#177](https://github.com/emsesp/EMS-ESP32/issues/177) +- Shower alert never reset after limit reached when enabled [(PR #185)] +- Remove HA entity entries when a device value goes dormant [#196](https://github.com/emsesp/EMS-ESP32/issues/196) +- deciphering last error code dates on 0xC2 telegram [#204](https://github.com/emsesp/EMS-ESP32/issues/204) + +## Changed + +- Syslog BOM only for utf-8 messages [#91](https://github.com/emsesp/EMS-ESP32/issues/91) +- Check for KM200 by device-id 0x48, remove tx-delay [#90](https://github.com/emsesp/EMS-ESP32/issues/90) +- rename `fastheatupfactor` to `fastheatup` and add percent [#122](https://github.com/emsesp/EMS-ESP32/issues/122) +- "unit" renamed to "uom" in API call to recall a Device Value +- initial backend React changes to replace the class components (HOCs) with React Hooks +- Use program-names instead of numbers +- Boiler's maintenancemessage always published in MQTT (to prevent HA missing entity) +- Unit of Measure 'times' added to MQTT Fails, Rx fails, Rx received, Tx fails, Tx reads & Tx writes +- Improved API. Restful HTTP API works in the same way as MQTT calls +- Removed settings for MQTT subscribe format [#173](https://github.com/emsesp/EMS-ESP32/issues/173) +- Improve Nefit Moduline 200 functionality [#183](https://github.com/emsesp/EMS-ESP32/issues/183) +- `status` in the MQTT heartbeat renamed to `bus_status` +- Layout changes in the WebUI, showing stripped table rows in Dashboard +- Alternative font for log window [#219](https://github.com/emsesp/EMS-ESP32/issues/219) + +## **BREAKING CHANGES** + +- API: "unit" renamed to "uom" in API call to recall a Device Value +- HA: `sensor.boiler_boiler_temperature` renamed to `sensor.actual_boiler_temperature` +- HA: `binary_sensor.boiler_ww_disinfecting` renamed to `binary_sensor.boiler_ww_disinfection` +- HA: # removed from counts in MQTT Fails, Rx fails, Rx received, Tx fails, Tx reads & Tx writes +- `txread` renamed to `txreads` and `txwrite` renamed to `txwrites` in MQTT heartbeat payload +- 'dallas sensors' in api/system/info moved to the "System" section. Renamed "uptime (seconds)" and "reset reason" +- `status` in the MQTT heartbeat renamed to `bus_status` + # [3.2.1] August 8 2021 ## Added From 4eddad2cf1262e7e0409c86f1893f564fa27a5f0 Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 8 Apr 2022 07:46:18 +0200 Subject: [PATCH 199/319] mqtt clean session default off #441 --- factory_settings.ini | 2 +- lib/framework/MqttSettingsService.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/factory_settings.ini b/factory_settings.ini index b8c4c81ad..12a99b948 100644 --- a/factory_settings.ini +++ b/factory_settings.ini @@ -38,7 +38,7 @@ build_flags = -D FACTORY_MQTT_PASSWORD=\"\" -D FACTORY_MQTT_CLIENT_ID=\"ems-esp\" -D FACTORY_MQTT_KEEP_ALIVE=60 - -D FACTORY_MQTT_CLEAN_SESSION=true + -D FACTORY_MQTT_CLEAN_SESSION=false -D FACTORY_MQTT_MAX_TOPIC_LENGTH=128 ; JWT Secret diff --git a/lib/framework/MqttSettingsService.h b/lib/framework/MqttSettingsService.h index 560e29c96..473c130ac 100644 --- a/lib/framework/MqttSettingsService.h +++ b/lib/framework/MqttSettingsService.h @@ -50,7 +50,7 @@ static String generateClientId() { #endif #ifndef FACTORY_MQTT_CLEAN_SESSION -#define FACTORY_MQTT_CLEAN_SESSION true +#define FACTORY_MQTT_CLEAN_SESSION false #endif #ifndef FACTORY_MQTT_MAX_TOPIC_LENGTH From f9b2a71b86ea0e32b412b42e0fe145e708437776 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 8 Apr 2022 08:09:10 +0200 Subject: [PATCH 200/319] tag to wwstarts2, thermostat clock format, formatting --- CHANGELOG_LATEST.md | 2 + src/devices/boiler.cpp | 2 +- src/devices/thermostat.cpp | 105 ++++++++++++++++--------------------- src/emsdevice.cpp | 22 ++++---- src/locale_DE.h | 2 +- src/locale_EN.h | 4 +- 6 files changed, 61 insertions(+), 76 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index d5958bf8d..1740bfdbc 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -66,6 +66,8 @@ - removed system/pin command, new commands in analogsensors - system/info device-info split to name/version/brand - exclude list uses short-names, possible flags for web/api/mqtt excludes, readonly and favorite (selection not yet implemented) +- thermostat clock formate date-time: dd.mm.yyyy hh:mm:ss +- RC300 summermode as other thermostats `winter/summer` instead of `off/on` ## **BREAKING CHANGES:** diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 462bcbbaa..996146840 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -208,7 +208,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &totalCompStarts_, DeviceValueType::ULONG, nullptr, FL_(totalCompStarts), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &heatingStarts_, DeviceValueType::ULONG, nullptr, FL_(heatingStarts), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &coolingStarts_, DeviceValueType::ULONG, nullptr, FL_(coolingStarts), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &wwStarts2_, DeviceValueType::ULONG, nullptr, FL_(wwStarts2), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwStarts2_, DeviceValueType::ULONG, nullptr, FL_(wwStarts2), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &poolStarts_, DeviceValueType::ULONG, nullptr, FL_(poolStarts), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgConsTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgConsTotal), DeviceValueUOM::KWH); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &nrgConsCompTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompTotal), DeviceValueUOM::KWH); diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index c34f40c62..48253bb2b 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1055,9 +1055,9 @@ void Thermostat::process_RC30Set(std::shared_ptr telegram) { has_update(telegram, mixingvalves_, 17); // Number of Mixing Valves: (0x00=0, 0x01=1, 0x02=2) has_update(telegram, brightness_, 18); // Screen brightness 0F=dark F1=light has_update(telegram, hc->mode, 23); - has_update(telegram, offtemp_, 24); // Set Temperature when mode is Off / 10 (e.g.: 0x0F = 7.5 degrees Celsius) - has_update(telegram, heatingpid_, 25); // PID setting 00=1 01=2 02=3 - has_update(telegram, preheating_, 26); // Preheating in the clock program: (0x00 = off, 0xFF = on) + has_update(telegram, offtemp_, 24); // Set Temperature when mode is Off / 10 (e.g.: 0x0F = 7.5 degrees Celsius) + has_update(telegram, heatingpid_, 25); // PID setting 00=1 01=2 02=3 + has_update(telegram, preheating_, 26); // Preheating in the clock program: (0x00 = off, 0xFF = on) } // type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4) - data from the RC35 thermostat (0x10) - 16 bytes @@ -1221,41 +1221,25 @@ void Thermostat::process_RCTime(std::shared_ptr telegram) { return; } - // render date to HH:MM:SS DD/MM/YYYY - // had to create separate buffers because of how printf works - char date[sizeof(dateTime_)]; - char buf1[6]; - char buf2[6]; - char buf3[6]; - char buf4[6]; - char buf5[6]; - char buf6[6]; - snprintf(date, - sizeof(date), - "%s:%s:%s %s.%s.%s", - Helpers::smallitoa(buf1, telegram->message_data[2]), // hour - Helpers::smallitoa(buf2, telegram->message_data[4]), // minute - Helpers::smallitoa(buf3, telegram->message_data[5]), // second - Helpers::smallitoa(buf4, telegram->message_data[3]), // day - Helpers::smallitoa(buf5, telegram->message_data[1]), // month - // IVT reports Year with high bit set.? - Helpers::itoa((telegram->message_data[0] & 0x7F) + 2000, buf6) // year - ); - has_update(dateTime_, date, sizeof(dateTime_)); - // check clock - time_t now = time(nullptr); - tm * tm_ = localtime(&now); - bool tset_ = tm_->tm_year > 110; // year 2010 and up, time is valid - tm_->tm_year = (telegram->message_data[0] & 0x7F) + 100; // IVT - tm_->tm_mon = telegram->message_data[1] - 1; - tm_->tm_mday = telegram->message_data[3]; - tm_->tm_hour = telegram->message_data[2]; - tm_->tm_min = telegram->message_data[4]; - tm_->tm_sec = telegram->message_data[5]; - tm_->tm_isdst = telegram->message_data[7] & 0x01; - time_t ttime = mktime(tm_); // thermostat time + time_t now = time(nullptr); + tm * tm_ = localtime(&now); + bool tset_ = tm_->tm_year > 110; // year 2010 and up, time is valid + tm_->tm_year = (telegram->message_data[0] & 0x7F) + 100; // IVT + tm_->tm_mon = telegram->message_data[1] - 1; + tm_->tm_mday = telegram->message_data[3]; + tm_->tm_hour = telegram->message_data[2]; + tm_->tm_min = telegram->message_data[4]; + tm_->tm_sec = telegram->message_data[5]; + tm_->tm_isdst = telegram->message_data[7] & 0x01; + + // render date to DD.MM.YYYY HH:MM and publish + char newdatetime[sizeof(dateTime_)]; + strftime(newdatetime, sizeof(dateTime_), "%d.%m.%G %H:%M", tm_); + has_update(dateTime_, newdatetime, sizeof(dateTime_)); + bool ivtclock = (telegram->message_data[0] & 0x80) == 0x80; // dont sync ivt-clock, #439 + time_t ttime = mktime(tm_); // thermostat time // correct thermostat clock if we have valid ntp time, and could write the command if (!ivtclock && tset_ && EMSESP::system_.ntp_connected() && !EMSESP::system_.readonly_mode() && has_command(&dateTime_)) { double difference = difftime(now, ttime); @@ -1477,13 +1461,13 @@ bool Thermostat::set_language(const char * value, const int8_t id) { if (model() == EMS_DEVICE_FLAG_RC30) { if (!Helpers::value2enum(value, lg, FL_(enum_ibaLanguage_RC30))) { return false; - } - write_command(EMS_TYPE_RC30Settings, 0, lg, EMS_TYPE_RC30Settings); + } + write_command(EMS_TYPE_RC30Settings, 0, lg, EMS_TYPE_RC30Settings); } else { if (!Helpers::value2enum(value, lg, FL_(enum_ibaLanguage))) { return false; } - write_command(EMS_TYPE_IBASettings, 1, lg, EMS_TYPE_IBASettings); + write_command(EMS_TYPE_IBASettings, 1, lg, EMS_TYPE_IBASettings); } return true; @@ -1879,7 +1863,7 @@ bool Thermostat::set_party(const char * value, const int8_t id) { return true; } -// set date&time as string hh:mm:ss-dd.mm.yyyy-dw-dst or "NTP" for setting to internet-time +// set date&time as string dd.mm.yyyy-hh:mm:ss-dw-dst or "NTP" for setting to internet-time // dw - day of week (0..6), dst- summertime (0/1) // id is ignored bool Thermostat::set_datetime(const char * value, const int8_t id) { @@ -1907,25 +1891,20 @@ bool Thermostat::set_datetime(const char * value, const int8_t id) { data[5] = tm_->tm_sec; data[6] = (tm_->tm_wday + 6) % 7; // Bosch counts from Mo, time from Su data[7] = tm_->tm_isdst + 2; // set DST and flag for ext. clock - // char time_string[25]; - // strftime(time_string, 25, "%FT%T%z", tm_); - // LOG_INFO(F("Date and time: %s"), time_string); } else if (dt.length() == 23) { - data[0] = (dt[16] - '0') * 100 + (dt[17] - '0') * 10 + (dt[18] - '0'); // year - data[1] = (dt[12] - '0') * 10 + (dt[13] - '0'); // month - data[2] = (dt[0] - '0') * 10 + (dt[1] - '0'); // hour - data[3] = (dt[9] - '0') * 10 + (dt[10] - '0'); // day - data[4] = (dt[3] - '0') * 10 + (dt[4] - '0'); // min - data[5] = (dt[6] - '0') * 10 + (dt[7] - '0'); // sec - data[6] = (dt[20] - '0'); // day of week, Mo:0 - data[7] = (dt[22] - '0') + 2; // DST and flag - // LOG_INFO(F("Date and time: %02d.%02d.2%03d-%02d:%02d:%02d"), data[3], data[1], data[0], data[2], data[4], data[5]); + data[0] = (dt[7] - '0') * 100 + (dt[8] - '0') * 10 + (dt[9] - '0'); // year + data[1] = (dt[3] - '0') * 10 + (dt[4] - '0'); // month + data[2] = (dt[11] - '0') * 10 + (dt[12] - '0'); // hour + data[3] = (dt[0] - '0') * 10 + (dt[1] - '0'); // day + data[4] = (dt[14] - '0') * 10 + (dt[15] - '0'); // min + data[5] = (dt[17] - '0') * 10 + (dt[18] - '0'); // sec + data[6] = (dt[20] - '0'); // day of week, Mo:0 + data[7] = (dt[22] - '0') + 2; // DST and flag } else { LOG_WARNING(F("Set date: invalid data, wrong length")); return false; } if (data[1] == 0 || data[1] > 12 || data[2] > 23 || data[3] == 0 || data[3] > 31 || data[4] > 59 || data[5] > 59 || data[6] > 6 || data[7] > 3) { - // LOG_WARNING(F("Set date: invalid data")); LOG_WARNING(F("Invalid date/time: %02d.%02d.2%03d-%02d:%02d:%02d-%d-%d"), data[3], data[1], data[0], data[2], data[4], data[5], data[6], data[7]); return false; } @@ -3123,7 +3102,8 @@ void Thermostat::register_device_values() { FL_(ibaClockOffset), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_clockoffset)); // offset (in sec) to clock, 0xff=-1s, 0x02=2s - register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &autodst_, DeviceValueType::BOOL, nullptr, FL_(autodst), DeviceValueUOM::NONE, MAKE_CF_CB(set_autodst)); + register_device_value( + DeviceValueTAG::TAG_THERMOSTAT_DATA, &autodst_, DeviceValueType::BOOL, nullptr, FL_(autodst), DeviceValueUOM::NONE, MAKE_CF_CB(set_autodst)); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaLanguage_, DeviceValueType::ENUM, @@ -3136,8 +3116,9 @@ void Thermostat::register_device_values() { DeviceValueType::ENUM, FL_(enum_ibaMainDisplay), FL_(ibaMainDisplay), - DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &backlight_, DeviceValueType::BOOL, nullptr, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); + DeviceValueUOM::NONE); + register_device_value( + DeviceValueTAG::TAG_THERMOSTAT_DATA, &backlight_, DeviceValueType::BOOL, nullptr, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &brightness_, DeviceValueType::INT, @@ -3170,14 +3151,20 @@ void Thermostat::register_device_values() { FL_(heatingPID), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingpid)); - register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &preheating_, DeviceValueType::BOOL, nullptr, FL_(preheating), DeviceValueUOM::NONE, MAKE_CF_CB(set_preheating)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &preheating_, + DeviceValueType::BOOL, + nullptr, + FL_(preheating), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_preheating)); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &ibaCalIntTemperature_, DeviceValueType::INT, FL_(div10), FL_(ibaCalIntTemperature), DeviceValueUOM::DEGREES_R, - MAKE_CF_CB(set_calinttemp)); + MAKE_CF_CB(set_calinttemp)); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &offtemp_, DeviceValueType::UINT, @@ -3499,7 +3486,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrheatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value( tag, &hc->summer_setmode, DeviceValueType::ENUM, FL_(enum_summermode), FL_(summersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); - register_device_value(tag, &hc->summermode, DeviceValueType::BOOL, nullptr, FL_(summermode), DeviceValueUOM::NONE); + register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); register_device_value( tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 105d15002..b579aa6a2 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -572,7 +572,7 @@ void EMSdevice::publish_value(void * value_p) const { Helpers::render_value(payload, *(uint32_t *)(value_p), divider, fahrenheit); break; case DeviceValueType::BOOL: { - Helpers::render_boolean(payload, (bool)(*(uint8_t *)(value_p))); + Helpers::render_boolean(payload, (bool)*(uint8_t *)(value_p)); break; } case DeviceValueType::TIME: @@ -646,12 +646,10 @@ void EMSdevice::generate_values_web(JsonObject & output) { JsonObject obj = data.createNestedObject(); // create the object, we know there is a value uint8_t fahrenheit = 0; - // handle Booleans (true, false) + // handle Booleans (true, false), use strings, no native true/false) if (dv.type == DeviceValueType::BOOL) { - bool value_b = *(bool *)(dv.value_p); - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - obj["v"] = value_b ? "true" : "false"; - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + bool value_b = (bool)*(uint8_t *)(dv.value_p); + if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { obj["v"] = value_b ? 1 : 0; } else { char s[7]; @@ -765,12 +763,10 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { // create the value if (dv.hasValue()) { - // handle Booleans (true, false) + // handle Booleans (true, false), use strings, no native true/false) if (dv.type == DeviceValueType::BOOL) { - bool value_b = *(bool *)(dv.value_p); - if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - obj["v"] = value_b; - } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + bool value_b = (bool)*(uint8_t *)(dv.value_p); + if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { obj["v"] = value_b ? 1 : 0; } else { char s[7]; @@ -975,7 +971,7 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 case DeviceValueType::BOOL: if (Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { - auto value_b = (bool)(*(uint8_t *)(dv.value_p)); + bool value_b = (bool)*(uint8_t *)(dv.value_p); if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { json[value] = value_b; } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { @@ -1108,7 +1104,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // handle Booleans if (dv.type == DeviceValueType::BOOL && Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { // see how to render the value depending on the setting - auto value_b = (bool)*(uint8_t *)(dv.value_p); + bool value_b = (bool)*(uint8_t *)(dv.value_p); if (Mqtt::ha_enabled() && (output_target == OUTPUT_TARGET::MQTT)) { char s[7]; json[name] = Helpers::render_boolean(s, value_b); // for HA always render as string diff --git a/src/locale_DE.h b/src/locale_DE.h index 703e33a9b..894d55274 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -333,7 +333,7 @@ MAKE_PSTR(functioning_mode, "functioning mode") MAKE_PSTR(smoke_temperature, "Abgastemperatur") // thermostat lists -MAKE_PSTR_LIST(tpl_datetime, F("Format: < hh:mm:ss dd/mm/yyyy-dw-dst | NTP >")) +MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | dd.mm.yyyy-hh:mm:ss-dw-dst >")) MAKE_PSTR_LIST(tpl_switchtime, F("Format: < nn.d.o.hh:mm >")) MAKE_PSTR_LIST(tpl_holidays, F("Format: < dd.mm.yyyy-dd.mm.yyyy >")) MAKE_PSTR_LIST(enum_ibaMainDisplay, diff --git a/src/locale_EN.h b/src/locale_EN.h index 3823a7bde..c1b14c3a2 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -333,7 +333,7 @@ MAKE_PSTR(functioning_mode, "functioning mode") MAKE_PSTR(smoke_temperature, "smoke temperature") // thermostat lists -MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | hh:mm:ss dd.mm.yyyy-dw-dst >")) +MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | dd.mm.yyyy-hh:mm:ss-dw-dst >")) MAKE_PSTR_LIST(tpl_switchtime, F("Format: [ not_set | day hh:mm on|off ]")) MAKE_PSTR_LIST(tpl_holidays, F("format: < dd.mm.yyyy-dd.mm.yyyy >")) MAKE_PSTR_LIST(enum_ibaMainDisplay, @@ -541,7 +541,7 @@ MAKE_PSTR_LIST(wwSetPumpPower, F("wwsetpumppower"), F("set pump power")) MAKE_PSTR_LIST(wwMixerTemp, F("wwmixertemp"), F("mixer temperature")) MAKE_PSTR_LIST(wwCylMiddleTemp, F("wwcylmiddletemp"), F("cylinder middle temperature (TS3)")) MAKE_PSTR_LIST(wwStarts, F("wwstarts"), F("starts")) -MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("control starts")) +MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("control starts2")) MAKE_PSTR_LIST(wwWorkM, F("wwworkm"), F("active time")) MAKE_PSTR_LIST(wwHystOn, F("wwhyston"), F("hysteresis on temperature")) MAKE_PSTR_LIST(wwHystOff, F("wwhystoff"), F("hysteresis off temperature")) From f771bb8043e265d96b3ca9cfc4557bd39e439752 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 8 Apr 2022 10:02:24 +0200 Subject: [PATCH 201/319] add clock to controller #439 --- CHANGELOG_LATEST.md | 3 ++- src/devices/controller.cpp | 22 ++++++++++++++++++++++ src/devices/controller.h | 4 ++++ src/web/WebDataService.cpp | 2 +- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 1740bfdbc..d65571213 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -32,6 +32,7 @@ - min/max in web value setting - Extend customization to select if an entity is to be shown in the WebUI or forced as read-only [#317](https://github.com/emsesp/EMS-ESP32/issues/317) - Added Moduline 400 installation parameters [PR #449 by @kwertie01](https://github.com/emsesp/EMS-ESP32/pull/449) +- Read time from IVT-controller [#439](https://github.com/emsesp/EMS-ESP32/issues/439) ### Fixed @@ -66,7 +67,7 @@ - removed system/pin command, new commands in analogsensors - system/info device-info split to name/version/brand - exclude list uses short-names, possible flags for web/api/mqtt excludes, readonly and favorite (selection not yet implemented) -- thermostat clock formate date-time: dd.mm.yyyy hh:mm:ss +- thermostat clock formate date-time: dd.mm.yyyy hh:mm - RC300 summermode as other thermostats `winter/summer` instead of `off/on` ## **BREAKING CHANGES:** diff --git a/src/devices/controller.cpp b/src/devices/controller.cpp index b30116d8e..f7b0b952f 100644 --- a/src/devices/controller.cpp +++ b/src/devices/controller.cpp @@ -24,6 +24,28 @@ REGISTER_FACTORY(Controller, EMSdevice::DeviceType::CONTROLLER); Controller::Controller(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { + // IVT broadcasts Thermostat time from controller (0x09) if display is off. + register_telegram_type(0x06, F("RCTime"), false, MAKE_PF_CB(process_dateTime)); + register_device_value(DeviceValueTAG::TAG_NONE, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); } +// process_dateTime - type 0x06 - date and time from a thermostat - 14 bytes long, IVT only +void Controller::process_dateTime(std::shared_ptr telegram) { + if (telegram->offset > 0 || telegram->message_length < 5) { + return; + } + char newdatetime[sizeof(dateTime_)]; + // publich as dd.mm.yyyy hh:mmF + snprintf(newdatetime, + sizeof(dateTime_), + "%02d.%02d.%04d %02d:%02d", + telegram->message_data[3], + telegram->message_data[1] - 1, + (telegram->message_data[0] & 0x7F) + 2000, + telegram->message_data[2], + telegram->message_data[4]); + has_update(dateTime_, newdatetime, sizeof(dateTime_)); +} + + } // namespace emsesp \ No newline at end of file diff --git a/src/devices/controller.h b/src/devices/controller.h index 76e11e59a..e9efb73af 100644 --- a/src/devices/controller.h +++ b/src/devices/controller.h @@ -26,6 +26,10 @@ namespace emsesp { class Controller : public EMSdevice { public: Controller(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand); + + void process_dateTime(std::shared_ptr telegram); + + char dateTime_[25]; }; } // namespace emsesp diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 7f331c9c5..b4d61dc65 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -77,7 +77,7 @@ void WebDataService::core_data(AsyncWebServerRequest * request) { // Ignore Contoller JsonArray devices = root.createNestedArray("devices"); for (const auto & emsdevice : EMSESP::emsdevices) { - if (emsdevice && emsdevice->device_type() != EMSdevice::DeviceType::CONTROLLER) { + if (emsdevice && (emsdevice->device_type() != EMSdevice::DeviceType::CONTROLLER || emsdevice->count_entities() > 0)) { JsonObject obj = devices.createNestedObject(); obj["i"] = emsdevice->unique_id(); // a unique id obj["t"] = emsdevice->device_type_name(); // type From d203092ba70159b9b4c6c68f0a8ed4cc4dbf9096 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 8 Apr 2022 10:03:05 +0200 Subject: [PATCH 202/319] Don't show banner while uploading --- .../src/framework/system/FirmwareFileUpload.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/interface/src/framework/system/FirmwareFileUpload.tsx b/interface/src/framework/system/FirmwareFileUpload.tsx index 546670103..8e5a056f3 100644 --- a/interface/src/framework/system/FirmwareFileUpload.tsx +++ b/interface/src/framework/system/FirmwareFileUpload.tsx @@ -13,11 +13,13 @@ const FirmwareFileUpload: FC = ({ uploadFirmware }) => { return ( <> - + {!uploading && ( + + )} Date: Fri, 8 Apr 2022 11:50:09 +0200 Subject: [PATCH 203/319] mqtt HA uses only json, disable single --- .../src/framework/mqtt/MqttSettingsForm.tsx | 68 ++++++++++--------- lib/framework/MqttSettingsService.cpp | 11 +++ src/system.cpp | 1 + 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index fda328a59..5e41ddfe0 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -183,45 +183,49 @@ const MqttSettingsForm: FC = () => { control={} label="Publish command output to a 'response' topic" /> - - - } - label="Publish single value topics on change" - /> - - {data.publish_single && ( + {!data.ha_enabled && ( + - } - label="Publish to command topics (ioBroker)" + control={} + label="Publish single value topics on change" /> - )} - - - - } - label="Enable MQTT Discovery (Home Assistant, Domoticz)" - /> + {data.publish_single && ( + + + } + label="Publish to command topics (ioBroker)" + /> + + )} - {data.ha_enabled && ( - - + + } + label="Enable MQTT Discovery (Home Assistant, Domoticz)" /> - )} - + {data.ha_enabled && ( + + + + )} + + )} Publish Intervals (in seconds, 0=automatic) diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp index 561d7926d..6b4fef288 100644 --- a/lib/framework/MqttSettingsService.cpp +++ b/lib/framework/MqttSettingsService.cpp @@ -228,7 +228,15 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting changed = true; } + // if both settings are stored from older version, HA has priority + if (newSettings.ha_enabled && newSettings.publish_single) { + newSettings.publish_single = false; + } + if (newSettings.publish_single != settings.publish_single) { + if (newSettings.publish_single) { + newSettings.ha_enabled = false; + } changed = true; } @@ -242,6 +250,9 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting if (newSettings.ha_enabled != settings.ha_enabled) { emsesp::EMSESP::mqtt_.ha_enabled(newSettings.ha_enabled); + if (newSettings.ha_enabled) { + newSettings.publish_single = false; + } changed = true; } diff --git a/src/system.cpp b/src/system.cpp index 74503cd3a..edb65a7f2 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -961,6 +961,7 @@ bool System::command_settings(const char * value, const int8_t id, JsonObject & node["publish_time_other"] = settings.publish_time_other; node["publish_time_sensor"] = settings.publish_time_sensor; node["publish_single"] = settings.publish_single; + node["publish_2_command"] = settings.publish_single2cmd; node["send_response"] = settings.send_response; }); From 15a8d6dbf1640b5700ece97008198fe876e0492d Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 8 Apr 2022 15:30:34 +0200 Subject: [PATCH 204/319] add Hybrid Heatpump --- CHANGELOG_LATEST.md | 1 + src/device_library.h | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index d65571213..88faa8b08 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -33,6 +33,7 @@ - Extend customization to select if an entity is to be shown in the WebUI or forced as read-only [#317](https://github.com/emsesp/EMS-ESP32/issues/317) - Added Moduline 400 installation parameters [PR #449 by @kwertie01](https://github.com/emsesp/EMS-ESP32/pull/449) - Read time from IVT-controller [#439](https://github.com/emsesp/EMS-ESP32/issues/439) +- Hybrid Heatpump product-id 168 [#459](https://github.com/emsesp/EMS-ESP32/issues/459) ### Fixed diff --git a/src/device_library.h b/src/device_library.h index 2681c409e..32b5be398 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -36,6 +36,7 @@ {132, DeviceType::BOILER, F("GC7000F"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {133, DeviceType::BOILER, F("Logano GB125/KB195i/Logamatic MC110"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {167, DeviceType::BOILER, F("Cerapur Aero"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{168, DeviceType::BOILER, F("Hybrid Heatpump"), DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP}, {170, DeviceType::BOILER, F("Logano GB212"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {172, DeviceType::BOILER, F("Enviline/Compress 6000AW/Hybrid 7000iAW/SupraEco/Geo 5xx"), DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP}, {173, DeviceType::BOILER, F("Geo 5xx"), DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP}, @@ -56,6 +57,7 @@ {114, DeviceType::CONTROLLER, F("BC10"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {125, DeviceType::CONTROLLER, F("BC25"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {152, DeviceType::CONTROLLER, F("Controller"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 +{168, DeviceType::CONTROLLER, F("Hybrid Heatpump"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {169, DeviceType::CONTROLLER, F("BC40"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {190, DeviceType::CONTROLLER, F("BC10"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 {194, DeviceType::CONTROLLER, F("BC10"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x09 From 6d6cb755e2c208579e4f6b1f5997c22342724c99 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 10 Apr 2022 10:03:36 +0200 Subject: [PATCH 205/319] update hybrid heatpump #459 --- src/device_library.h | 2 +- src/devices/boiler.cpp | 132 ++++++++++++++++++++++++++++++++++++++++- src/devices/boiler.h | 18 ++++++ src/emsdevice.h | 1 + src/locale_EN.h | 10 ++++ 5 files changed, 161 insertions(+), 2 deletions(-) diff --git a/src/device_library.h b/src/device_library.h index 32b5be398..bd1a7d40f 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -36,7 +36,7 @@ {132, DeviceType::BOILER, F("GC7000F"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {133, DeviceType::BOILER, F("Logano GB125/KB195i/Logamatic MC110"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {167, DeviceType::BOILER, F("Cerapur Aero"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, -{168, DeviceType::BOILER, F("Hybrid Heatpump"), DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP}, +{168, DeviceType::BOILER, F("Hybrid Heatpump"), DeviceFlags::EMS_DEVICE_FLAG_HYBRID}, {170, DeviceType::BOILER, F("Logano GB212"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {172, DeviceType::BOILER, F("Enviline/Compress 6000AW/Hybrid 7000iAW/SupraEco/Geo 5xx"), DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP}, {173, DeviceType::BOILER, F("Geo 5xx"), DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP}, diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 996146840..811cffa7a 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -71,7 +71,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const } // only EMS+ - if (model() != EMSdevice::EMS_DEVICE_FLAG_EMS && model() != EMSdevice::EMS_DEVICE_FLAG_HT3) { + if (model() != EMSdevice::EMS_DEVICE_FLAG_EMS && model() != EMSdevice::EMS_DEVICE_FLAG_HT3 && model() != EMSdevice::EMS_DEVICE_FLAG_HYBRID) { register_telegram_type(0xD1, F("UBAOutdoorTemp"), false, MAKE_PF_CB(process_UBAOutdoorTemp)); register_telegram_type(0xE3, F("UBAMonitorSlowPlus2"), false, MAKE_PF_CB(process_UBAMonitorSlowPlus2)); register_telegram_type(0xE4, F("UBAMonitorFastPlus"), false, MAKE_PF_CB(process_UBAMonitorFastPlus)); @@ -89,6 +89,10 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x48A, F("HpPool"), true, MAKE_PF_CB(process_HpPool)); } + if (model() == EMSdevice::EMS_DEVICE_FLAG_HYBRID) { + register_telegram_type(0xBB, F("HybridHp"), true, MAKE_PF_CB(process_HybridHp)); + } + // reset is a command uses a dummy variable which is always zero, shown as blank, but provides command enum options register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &reset_, DeviceValueType::CMD, FL_(enum_reset), FL_(reset), DeviceValueUOM::NONE, MAKE_CF_CB(set_reset)); has_update(reset_, 0); @@ -198,6 +202,58 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueUOM::NONE, MAKE_CF_CB(set_maintenancedate)); + // Hybrid Heatpump + if (model() == EMSdevice::EMS_DEVICE_FLAG_HYBRID) { + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &gasPriceMode_, + DeviceValueType::ENUM, + FL_(enum_gasPriceMode), + FL_(gasPriceMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_gasPriceMode)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &switchOverTemp_, + DeviceValueType::UINT, + nullptr, + FL_(switchOverTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_switchOverTemp)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &gasPriceRatio_, + DeviceValueType::UINT, + FL_(div10), + FL_(gasPriceRatio), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_gasPriceRatio)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &fossileFactor_, + DeviceValueType::UINT, + FL_(div10), + FL_(fossileFactor), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_fossileFactor)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &electricFactor_, + DeviceValueType::UINT, + FL_(div10), + FL_(electricFactor), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_electricFactor)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &waitBoiler_, + DeviceValueType::UINT, + nullptr, + FL_(waitBoiler), + DeviceValueUOM::MINUTES, + MAKE_CF_CB(set_waitBoiler)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &tempDiffBoiler_, + DeviceValueType::UINT, + nullptr, + FL_(tempDiffBoiler), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_tempDiffBoiler)); + } // heatpump info if (model() == EMS_DEVICE_FLAG_HEATPUMP) { register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &upTimeControl_, DeviceValueType::TIME, FL_(div60), FL_(upTimeControl), DeviceValueUOM::MINUTES); @@ -994,6 +1050,80 @@ void Boiler::process_UBAMaintenanceData(std::shared_ptr telegram } } + +// 0xBB Heatpump optimization +// Boiler(0x08) -> Me(0x0B), ?(0xBB), data: 00 00 00 00 00 00 00 00 00 00 00 FF 02 0F 1E 0B 1A 00 14 03 +void Boiler::process_HybridHp(std::shared_ptr telegram) { + has_enumupdate(telegram, gasPriceMode_, 12, 1); // cost = 2, temperature = 3, mix = 4 + has_update(telegram, switchOverTemp_, 13); // full degrees + has_update(telegram, gasPriceRatio_, 14); // is *10 + has_update(telegram, fossileFactor_, 15); // is * 10 + has_update(telegram, electricFactor_, 16); // is * 10 + has_update(telegram, waitBoiler_, 18); // minutes + has_update(telegram, tempDiffBoiler_, 19); // relative degrees +} + +/* + * Settings + */ + +bool Boiler::set_gasPriceMode(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_gasPriceMode))) { + return false; + } + write_command(0xBB, 12, v + 1, 0xBB); + return true; +} +bool Boiler::set_switchOverTemp(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0xBB, 13, v, 0xBB); + return true; +} +bool Boiler::set_gasPriceRatio(const char * value, const int8_t id) { + float v; + if (!Helpers::value2float(value, v)) { + return false; + } + write_command(0xBB, 14, (uint8_t)(v * 10), 0xBB); + return true; +} +bool Boiler::set_fossileFactor(const char * value, const int8_t id) { + float v; + if (!Helpers::value2float(value, v)) { + return false; + } + write_command(0xBB, 15, (uint8_t)(v * 10), 0xBB); + return true; +} +bool Boiler::set_electricFactor(const char * value, const int8_t id) { + float v; + if (!Helpers::value2float(value, v)) { + return false; + } + write_command(0xBB, 16, (uint8_t)(v * 10), 0xBB); + return true; +} +bool Boiler::set_waitBoiler(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + write_command(0xBB, 18, v, 0xBB); + return true; +} +bool Boiler::set_tempDiffBoiler(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v, true)) { + return false; + } + write_command(0xBB, 19, v, 0xBB); + return true; +} + // Set the dhw temperature 0x33/0x35 or 0xEA bool Boiler::set_ww_temp(const char * value, const int8_t id) { int v = 0; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index d83821457..9be5110fd 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -193,6 +193,15 @@ class Boiler : public EMSdevice { // Pool unit int8_t poolSetTemp_; + // HybridHP + uint8_t gasPriceMode_; // cost = 2, temperature = 3, mix = 4 + uint8_t switchOverTemp_; // degrees + uint8_t gasPriceRatio_; // is *10 + uint8_t fossileFactor_; // is * 10 + uint8_t electricFactor_; // is * 10 + uint8_t waitBoiler_; // minutes + uint8_t tempDiffBoiler_; // relative temperature degrees + void process_UBAParameterWW(std::shared_ptr telegram); void process_UBAMonitorFast(std::shared_ptr telegram); void process_UBATotalUptime(std::shared_ptr telegram); @@ -221,6 +230,7 @@ class Boiler : public EMSdevice { void process_HpPower(std::shared_ptr telegram); void process_HpOutdoor(std::shared_ptr telegram); void process_HpPool(std::shared_ptr telegram); + void process_HybridHp(std::shared_ptr telegram); // commands - none of these use the additional id parameter bool set_ww_mode(const char * value, const int8_t id); @@ -256,6 +266,14 @@ class Boiler : public EMSdevice { bool set_ww_hyst_on(const char * value, const int8_t id); bool set_ww_hyst_off(const char * value, const int8_t id); bool set_pool_temp(const char * value, const int8_t id); + + bool set_gasPriceMode(const char * value, const int8_t id); + bool set_switchOverTemp(const char * value, const int8_t id); + bool set_gasPriceRatio(const char * value, const int8_t id); + bool set_fossileFactor(const char * value, const int8_t id); + bool set_electricFactor(const char * value, const int8_t id); + bool set_waitBoiler(const char * value, const int8_t id); + bool set_tempDiffBoiler(const char * value, const int8_t id); }; } // namespace emsesp diff --git a/src/emsdevice.h b/src/emsdevice.h index 99cadae76..2f03afd2c 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -319,6 +319,7 @@ class EMSdevice { static constexpr uint8_t EMS_DEVICE_FLAG_EMSPLUS = 2; static constexpr uint8_t EMS_DEVICE_FLAG_HT3 = 3; static constexpr uint8_t EMS_DEVICE_FLAG_HEATPUMP = 4; + static constexpr uint8_t EMS_DEVICE_FLAG_HYBRID = 5; // Solar Module static constexpr uint8_t EMS_DEVICE_FLAG_SM10 = 1; diff --git a/src/locale_EN.h b/src/locale_EN.h index c1b14c3a2..c00b65014 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -509,6 +509,16 @@ MAKE_PSTR_LIST(hpTl2, F("hptl2"), F("air inlet temperature (TL2)")) MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("low pressure side temperature (PL1)")) MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("high pressure side temperature (PH1)")) +// hybrid heatpump +MAKE_PSTR_LIST(enum_gasPriceMode, F("co2"), F("cost"), F("temperature"), F("mix")) +MAKE_PSTR_LIST(gasPriceMode, F("gaspricemode"), F("gas price mode")) +MAKE_PSTR_LIST(switchOverTemp, F("switchovertemp"), F("switch over temperature")) +MAKE_PSTR_LIST(gasPriceRatio, F("gaspriceratio"), F("gas price ratio")) +MAKE_PSTR_LIST(fossileFactor, F("fossilefactor"), F("fossile factor")) +MAKE_PSTR_LIST(electricFactor, F("electricfactor"), F("electric factor")) +MAKE_PSTR_LIST(waitBoiler, F("waitboiler"), F("wait boiler")) +MAKE_PSTR_LIST(tempDiffBoiler, F("tempdiffboiler"), F("temperature difference boiler")) + // the following are dhw for the boiler and automatically tagged with 'ww' MAKE_PSTR_LIST(wwSelTemp, F("wwseltemp"), F("selected temperature")) MAKE_PSTR_LIST(wwSelTempLow, F("wwseltemplow"), F("selected lower temperature")) From cf876acc5d750470b2def58c544ea8f52c6f0b96 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 10 Apr 2022 14:34:10 +0200 Subject: [PATCH 206/319] rename hybrid entities --- src/devices/boiler.cpp | 41 +++++++++++++++++++++++------------------ src/devices/boiler.h | 12 ++++++------ src/locale_EN.h | 23 +++++++++++++++-------- 3 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 811cffa7a..3fd61ad88 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -205,12 +205,12 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const // Hybrid Heatpump if (model() == EMSdevice::EMS_DEVICE_FLAG_HYBRID) { register_device_value(DeviceValueTAG::TAG_BOILER_DATA, - &gasPriceMode_, + &hybridStrategy_, DeviceValueType::ENUM, - FL_(enum_gasPriceMode), - FL_(gasPriceMode), + FL_(enum_hybridStrategy), + FL_(hybridStrategy), DeviceValueUOM::NONE, - MAKE_CF_CB(set_gasPriceMode)); + MAKE_CF_CB(set_hybridStrategy)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &switchOverTemp_, DeviceValueType::UINT, @@ -219,12 +219,12 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueUOM::DEGREES, MAKE_CF_CB(set_switchOverTemp)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, - &gasPriceRatio_, + &energyCostRatio_, DeviceValueType::UINT, FL_(div10), - FL_(gasPriceRatio), + FL_(energyCostRatio), DeviceValueUOM::NONE, - MAKE_CF_CB(set_gasPriceRatio)); + MAKE_CF_CB(set_energyCostRatio)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &fossileFactor_, DeviceValueType::UINT, @@ -240,12 +240,12 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueUOM::NONE, MAKE_CF_CB(set_electricFactor)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, - &waitBoiler_, + &delayBoiler_, DeviceValueType::UINT, nullptr, - FL_(waitBoiler), + FL_(delayBoiler), DeviceValueUOM::MINUTES, - MAKE_CF_CB(set_waitBoiler)); + MAKE_CF_CB(set_delayBoiler)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &tempDiffBoiler_, DeviceValueType::UINT, @@ -1050,16 +1050,15 @@ void Boiler::process_UBAMaintenanceData(std::shared_ptr telegram } } - // 0xBB Heatpump optimization // Boiler(0x08) -> Me(0x0B), ?(0xBB), data: 00 00 00 00 00 00 00 00 00 00 00 FF 02 0F 1E 0B 1A 00 14 03 void Boiler::process_HybridHp(std::shared_ptr telegram) { - has_enumupdate(telegram, gasPriceMode_, 12, 1); // cost = 2, temperature = 3, mix = 4 + has_enumupdate(telegram, hybridStrategy_, 12, 1); // cost = 2, temperature = 3, mix = 4 has_update(telegram, switchOverTemp_, 13); // full degrees - has_update(telegram, gasPriceRatio_, 14); // is *10 + has_update(telegram, energyCostRatio_, 14); // is *10 has_update(telegram, fossileFactor_, 15); // is * 10 has_update(telegram, electricFactor_, 16); // is * 10 - has_update(telegram, waitBoiler_, 18); // minutes + has_update(telegram, delayBoiler_, 18); // minutes has_update(telegram, tempDiffBoiler_, 19); // relative degrees } @@ -1067,14 +1066,15 @@ void Boiler::process_HybridHp(std::shared_ptr telegram) { * Settings */ -bool Boiler::set_gasPriceMode(const char * value, const int8_t id) { +bool Boiler::set_hybridStrategy(const char * value, const int8_t id) { uint8_t v; - if (!Helpers::value2enum(value, v, FL_(enum_gasPriceMode))) { + if (!Helpers::value2enum(value, v, FL_(enum_hybridStrategy))) { return false; } write_command(0xBB, 12, v + 1, 0xBB); return true; } + bool Boiler::set_switchOverTemp(const char * value, const int8_t id) { int v; if (!Helpers::value2temperature(value, v)) { @@ -1083,7 +1083,8 @@ bool Boiler::set_switchOverTemp(const char * value, const int8_t id) { write_command(0xBB, 13, v, 0xBB); return true; } -bool Boiler::set_gasPriceRatio(const char * value, const int8_t id) { + +bool Boiler::set_energyCostRatio(const char * value, const int8_t id) { float v; if (!Helpers::value2float(value, v)) { return false; @@ -1091,6 +1092,7 @@ bool Boiler::set_gasPriceRatio(const char * value, const int8_t id) { write_command(0xBB, 14, (uint8_t)(v * 10), 0xBB); return true; } + bool Boiler::set_fossileFactor(const char * value, const int8_t id) { float v; if (!Helpers::value2float(value, v)) { @@ -1099,6 +1101,7 @@ bool Boiler::set_fossileFactor(const char * value, const int8_t id) { write_command(0xBB, 15, (uint8_t)(v * 10), 0xBB); return true; } + bool Boiler::set_electricFactor(const char * value, const int8_t id) { float v; if (!Helpers::value2float(value, v)) { @@ -1107,7 +1110,8 @@ bool Boiler::set_electricFactor(const char * value, const int8_t id) { write_command(0xBB, 16, (uint8_t)(v * 10), 0xBB); return true; } -bool Boiler::set_waitBoiler(const char * value, const int8_t id) { + +bool Boiler::set_delayBoiler(const char * value, const int8_t id) { int v; if (!Helpers::value2number(value, v)) { return false; @@ -1115,6 +1119,7 @@ bool Boiler::set_waitBoiler(const char * value, const int8_t id) { write_command(0xBB, 18, v, 0xBB); return true; } + bool Boiler::set_tempDiffBoiler(const char * value, const int8_t id) { int v; if (!Helpers::value2temperature(value, v, true)) { diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 9be5110fd..1641a49a7 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -194,12 +194,12 @@ class Boiler : public EMSdevice { int8_t poolSetTemp_; // HybridHP - uint8_t gasPriceMode_; // cost = 2, temperature = 3, mix = 4 + uint8_t hybridStrategy_; // cost = 2, temperature = 3, mix = 4 uint8_t switchOverTemp_; // degrees - uint8_t gasPriceRatio_; // is *10 + uint8_t energyCostRatio_; // is *10 uint8_t fossileFactor_; // is * 10 uint8_t electricFactor_; // is * 10 - uint8_t waitBoiler_; // minutes + uint8_t delayBoiler_; // minutes uint8_t tempDiffBoiler_; // relative temperature degrees void process_UBAParameterWW(std::shared_ptr telegram); @@ -267,12 +267,12 @@ class Boiler : public EMSdevice { bool set_ww_hyst_off(const char * value, const int8_t id); bool set_pool_temp(const char * value, const int8_t id); - bool set_gasPriceMode(const char * value, const int8_t id); + bool set_hybridStrategy(const char * value, const int8_t id); bool set_switchOverTemp(const char * value, const int8_t id); - bool set_gasPriceRatio(const char * value, const int8_t id); + bool set_energyCostRatio(const char * value, const int8_t id); bool set_fossileFactor(const char * value, const int8_t id); bool set_electricFactor(const char * value, const int8_t id); - bool set_waitBoiler(const char * value, const int8_t id); + bool set_delayBoiler(const char * value, const int8_t id); bool set_tempDiffBoiler(const char * value, const int8_t id); }; diff --git a/src/locale_EN.h b/src/locale_EN.h index c00b65014..ff0d8be51 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -221,6 +221,12 @@ MAKE_PSTR(tag_wwc1, "wwc1") MAKE_PSTR(tag_wwc2, "wwc2") MAKE_PSTR(tag_wwc3, "wwc3") MAKE_PSTR(tag_wwc4, "wwc4") +MAKE_PSTR(tag_wwc5, "wwc5") +MAKE_PSTR(tag_wwc6, "wwc6") +MAKE_PSTR(tag_wwc7, "wwc7") +MAKE_PSTR(tag_wwc8, "wwc8") +MAKE_PSTR(tag_wwc9, "wwc9") +MAKE_PSTR(tag_wwc10, "wwc10") MAKE_PSTR(tag_hs1, "hs1") MAKE_PSTR(tag_hs2, "hs2") MAKE_PSTR(tag_hs3, "hs3") @@ -510,14 +516,14 @@ MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("low pressure side temperature (PL1)")) MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("high pressure side temperature (PH1)")) // hybrid heatpump -MAKE_PSTR_LIST(enum_gasPriceMode, F("co2"), F("cost"), F("temperature"), F("mix")) -MAKE_PSTR_LIST(gasPriceMode, F("gaspricemode"), F("gas price mode")) -MAKE_PSTR_LIST(switchOverTemp, F("switchovertemp"), F("switch over temperature")) -MAKE_PSTR_LIST(gasPriceRatio, F("gaspriceratio"), F("gas price ratio")) -MAKE_PSTR_LIST(fossileFactor, F("fossilefactor"), F("fossile factor")) -MAKE_PSTR_LIST(electricFactor, F("electricfactor"), F("electric factor")) -MAKE_PSTR_LIST(waitBoiler, F("waitboiler"), F("wait boiler")) -MAKE_PSTR_LIST(tempDiffBoiler, F("tempdiffboiler"), F("temperature difference boiler")) +MAKE_PSTR_LIST(enum_hybridStrategy, F("co2-optimized"), F("cost-optimized"), F("outside-temp-switched"), F("co2-cost-mix")) +MAKE_PSTR_LIST(hybridStrategy, F("hybridstrategy"), F("hybrid control strategy")) +MAKE_PSTR_LIST(switchOverTemp, F("switchovertemp"), F("outside switchover temperature")) +MAKE_PSTR_LIST(energyCostRatio, F("energycostratio"), F("energy cost ratio")) +MAKE_PSTR_LIST(fossileFactor, F("fossilefactor"), F("fossile energy factor")) +MAKE_PSTR_LIST(electricFactor, F("electricfactor"), F("electric energy factor")) +MAKE_PSTR_LIST(delayBoiler, F("delayboiler"), F("delay boiler support")) +MAKE_PSTR_LIST(tempDiffBoiler, F("tempdiffboiler"), F("tempediff boiler support")) // the following are dhw for the boiler and automatically tagged with 'ww' MAKE_PSTR_LIST(wwSelTemp, F("wwseltemp"), F("selected temperature")) @@ -671,6 +677,7 @@ MAKE_PSTR_LIST(poolSetTemp, F("poolsettemp"), F("pool set temperature")) MAKE_PSTR_LIST(poolTemp, F("pooltemp"), F("pool temperature")) MAKE_PSTR_LIST(poolShuntStatus, F("poolshuntstatus"), F("pool shunt status opening/closing")) MAKE_PSTR_LIST(poolShunt, F("poolshunt"), F("pool shunt open/close (0% = pool / 100% = heat)")) +MAKE_PSTR_LIST(hydrTemp, F("hydrTemp"), F("hydraulic header temperature")) // solar MAKE_PSTR_LIST(collectorTemp, F("collectortemp"), F("collector temperature (TS1)")) From 75914da36a27446a0aedde53494e34313a9ede0d Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 10 Apr 2022 14:35:55 +0200 Subject: [PATCH 207/319] thermostat switchpoints allow T1-T4 --- src/devices/thermostat.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 48253bb2b..23bce8656 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1148,12 +1148,14 @@ void Thermostat::process_RC35Timer(std::shared_ptr telegram) { char data[sizeof(hc->switchtime1)]; uint8_t no = telegram->offset / 2; uint8_t day = telegram->message_data[0] >> 5; - uint8_t on = telegram->message_data[0] & 1; + uint8_t on = telegram->message_data[0] & 0x07; uint8_t time = telegram->message_data[1]; std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); if (day == 7) { snprintf(data, sizeof(data), "%02d not_set", no); + } else if (model() == EMS_DEVICE_FLAG_RC30_N) { + snprintf(data, sizeof(data), "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on); } else { snprintf(data, sizeof(data), "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); } @@ -1306,6 +1308,12 @@ void Thermostat::process_RCErrorMessage(std::shared_ptr telegram } } +/* + * + * *** settings *** + * + */ + // 0xA5 - Set minimum external temperature bool Thermostat::set_minexttemp(const char * value, const int8_t id) { int mt = 0; @@ -2352,6 +2360,8 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char } if (strlen(value) > 13 && value[12] == 'o') { on = value[13] == 'n' ? 1 : 0; + } else if (strlen(value) > 13 && value[12] == 'T') { + on = value[13] - '0'; } else if (strlen(value) == 13) { on = value[12] - '0'; } @@ -2369,7 +2379,7 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char } uint8_t max_on = 3; - if ((model() == EMS_DEVICE_FLAG_RC35) || (model() == EMS_DEVICE_FLAG_RC30_N)) { + if (model() == EMS_DEVICE_FLAG_RC35) { max_on = 1; } if (no > 41 || time > 0x90 || (on > max_on && on != 7)) { @@ -2379,8 +2389,10 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char } if (data[0] != 0xE7) { std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); - if ((model() == EMS_DEVICE_FLAG_RC35) || (model() == EMS_DEVICE_FLAG_RC30_N)) { + if (model() == EMS_DEVICE_FLAG_RC35) { snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); + } else if (model() == EMS_DEVICE_FLAG_RC30_N) { + snprintf(out, len, "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on + 1); } else if (model() == EMS_DEVICE_FLAG_RC20) { snprintf(out, len, "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on); } else { From 0d79138e0b47b43d93a87832ac937441462fda58 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 10 Apr 2022 14:37:43 +0200 Subject: [PATCH 208/319] product-id 100 is mixer with max wwc10, add handlers_ignored --- src/device_library.h | 2 +- src/devices/mixer.cpp | 57 ++++++++++++++++++++++++++++++++++-------- src/devices/mixer.h | 10 ++++++++ src/devices/solar.cpp | 40 +++-------------------------- src/devices/solar.h | 1 - src/emsdevice.cpp | 30 +++++++++++++++++++--- src/emsdevice.h | 5 +++- src/emsdevicevalue.cpp | 12 +++++++++ src/emsdevicevalue.h | 6 +++++ src/emsesp.cpp | 7 ++++-- src/system.cpp | 4 +++ 11 files changed, 118 insertions(+), 56 deletions(-) diff --git a/src/device_library.h b/src/device_library.h index bd1a7d40f..726972c5f 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -113,7 +113,6 @@ // Solar Modules - 0x30 (for solar), 0x2A, 0x41 (for ww) { 73, DeviceType::SOLAR, F("SM10"), DeviceFlags::EMS_DEVICE_FLAG_SM10}, -{100, DeviceType::SOLAR, F("ISM DHW"), DeviceFlags::EMS_DEVICE_FLAG_ISM}, {101, DeviceType::SOLAR, F("ISM1"), DeviceFlags::EMS_DEVICE_FLAG_ISM}, {103, DeviceType::SOLAR, F("ISM2"), DeviceFlags::EMS_DEVICE_FLAG_ISM}, {162, DeviceType::SOLAR, F("SM50"), DeviceFlags::EMS_DEVICE_FLAG_SM100}, @@ -122,6 +121,7 @@ // Mixer Modules - 0x20-0x27 for HC, 0x28-0x29 for WWC and 0x11 for the MP100 { 69, DeviceType::MIXER, F("MM10"), DeviceFlags::EMS_DEVICE_FLAG_MM10}, +{100, DeviceType::MIXER, F("IPM"), DeviceFlags::EMS_DEVICE_FLAG_IPM}, {102, DeviceType::MIXER, F("IPM"), DeviceFlags::EMS_DEVICE_FLAG_IPM}, {159, DeviceType::MIXER, F("MM50"), DeviceFlags::EMS_DEVICE_FLAG_MMPLUS}, {160, DeviceType::MIXER, F("MM100"), DeviceFlags::EMS_DEVICE_FLAG_MMPLUS}, diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index daeb29840..c1cacf0b1 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -99,17 +99,29 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c // HT3 if (flags == EMSdevice::EMS_DEVICE_FLAG_IPM) { - register_telegram_type(0x010C, F("IPMStatusMessage"), false, MAKE_PF_CB(process_IPMStatusMessage)); - register_telegram_type(0x011E, F("IPMTempMessage"), false, MAKE_PF_CB(process_IPMTempMessage)); - // register_telegram_type(0x0123, F("IPMSetMessage"), false, MAKE_PF_CB(process_IPMSetMessage)); - type_ = Type::HC; - hc_ = device_id - 0x20 + 1; - uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; - register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); - register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); - register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); - register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); - register_device_value(tag, &flowTempVf_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempVf), DeviceValueUOM::DEGREES); + if (device_id >= 0x40) { // special DHW pos 10 + register_telegram_type(0x34, F("UBAMonitorWW"), false, MAKE_PF_CB(process_MonitorWW)); + register_telegram_type(0x1E, F("HydrTemp"), false, MAKE_PF_CB(process_HydrTemp)); + type_ = Type::WWC; + hc_ = device_id - 0x40 + 1; + uint8_t tag = DeviceValueTAG::TAG_WWC9 + hc_ - 1; + register_device_value(tag, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwSelTemp)); + register_device_value(tag, &wwCurTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &wwCurTemp_2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); + register_device_value(tag, &HydrTemp_, DeviceValueType::USHORT, FL_(div10), FL_(hydrTemp), DeviceValueUOM::DEGREES); + } else { + register_telegram_type(0x010C, F("IPMStatusMessage"), false, MAKE_PF_CB(process_IPMStatusMessage)); + register_telegram_type(0x011E, F("IPMTempMessage"), false, MAKE_PF_CB(process_IPMTempMessage)); + // register_telegram_type(0x0123, F("IPMSetMessage"), false, MAKE_PF_CB(process_IPMSetMessage)); + type_ = Type::HC; + hc_ = device_id - 0x20 + 1; + uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; + register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); + register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); + register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); + register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); + register_device_value(tag, &flowTempVf_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempVf), DeviceValueUOM::DEGREES); + } } } @@ -203,6 +215,19 @@ void Mixer::process_MMPLUSConfigMessage_WWC(std::shared_ptr tele has_update(telegram, wwMaxTemp_, 10); } +// 0x34 +void Mixer::process_MonitorWW(std::shared_ptr telegram) { + has_update(telegram, wwSelTemp_, 0); + has_update(telegram, wwCurTemp_1_, 1); + has_update(telegram, wwCurTemp_2_, 3); +} +// 0x1E +void Mixer::process_HydrTemp(std::shared_ptr telegram) { + has_update(telegram, HydrTemp_, 0); +} + + + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -241,6 +266,16 @@ void Mixer::process_IPMSetMessage(std::shared_ptr telegram) { #pragma GCC diagnostic pop +bool Mixer::set_wwSelTemp(const char * value, const int8_t id) { + int temperature; + if (!Helpers::value2temperature(value, temperature)) { + return false; + } + write_command(0x35, 3, (uint8_t)temperature, 0x34); + return true; +} + + bool Mixer::set_flowSetTemp(const char * value, const int8_t id) { int v; if (!Helpers::value2number(value, v)) { diff --git a/src/devices/mixer.h b/src/devices/mixer.h index 1547598bd..8c8cf72ea 100644 --- a/src/devices/mixer.h +++ b/src/devices/mixer.h @@ -43,6 +43,9 @@ class Mixer : public EMSdevice { void process_MMSetMessage(std::shared_ptr telegram); void process_HpPoolStatus(std::shared_ptr telegram); + void process_MonitorWW(std::shared_ptr telegram); + void process_HydrTemp(std::shared_ptr telegram); + bool set_flowSetTemp(const char * value, const int8_t id); bool set_pump(const char * value, const int8_t id); bool set_activated(const char * value, const int8_t id); @@ -56,6 +59,8 @@ class Mixer : public EMSdevice { bool set_wwCircPump(const char * value, const int8_t id); bool set_wwCircMode(const char * value, const int8_t id); + bool set_wwSelTemp(const char * value, const int8_t id); + enum class Type { NONE, @@ -90,6 +95,11 @@ class Mixer : public EMSdevice { Type type_ = Type::NONE; uint16_t hc_ = EMS_VALUE_USHORT_NOTSET; uint8_t poolShuntStatus__ = EMS_VALUE_UINT_NOTSET; // temp value + + uint8_t wwSelTemp_; + uint16_t wwCurTemp_1_; + uint16_t wwCurTemp_2_; + uint16_t HydrTemp_; }; } // namespace emsesp diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index 919b9a135..55c2a5bd6 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -63,30 +63,12 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c } if (flags == EMSdevice::EMS_DEVICE_FLAG_ISM) { - if (device_id == 0x41) { // ISM DHW module - register_telegram_type(0x34, F("UBAMonitorWW"), false, MAKE_PF_CB(process_MonitorWW)); - } else { - register_telegram_type(0x0103, F("ISM1StatusMessage"), true, MAKE_PF_CB(process_ISM1StatusMessage)); - register_telegram_type(0x0101, F("ISM1Set"), true, MAKE_PF_CB(process_ISM1Set)); - register_telegram_type(0x0104, F("ISM2StatusMessage"), false, MAKE_PF_CB(process_ISM2StatusMessage)); - } + register_telegram_type(0x0103, F("ISM1StatusMessage"), true, MAKE_PF_CB(process_ISM1StatusMessage)); + register_telegram_type(0x0101, F("ISM1Set"), true, MAKE_PF_CB(process_ISM1Set)); + register_telegram_type(0x0104, F("ISM2StatusMessage"), false, MAKE_PF_CB(process_ISM2StatusMessage)); } // device values... - - // special case ISM DHW module - if (device_id == 0x41) { // ISM DHW module - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, - &wwSelTemp_, - DeviceValueType::UINT, - nullptr, - FL_(wwSelTemp), - DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_wwSelTemp)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_3_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); - return; - } // special case for a SM100 DHW device_id with 0x2A where it's not actual a solar module if (device_id == 0x2A) { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp1), DeviceValueUOM::DEGREES); @@ -809,16 +791,6 @@ void Solar::process_ISM1Set(std::shared_ptr telegram) { has_update(telegram, cylMaxTemp_, 6); } -/* - * Junkers ISM1 Solar DHW Module - type 0x34 ww - */ -void Solar::process_MonitorWW(std::shared_ptr telegram) { - has_update(telegram, wwSelTemp_, 0); - has_update(telegram, wwTemp_1_, 1); - has_update(telegram, wwTemp_3_, 3); -} - - /* * Settings */ @@ -1163,11 +1135,7 @@ bool Solar::set_wwSelTemp(const char * value, const int8_t id) { if (!Helpers::value2temperature(value, temperature)) { return false; } - if (flags() == EMSdevice::EMS_DEVICE_FLAG_ISM) { - write_command(0x35, 3, (uint8_t)temperature, 0x34); - } else { // SM100 - write_command(0x7A6, 9, (uint8_t)temperature, 0x7A6); - } + write_command(0x7A6, 9, (uint8_t)temperature, 0x7A6); return true; } diff --git a/src/devices/solar.h b/src/devices/solar.h index 68c98e478..363462cb6 100644 --- a/src/devices/solar.h +++ b/src/devices/solar.h @@ -188,7 +188,6 @@ class Solar : public EMSdevice { void process_ISM1StatusMessage(std::shared_ptr telegram); void process_ISM1Set(std::shared_ptr telegram); void process_ISM2StatusMessage(std::shared_ptr telegram); - void process_MonitorWW(std::shared_ptr telegram); // settings bool set_CollectorMaxTemp(const char * value, const int8_t id); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index b579aa6a2..625c9e497 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -311,6 +311,11 @@ void EMSdevice::show_telegram_handlers(uuid::console::Shell & shell) const { } } shell.println(); + shell.printf(F(" Ignored telegram type IDs: ")); + for (auto handlers : handlers_ignored_) { + shell.printf(F("0x%02X "), handlers); + } + shell.println(); } // list all the telegram type IDs for this device, outputting to a string (max size 200) @@ -333,10 +338,27 @@ char * EMSdevice::show_telegram_handlers(char * result, const size_t len, const strlcat(result, Helpers::hextoa(tf.telegram_type_id_, true).c_str(), len); } } - + if (handlers == Handlers::ALL || handlers == Handlers::IGNORED) { + i = 0; + for (auto handlers : handlers_ignored_) { + if (i++ > 0) { + strlcat(result, " ", len); + } + strlcat(result, Helpers::hextoa(handlers).c_str(), len); + } + } return result; } +void EMSdevice::add_handlers_ignored(const uint16_t handler) { + for (auto handlers : handlers_ignored_) { + if (handler == handlers) { + return; + } + } + handlers_ignored_.push_back(handler); +} + // list all the mqtt handlers for this device void EMSdevice::show_mqtt_handlers(uuid::console::Shell & shell) const { Mqtt::show_topic_handlers(shell, device_type_); @@ -443,7 +465,7 @@ void EMSdevice::register_device_value(uint8_t tag, if (tag >= DeviceValueTAG::TAG_HC1 && tag <= DeviceValueTAG::TAG_HC8) { flags |= CommandFlag::MQTT_SUB_FLAG_HC; - } else if (tag >= DeviceValueTAG::TAG_WWC1 && tag <= DeviceValueTAG::TAG_WWC4) { + } else if (tag >= DeviceValueTAG::TAG_WWC1 && tag <= DeviceValueTAG::TAG_WWC10) { flags |= CommandFlag::MQTT_SUB_FLAG_WWC; } else if (tag == DeviceValueTAG::TAG_DEVICE_DATA_WW) { flags |= CommandFlag::MQTT_SUB_FLAG_WW; @@ -517,7 +539,7 @@ void EMSdevice::publish_value(void * value_p) const { if (dv.value_p == value_p && !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE)) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; if (Mqtt::publish_single2cmd()) { - if (dv.tag >= DeviceValueTAG::TAG_HC1 && dv.tag <= DeviceValueTAG::TAG_WWC4) { + if (dv.tag >= DeviceValueTAG::TAG_HC1 && dv.tag <= DeviceValueTAG::TAG_WWC10) { snprintf(topic, sizeof(topic), "%s/%s/%s", @@ -887,7 +909,7 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 // check if we have hc or wwc if (id >= 1 && id <= 8) { tag = DeviceValueTAG::TAG_HC1 + id - 1; - } else if (id >= 9 && id <= 12) { + } else if (id >= 9 && id <= 19) { tag = DeviceValueTAG::TAG_WWC1 + id - 9; } else if (id != -1) { return false; // error diff --git a/src/emsdevice.h b/src/emsdevice.h index 2f03afd2c..3da12a4e3 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -177,12 +177,13 @@ class EMSdevice { std::string to_string() const; std::string to_string_short() const; - enum Handlers : uint8_t { ALL, RECEIVED, FETCHED, PENDING }; + enum Handlers : uint8_t { ALL, RECEIVED, FETCHED, PENDING, IGNORED }; void show_telegram_handlers(uuid::console::Shell & shell) const; char * show_telegram_handlers(char * result, const size_t len, const uint8_t handlers); void show_mqtt_handlers(uuid::console::Shell & shell) const; void list_device_entries(JsonObject & output) const; + void add_handlers_ignored(const uint16_t handler); void mask_entity(const std::string & entity_id); void getMaskedEntities(std::vector & entity_ids); @@ -385,6 +386,8 @@ class EMSdevice { // device values std::vector devicevalues_; + + std::vector handlers_ignored_; }; } // namespace emsesp diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp index 450f53aff..d1a2ffe41 100644 --- a/src/emsdevicevalue.cpp +++ b/src/emsdevicevalue.cpp @@ -70,6 +70,12 @@ const __FlashStringHelper * const DeviceValue::DeviceValueTAG_s[] PROGMEM = { F_(tag_wwc2), // "Wwc2" F_(tag_wwc3), // "wwc3" F_(tag_wwc4), // "wwc4" + F_(tag_wwc5), // "wwc5" + F_(tag_wwc6), // "wwc6" + F_(tag_wwc7), // "wwc7" + F_(tag_wwc8), // "wwc8" + F_(tag_wwc9), // "wwc9" + F_(tag_wwc10), // "wwc10" F_(tag_hs1), // "hs1" F_(tag_hs2), // "hs2" F_(tag_hs3), // "hs3" @@ -109,6 +115,12 @@ const __FlashStringHelper * const DeviceValue::DeviceValueTAG_mqtt[] PROGMEM = { F_(tag_wwc2), // "Wwc2" F_(tag_wwc3), // "wwc3" F_(tag_wwc4), // "wwc4" + F_(tag_wwc5), // "wwc5" + F_(tag_wwc6), // "wwc6" + F_(tag_wwc7), // "wwc7" + F_(tag_wwc8), // "wwc8" + F_(tag_wwc9), // "wwc9" + F_(tag_wwc10), // "wwc10" F_(tag_hs1), // "hs1" F_(tag_hs2), // "hs2" F_(tag_hs3), // "hs3" diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 5d6ac776e..5f88b9de5 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -90,6 +90,12 @@ class DeviceValue { TAG_WWC2, TAG_WWC3, TAG_WWC4, + TAG_WWC5, + TAG_WWC6, + TAG_WWC7, + TAG_WWC8, + TAG_WWC9, + TAG_WWC10, TAG_HS1, TAG_HS2, TAG_HS3, diff --git a/src/emsesp.cpp b/src/emsesp.cpp index aef1cb0e3..f2e8e93b8 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -619,7 +619,7 @@ void EMSESP::publish_device_values(uint8_t device_type) { if (nested) { need_publish |= emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::MQTT); // nested } else { - for (uint8_t hc_tag = DeviceValueTAG::TAG_HC1; hc_tag <= DeviceValueTAG::TAG_WWC4; hc_tag++) { + for (uint8_t hc_tag = DeviceValueTAG::TAG_HC1; hc_tag <= DeviceValueTAG::TAG_WWC10; hc_tag++) { json = doc.to(); if (emsdevice->generate_values(json, hc_tag, false, EMSdevice::OUTPUT_TARGET::MQTT)) { // not nested Mqtt::publish(Mqtt::tag_to_topic(device_type, hc_tag), json); @@ -951,6 +951,9 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { if (wait_validate_ == telegram->type_id) { wait_validate_ = 0; } + if (!found && emsdevice->is_device_id(telegram->src) && telegram->message_length > 0) { + emsdevice->add_handlers_ignored(telegram->type_id); + } break; } } @@ -1202,7 +1205,7 @@ bool EMSESP::command_info(uint8_t device_type, JsonObject & output, const int8_t uint8_t tag; if (id >= 1 && id <= 8) { tag = DeviceValueTAG::TAG_HC1 + id - 1; - } else if (id >= 9 && id <= 12) { + } else if (id >= 9 && id <= 19) { tag = DeviceValueTAG::TAG_WWC1 + id - 9; } else if (id == -1 || id == 0) { tag = DeviceValueTAG::TAG_NONE; diff --git a/src/system.cpp b/src/system.cpp index edb65a7f2..f2063415f 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1219,6 +1219,10 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp if (result[0] != '\0') { obj["handlers pending"] = result; } + (void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::IGNORED); + if (result[0] != '\0') { + obj["handlers ignored"] = result; + } } } } From eec4d7863dccba06509a25f620cf20221d4e687e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 10 Apr 2022 18:25:11 +0200 Subject: [PATCH 209/319] move Hybrid settings to thermostat --- src/devices/boiler.cpp | 12 ++-- src/devices/boiler.h | 5 +- src/devices/mixer.cpp | 1 + src/devices/thermostat.cpp | 142 +++++++++++++++++++++++++++++++++++++ src/devices/thermostat.h | 19 +++++ 5 files changed, 174 insertions(+), 5 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 3fd61ad88..8d2a8d226 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -89,10 +89,11 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x48A, F("HpPool"), true, MAKE_PF_CB(process_HpPool)); } + /* if (model() == EMSdevice::EMS_DEVICE_FLAG_HYBRID) { register_telegram_type(0xBB, F("HybridHp"), true, MAKE_PF_CB(process_HybridHp)); } - + */ // reset is a command uses a dummy variable which is always zero, shown as blank, but provides command enum options register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &reset_, DeviceValueType::CMD, FL_(enum_reset), FL_(reset), DeviceValueUOM::NONE, MAKE_CF_CB(set_reset)); has_update(reset_, 0); @@ -202,6 +203,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueUOM::NONE, MAKE_CF_CB(set_maintenancedate)); + /* // Hybrid Heatpump if (model() == EMSdevice::EMS_DEVICE_FLAG_HYBRID) { register_device_value(DeviceValueTAG::TAG_BOILER_DATA, @@ -254,6 +256,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_tempDiffBoiler)); } + */ // heatpump info if (model() == EMS_DEVICE_FLAG_HEATPUMP) { register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &upTimeControl_, DeviceValueType::TIME, FL_(div60), FL_(upTimeControl), DeviceValueUOM::MINUTES); @@ -1049,7 +1052,7 @@ void Boiler::process_UBAMaintenanceData(std::shared_ptr telegram has_update(maintenanceDate_, date, sizeof(maintenanceDate_)); } } - +/* // 0xBB Heatpump optimization // Boiler(0x08) -> Me(0x0B), ?(0xBB), data: 00 00 00 00 00 00 00 00 00 00 00 FF 02 0F 1E 0B 1A 00 14 03 void Boiler::process_HybridHp(std::shared_ptr telegram) { @@ -1061,11 +1064,11 @@ void Boiler::process_HybridHp(std::shared_ptr telegram) { has_update(telegram, delayBoiler_, 18); // minutes has_update(telegram, tempDiffBoiler_, 19); // relative degrees } - +*/ /* * Settings */ - +/* bool Boiler::set_hybridStrategy(const char * value, const int8_t id) { uint8_t v; if (!Helpers::value2enum(value, v, FL_(enum_hybridStrategy))) { @@ -1128,6 +1131,7 @@ bool Boiler::set_tempDiffBoiler(const char * value, const int8_t id) { write_command(0xBB, 19, v, 0xBB); return true; } +*/ // Set the dhw temperature 0x33/0x35 or 0xEA bool Boiler::set_ww_temp(const char * value, const int8_t id) { diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 1641a49a7..7247f273b 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -193,6 +193,7 @@ class Boiler : public EMSdevice { // Pool unit int8_t poolSetTemp_; + /* // HybridHP uint8_t hybridStrategy_; // cost = 2, temperature = 3, mix = 4 uint8_t switchOverTemp_; // degrees @@ -201,6 +202,7 @@ class Boiler : public EMSdevice { uint8_t electricFactor_; // is * 10 uint8_t delayBoiler_; // minutes uint8_t tempDiffBoiler_; // relative temperature degrees + */ void process_UBAParameterWW(std::shared_ptr telegram); void process_UBAMonitorFast(std::shared_ptr telegram); @@ -266,7 +268,7 @@ class Boiler : public EMSdevice { bool set_ww_hyst_on(const char * value, const int8_t id); bool set_ww_hyst_off(const char * value, const int8_t id); bool set_pool_temp(const char * value, const int8_t id); - + /* bool set_hybridStrategy(const char * value, const int8_t id); bool set_switchOverTemp(const char * value, const int8_t id); bool set_energyCostRatio(const char * value, const int8_t id); @@ -274,6 +276,7 @@ class Boiler : public EMSdevice { bool set_electricFactor(const char * value, const int8_t id); bool set_delayBoiler(const char * value, const int8_t id); bool set_tempDiffBoiler(const char * value, const int8_t id); + */ }; } // namespace emsesp diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index c1cacf0b1..8a8f0e614 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -102,6 +102,7 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c if (device_id >= 0x40) { // special DHW pos 10 register_telegram_type(0x34, F("UBAMonitorWW"), false, MAKE_PF_CB(process_MonitorWW)); register_telegram_type(0x1E, F("HydrTemp"), false, MAKE_PF_CB(process_HydrTemp)); + // register_telegram_type(0x10D, F("wwNTCStatus"), false, MAKE_PF_CB(process_wwNTCStatus)); type_ = Type::WWC; hc_ = device_id - 0x40 + 1; uint8_t tag = DeviceValueTAG::TAG_WWC9 + hc_ - 1; diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 23bce8656..99ea0129c 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -169,6 +169,8 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i } } } + register_telegram_type(0xBB, F("HybridSettings"), true, MAKE_PF_CB(process_JunkersHybridSettings)); + register_telegram_type(0x23, F("JunkersSetMixer"), true, MAKE_PF_CB(process_JunkersSetMixer)); register_telegram_type(0x123, F("JunkersRemote"), false, MAKE_PF_CB(process_JunkersRemoteMonitor)); } @@ -302,6 +304,11 @@ std::shared_ptr Thermostat::heating_circuit(std::sha toggle_ = true; } + // not found, search device-id types for remote thermostats + if (telegram->dest >= 0x20 && telegram->dest <= 0x27) { + hc_num = telegram->dest - 0x20; + } + // still didn't recognize it, ignore it if (hc_num == 0) { return nullptr; @@ -842,6 +849,27 @@ void Thermostat::process_JunkersMonitor(std::shared_ptr telegram add_ha_climate(hc); } +// 0xBB Heatpump optimization +// ?(0xBB), data: 00 00 00 00 00 00 00 00 00 00 00 FF 02 0F 1E 0B 1A 00 14 03 +void Thermostat::process_JunkersHybridSettings(std::shared_ptr telegram) { + has_enumupdate(telegram, hybridStrategy_, 12, 1); // cost = 2, temperature = 3, mix = 4 + has_update(telegram, switchOverTemp_, 13); // full degrees + has_update(telegram, energyCostRatio_, 14); // is *10 + has_update(telegram, fossileFactor_, 15); // is * 10 + has_update(telegram, electricFactor_, 16); // is * 10 + has_update(telegram, delayBoiler_, 18); // minutes + has_update(telegram, tempDiffBoiler_, 19); // relative degrees +} + +void Thermostat::process_JunkersSetMixer(std::shared_ptr telegram) { + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } + has_update(telegram, hc->targetflowtemp, 0); +} + + // type 0x02A5 - data from Worchester CRF200 void Thermostat::process_CRFMonitor(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); @@ -1314,6 +1342,70 @@ void Thermostat::process_RCErrorMessage(std::shared_ptr telegram * */ +// 0xBB Hybrid pump +bool Thermostat::set_hybridStrategy(const char * value, const int8_t id) { + uint8_t v; + if (!Helpers::value2enum(value, v, FL_(enum_hybridStrategy))) { + return false; + } + write_command(0xBB, 12, v + 1, 0xBB); + return true; +} + +bool Thermostat::set_switchOverTemp(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v)) { + return false; + } + write_command(0xBB, 13, v, 0xBB); + return true; +} + +bool Thermostat::set_energyCostRatio(const char * value, const int8_t id) { + float v; + if (!Helpers::value2float(value, v)) { + return false; + } + write_command(0xBB, 14, (uint8_t)(v * 10), 0xBB); + return true; +} + +bool Thermostat::set_fossileFactor(const char * value, const int8_t id) { + float v; + if (!Helpers::value2float(value, v)) { + return false; + } + write_command(0xBB, 15, (uint8_t)(v * 10), 0xBB); + return true; +} + +bool Thermostat::set_electricFactor(const char * value, const int8_t id) { + float v; + if (!Helpers::value2float(value, v)) { + return false; + } + write_command(0xBB, 16, (uint8_t)(v * 10), 0xBB); + return true; +} + +bool Thermostat::set_delayBoiler(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + write_command(0xBB, 18, v, 0xBB); + return true; +} + +bool Thermostat::set_tempDiffBoiler(const char * value, const int8_t id) { + int v; + if (!Helpers::value2temperature(value, v, true)) { + return false; + } + write_command(0xBB, 19, v, 0xBB); + return true; +} + // 0xA5 - Set minimum external temperature bool Thermostat::set_minexttemp(const char * value, const int8_t id) { int mt = 0; @@ -3423,6 +3515,55 @@ void Thermostat::register_device_values() { FL_(dateTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_datetime)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &hybridStrategy_, + DeviceValueType::ENUM, + FL_(enum_hybridStrategy), + FL_(hybridStrategy), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_hybridStrategy)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &switchOverTemp_, + DeviceValueType::UINT, + nullptr, + FL_(switchOverTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_switchOverTemp)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &energyCostRatio_, + DeviceValueType::UINT, + FL_(div10), + FL_(energyCostRatio), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_energyCostRatio)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &fossileFactor_, + DeviceValueType::UINT, + FL_(div10), + FL_(fossileFactor), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_fossileFactor)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &electricFactor_, + DeviceValueType::UINT, + FL_(div10), + FL_(electricFactor), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_electricFactor)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &delayBoiler_, + DeviceValueType::UINT, + nullptr, + FL_(delayBoiler), + DeviceValueUOM::MINUTES, + MAKE_CF_CB(set_delayBoiler)); + register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, + &tempDiffBoiler_, + DeviceValueType::UINT, + nullptr, + FL_(tempDiffBoiler), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_tempDiffBoiler)); break; case EMS_DEVICE_FLAG_EASY: // Easy TC100 have no date/time, see issue #100, not sure about CT200, so leave it. @@ -3606,6 +3747,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrcontrol, DeviceValueType::ENUM, FL_(enum_j_control), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode4), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, nullptr, FL_(targetflowtemp), DeviceValueUOM::DEGREES); break; default: break; diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 4c0a42b6c..70ef91abd 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -216,6 +216,15 @@ class Thermostat : public EMSdevice { uint8_t wwDailyHeating_; uint8_t wwDailyHeatTime_; + // HybridHP + uint8_t hybridStrategy_; // cost = 2, temperature = 3, mix = 4 + uint8_t switchOverTemp_; // degrees + uint8_t energyCostRatio_; // is *10 + uint8_t fossileFactor_; // is * 10 + uint8_t electricFactor_; // is * 10 + uint8_t delayBoiler_; // minutes + uint8_t tempDiffBoiler_; // relative temperature degrees + std::vector> heating_circuits_; // each thermostat can have multiple heating circuits uint8_t zero_value_ = 0; // for fixing current room temperature to 0 for HA @@ -351,6 +360,8 @@ class Thermostat : public EMSdevice { void process_JunkersSet2(std::shared_ptr telegram); void process_EasyMonitor(std::shared_ptr telegram); void process_JunkersRemoteMonitor(std::shared_ptr telegram); + void process_JunkersHybridSettings(std::shared_ptr telegram); + void process_JunkersSetMixer(std::shared_ptr telegram); // internal helper functions bool set_mode_n(const uint8_t mode, const uint8_t hc_num); @@ -441,6 +452,14 @@ class Thermostat : public EMSdevice { bool set_preheating(const char * value, const int8_t id); bool set_mixingvalves(const char * value, const int8_t id); bool set_offtemp(const char * value, const int8_t id); + + bool set_hybridStrategy(const char * value, const int8_t id); + bool set_switchOverTemp(const char * value, const int8_t id); + bool set_energyCostRatio(const char * value, const int8_t id); + bool set_fossileFactor(const char * value, const int8_t id); + bool set_electricFactor(const char * value, const int8_t id); + bool set_delayBoiler(const char * value, const int8_t id); + bool set_tempDiffBoiler(const char * value, const int8_t id); }; } // namespace emsesp From 4009a1a25c18f1d211465e320fb1c09c7ac3ce80 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 11 Apr 2022 10:20:40 +0200 Subject: [PATCH 210/319] b12, cleanup, formatting, small fixes --- CHANGELOG_LATEST.md | 3 ++- src/devices/boiler.cpp | 26 +++++++++++++++++++------- src/devices/boiler.h | 14 +++++++------- src/devices/mixer.cpp | 9 +++++++-- src/devices/thermostat.cpp | 28 ++++++++++++++++++++-------- src/devices/thermostat.h | 30 +++++++++++++++--------------- src/emsdevice.cpp | 2 +- src/mqtt.cpp | 4 ++++ src/version.h | 2 +- 9 files changed, 76 insertions(+), 42 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 88faa8b08..bd71d324d 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -33,7 +33,8 @@ - Extend customization to select if an entity is to be shown in the WebUI or forced as read-only [#317](https://github.com/emsesp/EMS-ESP32/issues/317) - Added Moduline 400 installation parameters [PR #449 by @kwertie01](https://github.com/emsesp/EMS-ESP32/pull/449) - Read time from IVT-controller [#439](https://github.com/emsesp/EMS-ESP32/issues/439) -- Hybrid Heatpump product-id 168 [#459](https://github.com/emsesp/EMS-ESP32/issues/459) +- Hybrid Heatpump product-id 168 [#459](https://github.com/emsesp/EMS-ESP32/issues/459), thermostat settings +- Junkers ISM2 and IPM in warm water mode [#437](https://github.com/emsesp/EMS-ESP32/issues/437) ### Fixed diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 8d2a8d226..ccfa5a507 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -215,46 +215,58 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_hybridStrategy)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &switchOverTemp_, - DeviceValueType::UINT, + DeviceValueType::INT, nullptr, FL_(switchOverTemp), DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_switchOverTemp)); + MAKE_CF_CB(set_switchOverTemp), + -20, + 20); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &energyCostRatio_, DeviceValueType::UINT, FL_(div10), FL_(energyCostRatio), DeviceValueUOM::NONE, - MAKE_CF_CB(set_energyCostRatio)); + MAKE_CF_CB(set_energyCostRatio), + 0, + 19.9); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &fossileFactor_, DeviceValueType::UINT, FL_(div10), FL_(fossileFactor), DeviceValueUOM::NONE, - MAKE_CF_CB(set_fossileFactor)); + MAKE_CF_CB(set_fossileFactor), + 0, + 5); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &electricFactor_, DeviceValueType::UINT, FL_(div10), FL_(electricFactor), DeviceValueUOM::NONE, - MAKE_CF_CB(set_electricFactor)); + MAKE_CF_CB(set_electricFactor), + 0, + 5); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &delayBoiler_, DeviceValueType::UINT, nullptr, FL_(delayBoiler), DeviceValueUOM::MINUTES, - MAKE_CF_CB(set_delayBoiler)); + MAKE_CF_CB(set_delayBoiler), + 5, + 120); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &tempDiffBoiler_, DeviceValueType::UINT, nullptr, FL_(tempDiffBoiler), DeviceValueUOM::DEGREES_R, - MAKE_CF_CB(set_tempDiffBoiler)); + MAKE_CF_CB(set_tempDiffBoiler), + 1, + 99); } */ // heatpump info diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 7247f273b..d1365f1f7 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -128,7 +128,7 @@ class Boiler : public EMSdevice { uint32_t burn2WorkMin_; // burner stage 2 operating time uint32_t heatWorkMin_; // Total heat operating time uint32_t UBAuptime_; // Total UBA working hours - char lastCode_[75]; // last error code + char lastCode_[50]; // last error code char serviceCode_[4]; // 3 character status/service code uint16_t serviceCodeNumber_; // error/service code @@ -195,13 +195,13 @@ class Boiler : public EMSdevice { /* // HybridHP - uint8_t hybridStrategy_; // cost = 2, temperature = 3, mix = 4 - uint8_t switchOverTemp_; // degrees - uint8_t energyCostRatio_; // is *10 - uint8_t fossileFactor_; // is * 10 - uint8_t electricFactor_; // is * 10 + uint8_t hybridStrategy_; // cost = 2, temperature = 3, mix = 4 + int8_t switchOverTemp_; // degrees + uint8_t energyCostRatio_; // is *10 + uint8_t fossileFactor_; // is * 10 + uint8_t electricFactor_; // is * 10 uint8_t delayBoiler_; // minutes - uint8_t tempDiffBoiler_; // relative temperature degrees + uint8_t tempDiffBoiler_; // relative temperature degrees */ void process_UBAParameterWW(std::shared_ptr telegram); diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index 8a8f0e614..3db9cdfb7 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -110,6 +110,7 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(tag, &wwCurTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); register_device_value(tag, &wwCurTemp_2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); register_device_value(tag, &HydrTemp_, DeviceValueType::USHORT, FL_(div10), FL_(hydrTemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); } else { register_telegram_type(0x010C, F("IPMStatusMessage"), false, MAKE_PF_CB(process_IPMStatusMessage)); register_telegram_type(0x011E, F("IPMTempMessage"), false, MAKE_PF_CB(process_IPMTempMessage)); @@ -216,13 +217,17 @@ void Mixer::process_MMPLUSConfigMessage_WWC(std::shared_ptr tele has_update(telegram, wwMaxTemp_, 10); } -// 0x34 +// 0x34 only8 bytes long +// Mixer(0x41) -> All(0x00), UBAMonitorWW(0x34), data: 37 02 1E 02 1E 00 00 00 00 void Mixer::process_MonitorWW(std::shared_ptr telegram) { has_update(telegram, wwSelTemp_, 0); has_update(telegram, wwCurTemp_1_, 1); has_update(telegram, wwCurTemp_2_, 3); + has_bitupdate(telegram, pumpStatus_, 5, 0); // not sure thisisthe right value } -// 0x1E + +// 0x1E, only16 bit temperature +// Mixer(0x41) -> Boiler(0x08), HydrTemp(0x1E), data: 01 D8 void Mixer::process_HydrTemp(std::shared_ptr telegram) { has_update(telegram, HydrTemp_, 0); } diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 99ea0129c..61d7a776c 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -306,7 +306,7 @@ std::shared_ptr Thermostat::heating_circuit(std::sha // not found, search device-id types for remote thermostats if (telegram->dest >= 0x20 && telegram->dest <= 0x27) { - hc_num = telegram->dest - 0x20; + hc_num = telegram->dest - 0x20; } // still didn't recognize it, ignore it @@ -3524,46 +3524,58 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_hybridStrategy)); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &switchOverTemp_, - DeviceValueType::UINT, + DeviceValueType::INT, nullptr, FL_(switchOverTemp), DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_switchOverTemp)); + MAKE_CF_CB(set_switchOverTemp), + -20, + 20); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &energyCostRatio_, DeviceValueType::UINT, FL_(div10), FL_(energyCostRatio), DeviceValueUOM::NONE, - MAKE_CF_CB(set_energyCostRatio)); + MAKE_CF_CB(set_energyCostRatio), + 0, + 19.9); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &fossileFactor_, DeviceValueType::UINT, FL_(div10), FL_(fossileFactor), DeviceValueUOM::NONE, - MAKE_CF_CB(set_fossileFactor)); + MAKE_CF_CB(set_fossileFactor), + 0, + 5); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &electricFactor_, DeviceValueType::UINT, FL_(div10), FL_(electricFactor), DeviceValueUOM::NONE, - MAKE_CF_CB(set_electricFactor)); + MAKE_CF_CB(set_electricFactor), + 0, + 5); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &delayBoiler_, DeviceValueType::UINT, nullptr, FL_(delayBoiler), DeviceValueUOM::MINUTES, - MAKE_CF_CB(set_delayBoiler)); + MAKE_CF_CB(set_delayBoiler), + 5, + 120); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &tempDiffBoiler_, DeviceValueType::UINT, nullptr, FL_(tempDiffBoiler), DeviceValueUOM::DEGREES_R, - MAKE_CF_CB(set_tempDiffBoiler)); + MAKE_CF_CB(set_tempDiffBoiler), + 1, + 99); break; case EMS_DEVICE_FLAG_EASY: // Easy TC100 have no date/time, see issue #100, not sure about CT200, so leave it. diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 70ef91abd..c2faafb85 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -182,11 +182,11 @@ class Thermostat : public EMSdevice { uint8_t ibaDamping_; // damping 0-off, 0xff-on uint8_t backlight_; uint8_t heatingpid_; - int8_t brightness_; // Screen brightness 0F=dark F1=light - uint8_t preheating_; // Preheating in the clock program: (0x00 = off, 0xFF = on) - uint8_t autodst_; // Automatic change Daylight Saving time: (0x00 = off, 0xFF = on) - uint8_t offtemp_; // Set Temperature when mode is Off / 10 (e.g.: 0x0F = 7.5 degrees Celsius) - uint8_t mixingvalves_; // Number of Mixing Valves: (0x00=0, 0x01=1, 0x02=2) + int8_t brightness_; // Screen brightness 0F=dark F1=light + uint8_t preheating_; // Preheating in the clock program: (0x00 = off, 0xFF = on) + uint8_t autodst_; // Automatic change Daylight Saving time: (0x00 = off, 0xFF = on) + uint8_t offtemp_; // Set Temperature when mode is Off / 10 (e.g.: 0x0F = 7.5 degrees Celsius) + uint8_t mixingvalves_; // Number of Mixing Valves: (0x00=0, 0x01=1, 0x02=2) int8_t dampedoutdoortemp_; uint16_t tempsensor1_; @@ -217,13 +217,13 @@ class Thermostat : public EMSdevice { uint8_t wwDailyHeatTime_; // HybridHP - uint8_t hybridStrategy_; // cost = 2, temperature = 3, mix = 4 - uint8_t switchOverTemp_; // degrees - uint8_t energyCostRatio_; // is *10 - uint8_t fossileFactor_; // is * 10 - uint8_t electricFactor_; // is * 10 + uint8_t hybridStrategy_; // co2 = 1, cost = 2, temperature = 3, mix = 4 + int8_t switchOverTemp_; // degrees + uint8_t energyCostRatio_; // is *10 + uint8_t fossileFactor_; // is * 10 + uint8_t electricFactor_; // is * 10 uint8_t delayBoiler_; // minutes - uint8_t tempDiffBoiler_; // relative temperature degrees + uint8_t tempDiffBoiler_; // relative temperature degrees std::vector> heating_circuits_; // each thermostat can have multiple heating circuits @@ -309,10 +309,10 @@ class Thermostat : public EMSdevice { static constexpr uint8_t AUTO_HEATING_CIRCUIT = 0; // Installation settings - static constexpr uint8_t EMS_TYPE_IBASettings = 0xA5; // installation settings + static constexpr uint8_t EMS_TYPE_IBASettings = 0xA5; // installation settings static constexpr uint8_t EMS_TYPE_RC30Settings = 0xA7; // RC30 settings - static constexpr uint8_t EMS_TYPE_wwSettings = 0x37; // ww settings - static constexpr uint8_t EMS_TYPE_time = 0x06; // time + static constexpr uint8_t EMS_TYPE_wwSettings = 0x37; // ww settings + static constexpr uint8_t EMS_TYPE_time = 0x06; // time std::shared_ptr heating_circuit(std::shared_ptr telegram); std::shared_ptr heating_circuit(const uint8_t hc_num); @@ -451,7 +451,7 @@ class Thermostat : public EMSdevice { bool set_autodst(const char * value, const int8_t id); bool set_preheating(const char * value, const int8_t id); bool set_mixingvalves(const char * value, const int8_t id); - bool set_offtemp(const char * value, const int8_t id); + bool set_offtemp(const char * value, const int8_t id); bool set_hybridStrategy(const char * value, const int8_t id); bool set_switchOverTemp(const char * value, const int8_t id); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 625c9e497..4711ddcbf 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -561,7 +561,7 @@ void EMSdevice::publish_value(void * value_p) const { } int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; - char payload[30] = {'\0'}; + char payload[50] = {'\0'}; uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; switch (dv.type) { diff --git a/src/mqtt.cpp b/src/mqtt.cpp index abc0af963..8096285f9 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -386,6 +386,10 @@ void Mqtt::on_publish(uint16_t packetId) const { // called when MQTT settings have changed via the Web forms void Mqtt::reset_mqtt() { + if (!mqtt_enabled_) { + mqtt_messages_.clear(); + } + if (!mqttClient_) { return; } diff --git a/src/version.h b/src/version.h index b64112942..16885163f 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b11" +#define EMSESP_APP_VERSION "3.4.0b12" From 49eb0495334a346510a0bbd2fb186a684e2ddc01 Mon Sep 17 00:00:00 2001 From: kwertie01 <48419274+kwertie01@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:43:15 +0200 Subject: [PATCH 211/319] Added Moduline 400 WW settings and clock program --- src/devices/thermostat.cpp | 209 ++++++++++++++++++++++++++++++++++++- src/devices/thermostat.h | 19 +++- src/locale_DE.h | 2 + src/locale_EN.h | 2 + 4 files changed, 224 insertions(+), 8 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index c34f40c62..c4778a232 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -107,10 +107,15 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i } else if (model == EMSdevice::EMS_DEVICE_FLAG_RC30) { monitor_typeids = {0x41}; set_typeids = {0xA7}; + curve_typeids = {0x40}; + timer_typeids = {0x3F}; for (uint8_t i = 0; i < monitor_typeids.size(); i++) { register_telegram_type(monitor_typeids[i], F("RC30Monitor"), false, MAKE_PF_CB(process_RC30Monitor)); register_telegram_type(set_typeids[i], F("RC30Set"), false, MAKE_PF_CB(process_RC30Set)); + register_telegram_type(curve_typeids[i], F("RC30Temp"), false, MAKE_PF_CB(process_RC30Temp)); + register_telegram_type(timer_typeids[i], F("RC30Timer"), false, MAKE_PF_CB(process_RC30Timer)); } + register_telegram_type(EMS_TYPE_RC30wwSettings, F("RC30WWSettings"), true, MAKE_PF_CB(process_RC30wwSettings)); // EASY } else if (model == EMSdevice::EMS_DEVICE_FLAG_EASY) { @@ -788,6 +793,15 @@ void Thermostat::process_RC35wwSettings(std::shared_ptr telegram has_update(telegram, wwOneTimeKey_, 9); // 0-off, 0xFF on } +// Settings WW 0x3A - RC30 +void Thermostat::process_RC30wwSettings(std::shared_ptr telegram) { + has_update(telegram, wwMode_, 0); // 0-on, 1-off, 2-auto + has_update(telegram, wwWhenModeOff_, 1); // 0-off, 0xFF on + has_update(telegram, wwDisinfecting_, 2); // 0-off, 0xFF on + has_update(telegram, wwDisinfectDay_, 3); // 0-6 Day of week, 7 every day + has_update(telegram, wwDisinfectHour_, 4); +} + // type 0x38 (ww) and 0x39 (circ) void Thermostat::process_RC35wwTimer(std::shared_ptr telegram) { if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1)) @@ -1040,7 +1054,7 @@ void Thermostat::process_RC30Monitor(std::shared_ptr telegram) { add_ha_climate(hc); } -// type 0xA7 - for reading the mode from the RC30 thermostat (0x10) +// type 0xA7 - for reading the mode from the RC30 thermostat (0x10) and all the installation settings void Thermostat::process_RC30Set(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); if (hc == nullptr) { @@ -1060,6 +1074,87 @@ void Thermostat::process_RC30Set(std::shared_ptr telegram) { has_update(telegram, preheating_, 26); // Preheating in the clock program: (0x00 = off, 0xFF = on) } +// type 0x40 (HC1) - for reading the operating mode from the RC30 thermostat (0x10) +void Thermostat::process_RC30Temp(std::shared_ptr telegram) { + // check to see we have a valid type. heating: 1 radiator, 2 convectors, 3 floors + if (telegram->offset == 0 && telegram->message_data[0] == 0x00) { + return; + } + + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } + + has_update(telegram, hc->heatingtype, 0); // 0- off, 1-radiator, 2-convector, 3-floor + has_update(telegram, hc->controlmode, 1); // 0-outdoortemp, 1-roomtemp + has_update(telegram, hc->nighttemp, 3); // is * 2 (T1) + has_update(telegram, hc->daylowtemp, 4); // is * 2 (T2) + has_update(telegram, hc->daymidtemp, 5); // is * 2 (T3) + has_update(telegram, hc->daytemp, 6); // is * 2 (T4) + has_update(telegram, hc->holidaytemp, 7); // is * 2 + +} + +// type 0x3F (HC1) - timer setting for RC30 +void Thermostat::process_RC30Timer(std::shared_ptr telegram) { + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } + + if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1)) + || (!telegram->offset && telegram->message_length > 1 && !strlen(hc->switchtime1))) { + + char data[sizeof(hc->switchtime1)]; + uint8_t no = telegram->offset / 2; + uint8_t day = telegram->message_data[0] >> 5; + uint8_t temp = telegram->message_data[0] & 7; + uint8_t time = telegram->message_data[1]; + + std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + if (day == 7) { + snprintf(data, sizeof(data), "%02d not_set", no); + } else { + snprintf(data, sizeof(data), "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), temp); + } + strlcpy(hc->switchtime1, data, sizeof(hc->switchtime1)); + has_update(hc->switchtime1); // always publish + } + + has_update(telegram, hc->program, 84); // 0 .. 10, 0-userprogram 1, 10-userprogram 2 + has_update(telegram, hc->pause, 85); // time in hours + has_update(telegram, hc->party, 86); // time in hours + + if (telegram->message_length + telegram->offset >= 92 && telegram->offset <= 87) { + char data[sizeof(hc->vacation)]; + snprintf(data, + sizeof(data), + "%02d.%02d.%04d-%02d.%02d.%04d", + telegram->message_data[87 - telegram->offset], + telegram->message_data[88 - telegram->offset], + telegram->message_data[89 - telegram->offset] + 2000, + telegram->message_data[90 - telegram->offset], + telegram->message_data[91 - telegram->offset], + telegram->message_data[92 - telegram->offset] + 2000); + has_update(hc->vacation, data, sizeof(hc->vacation)); + } + + if (telegram->message_length + telegram->offset >= 98 && telegram->offset <= 93) { + char data[sizeof(hc->holiday)]; + snprintf(data, + sizeof(data), + "%02d.%02d.%04d-%02d.%02d.%04d", + telegram->message_data[93 - telegram->offset], + telegram->message_data[94 - telegram->offset], + telegram->message_data[95 - telegram->offset] + 2000, + telegram->message_data[96 - telegram->offset], + telegram->message_data[97 - telegram->offset], + telegram->message_data[98 - telegram->offset] + 2000); + has_update(hc->holiday, data, sizeof(hc->holiday)); + } +} + // type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4) - data from the RC35 thermostat (0x10) - 16 bytes void Thermostat::process_RC35Monitor(std::shared_ptr telegram) { // exit if the 15th byte (second from last) is 0x00, which I think is calculated flow setpoint temperature @@ -1525,6 +1620,11 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) { return false; } write_command(0x02F5, 2, set, 0x02F5); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + if (!Helpers::value2enum(value, set, FL_(enum_wwMode3))) { + return false; + } + write_command(EMS_TYPE_RC30wwSettings, 0, set, EMS_TYPE_RC30wwSettings); } else { if (!Helpers::value2enum(value, set, FL_(enum_wwMode2))) { return false; @@ -1535,6 +1635,18 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) { return true; } +//Set ww when thermostat mode is off (RC30) +bool Thermostat::set_wwwhenmodeoff(const char * value, const int8_t id) { + bool b = false; + if (!Helpers::value2bool(value, b)) { + return false; + } + + write_command(EMS_TYPE_RC30wwSettings, 1, b ? 0xFF : 0x00, EMS_TYPE_RC30wwSettings); + + return true; +} + // Set ww temperature, ems+ bool Thermostat::set_wwtemp(const char * value, const int8_t id) { int t = 0; @@ -1656,6 +1768,8 @@ bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) { if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x2F5, 5, b ? 0xFF : 0x00, 0x2F5); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30wwSettings, 2, b ? 0xFF : 0x00, EMS_TYPE_RC30wwSettings); } else { write_command(0x37, 4, b ? 0xFF : 0x00, 0x37); } @@ -1671,6 +1785,8 @@ bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) { if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x2F5, 7, set, 0x2F5); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30wwSettings, 3, set, EMS_TYPE_RC30wwSettings); } else { write_command(0x37, 5, set, 0x37); } @@ -1685,6 +1801,11 @@ bool Thermostat::set_wwDisinfectHour(const char * value, const int8_t id) { return false; } write_command(0x2F5, 6, (set + 8) / 15, 0x2F5); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + if (!Helpers::value2number(value, set, 0, 23)) { + return false; + } + write_command(EMS_TYPE_RC30wwSettings, 4, set, EMS_TYPE_RC30wwSettings); } else { if (!Helpers::value2number(value, set, 0, 23)) { return false; @@ -2247,6 +2368,8 @@ bool Thermostat::set_heatingtype(const char * value, const int8_t id) { write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(curve_typeids[hc->hc()], 0, set, curve_typeids[hc->hc()]); } else { write_command(curve_typeids[hc->hc()], 1, set, curve_typeids[hc->hc()]); return true; @@ -2270,6 +2393,11 @@ bool Thermostat::set_controlmode(const char * value, const int8_t id) { write_command(curve_typeids[hc->hc()], 0, set, curve_typeids[hc->hc()]); return true; } + } else if (model() == EMS_DEVICE_FLAG_RC30) { + if (Helpers::value2enum(value, set, FL_(enum_controlmode2))) { + write_command(curve_typeids[hc->hc()], 1, set, curve_typeids[hc->hc()]); + return true; + } } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { if (Helpers::value2enum(value, set, FL_(enum_controlmode2))) { write_command(set_typeids[hc->hc()], 33, set, set_typeids[hc->hc()]); @@ -2489,7 +2617,7 @@ bool Thermostat::set_program(const char * value, const int8_t id) { if (Helpers::value2enum(value, set, FL_(enum_progMode3))) { write_command(set_typeids[hc->hc()], 11, set + 1, set_typeids[hc->hc()]); } - } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { + } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N || model() == EMS_DEVICE_FLAG_RC30) { if (Helpers::value2enum(value, set, FL_(enum_progMode2))) { write_command(timer_typeids[hc->hc()], 84, set, timer_typeids[hc->hc()]); } @@ -2584,7 +2712,32 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co } } else if (model == EMS_DEVICE_FLAG_RC30) { - offset = EMS_OFFSET_RC30Set_temp; + + switch (mode) { + case HeatingCircuit::Mode::NIGHT: // change the night temp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_night; + break; + case HeatingCircuit::Mode::DAYLOW: // change the offset temp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_daylow; + break; + case HeatingCircuit::Mode::DAYMID: // change the offset of flowtemp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_daymid; + break; + case HeatingCircuit::Mode::DAY: // change the day temp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_day; + break; + case HeatingCircuit::Mode::HOLIDAY: // change the holiday temp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_holiday; + break; + default: + offset = EMS_OFFSET_RC30Set_temp; + break; + } } else if ((model == EMS_DEVICE_FLAG_RC300) || (model == EMS_DEVICE_FLAG_RC100)) { validate_typeid = set_typeids[hc->hc()]; @@ -3136,7 +3289,7 @@ void Thermostat::register_device_values() { DeviceValueType::ENUM, FL_(enum_ibaMainDisplay), FL_(ibaMainDisplay), - DeviceValueUOM::NONE); + DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &backlight_, DeviceValueType::BOOL, nullptr, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &brightness_, @@ -3187,6 +3340,38 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_offtemp), 5, 30); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwMode_, + DeviceValueType::ENUM, + FL_(enum_wwMode3), + FL_(wwMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwmode)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwWhenModeOff_, DeviceValueType::BOOL, nullptr, FL_(wwWhenModeOff), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwwhenmodeoff)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfecting_, + DeviceValueType::BOOL, + nullptr, + FL_(wwDisinfecting), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfect)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfectDay_, + DeviceValueType::ENUM, + FL_(enum_dayOfWeek), + FL_(wwDisinfectDay), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfectDay)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfectHour_, + DeviceValueType::UINT, + nullptr, + FL_(wwDisinfectHour), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfectHour), + 0, + 23); break; case EMS_DEVICE_FLAG_RC30_N: register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime @@ -3552,6 +3737,22 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); + register_device_value(tag, &hc->holiday, DeviceValueType::STRING, FL_(tpl_holidays), FL_(holidays), DeviceValueUOM::NONE, MAKE_CF_CB(set_holiday)); + register_device_value(tag, &hc->vacation, DeviceValueType::STRING, FL_(tpl_holidays), FL_(vacations), DeviceValueUOM::NONE, MAKE_CF_CB(set_vacation)); + register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode2), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); + register_device_value(tag, &hc->pause, DeviceValueType::UINT, nullptr, FL_(pause), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pause)); + register_device_value(tag, &hc->party, DeviceValueType::UINT, nullptr, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party)); + register_device_value( + tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime), FL_(switchtime1), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); + register_device_value( + tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); + register_device_value( + tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode2), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); + register_device_value(tag, &hc->holidaytemp, DeviceValueType::UINT, FL_(div2), FL_(holidaytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_holidaytemp)); + register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp2), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value(tag, &hc->daylowtemp, DeviceValueType::UINT, FL_(div2), FL_(daylowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daylowtemp)); + register_device_value(tag, &hc->daymidtemp, DeviceValueType::UINT, FL_(div2), FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); + register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); break; case EMS_DEVICE_FLAG_RC30_N: case EMS_DEVICE_FLAG_RC35: diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 4c0a42b6c..b72e2f97f 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -215,6 +215,7 @@ class Thermostat : public EMSdevice { char wwCircSwitchTime_[16]; uint8_t wwDailyHeating_; uint8_t wwDailyHeatTime_; + uint8_t wwWhenModeOff_; std::vector> heating_circuits_; // each thermostat can have multiple heating circuits @@ -243,6 +244,11 @@ class Thermostat : public EMSdevice { static constexpr uint8_t EMS_OFFSET_RC30StatusMessage_curr = 2; // current temp static constexpr uint8_t EMS_OFFSET_RC30Set_mode = 23; // position of thermostat mode static constexpr uint8_t EMS_OFFSET_RC30Set_temp = 28; // position of thermostat setpoint temperature + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_night = 3; // position of thermostat setpoint temperature for night time (T1) + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_daylow = 4; // position of thermostat setpoint temperature for daylow time (T2) + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_daymid = 5; // position of thermostat setpoint temperature for daymid time (T3) + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_day = 6; // position of thermostat setpoint temperature for day time (T4) + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_holiday = 7; // temp during holiday mode static constexpr uint8_t EMS_OFFSET_RC35StatusMessage_setpoint = 2; // desired temp static constexpr uint8_t EMS_OFFSET_RC35StatusMessage_curr = 3; // current temp @@ -300,10 +306,11 @@ class Thermostat : public EMSdevice { static constexpr uint8_t AUTO_HEATING_CIRCUIT = 0; // Installation settings - static constexpr uint8_t EMS_TYPE_IBASettings = 0xA5; // installation settings - static constexpr uint8_t EMS_TYPE_RC30Settings = 0xA7; // RC30 settings - static constexpr uint8_t EMS_TYPE_wwSettings = 0x37; // ww settings - static constexpr uint8_t EMS_TYPE_time = 0x06; // time + static constexpr uint8_t EMS_TYPE_IBASettings = 0xA5; // installation settings + static constexpr uint8_t EMS_TYPE_RC30Settings = 0xA7; // RC30 settings + static constexpr uint8_t EMS_TYPE_wwSettings = 0x37; // ww settings + static constexpr uint8_t EMS_TYPE_RC30wwSettings = 0x3A; // RC30 ww settings + static constexpr uint8_t EMS_TYPE_time = 0x06; // time std::shared_ptr heating_circuit(std::shared_ptr telegram); std::shared_ptr heating_circuit(const uint8_t hc_num); @@ -324,6 +331,9 @@ class Thermostat : public EMSdevice { void process_RC35Timer(std::shared_ptr telegram); void process_RC30Monitor(std::shared_ptr telegram); void process_RC30Set(std::shared_ptr telegram); + void process_RC30Temp(std::shared_ptr telegram); + void process_RC30wwSettings(std::shared_ptr telegram); + void process_RC30Timer(std::shared_ptr telegram); void process_RC20Monitor(std::shared_ptr telegram); void process_RC20Set(std::shared_ptr telegram); void process_RC20Temp(std::shared_ptr telegram); @@ -423,6 +433,7 @@ class Thermostat : public EMSdevice { bool set_wwCircSwitchTime(const char * value, const int8_t id); bool set_wwDailyHeating(const char * value, const int8_t id); bool set_wwDailyHeatTime(const char * value, const int8_t id); + bool set_wwwhenmodeoff(const char * value, const int8_t id); bool set_datetime(const char * value, const int8_t id); bool set_minexttemp(const char * value, const int8_t id); diff --git a/src/locale_DE.h b/src/locale_DE.h index 703e33a9b..ca48445b7 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -600,6 +600,7 @@ MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("Kreis 1 Extra")) MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("Kreis 2 Extra")) MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) +MAKE_PSTR_LIST(wwWhenModeOff, F("wwwhenmodeoff"), F("wenn Thermostatmodus ist aus")) // thermostat hc MAKE_PSTR_LIST(climate, F("climate")) MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("Sollwert Raumtemperatur")) @@ -613,6 +614,7 @@ MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("Tagestemperatur T3")) MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("Tagestemperatur T4")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("Heizen Temperatur")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("Nachttemperatur")) +MAKE_PSTR_LIST(nighttemp2, F("nighttemp2"), F("Nachttemperatur T1")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco Temperatur")) MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manuelle Temperatur")) MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("zwischenzeitliche Solltemperatur")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 3823a7bde..bac97b951 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -590,6 +590,7 @@ MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("circuit 1 extra")) MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra")) MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) +MAKE_PSTR_LIST(wwWhenModeOff, F("wwwhenmodeoff"), F("when thermostat mode off")) // thermostat hc MAKE_PSTR_LIST(climate, F("climate")) MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("selected room temperature")) @@ -603,6 +604,7 @@ MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("day temperature T3")) MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("day temperature T4")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature")) +MAKE_PSTR_LIST(nighttemp2, F("nighttemp2"), F("night temperature T1")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco temperature")) MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manual temperature")) MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("temporary set temperature automode")) From cffc2695dd3b0cef99aec219dd6d1170b918c405 Mon Sep 17 00:00:00 2001 From: kwertie01 <48419274+kwertie01@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:57:42 +0200 Subject: [PATCH 212/319] fix wrong offset in set_party --- src/devices/thermostat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index c4778a232..6e61b9886 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1986,7 +1986,7 @@ bool Thermostat::set_party(const char * value, const int8_t id) { } if (value == nullptr) { - read_command(timer_typeids[hc->hc()], 85, 1); + read_command(timer_typeids[hc->hc()], 86, 1); return true; } From 5882218cff61ceefe59cc35b5aed4ba7139cd1be Mon Sep 17 00:00:00 2001 From: kwertie01 <48419274+kwertie01@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:59:29 +0200 Subject: [PATCH 213/319] fix sunday in dayofweek enum --- src/locale_EN.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locale_EN.h b/src/locale_EN.h index bac97b951..819836664 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -382,7 +382,7 @@ MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x)) MAKE_PSTR_LIST(enum_j_control, F_(off), F("fb10"), F("fb100")) MAKE_PSTR_LIST(enum_wwProgMode, F("std_prog"), F_(own_prog)) -MAKE_PSTR_LIST(enum_dayOfWeek, F("mo"), F("tu"), F("we"), F("th"), F("fr"), F("sa"), F("so"), F("all")) +MAKE_PSTR_LIST(enum_dayOfWeek, F("mo"), F("tu"), F("we"), F("th"), F("fr"), F("sa"), F("su"), F("all")) MAKE_PSTR_LIST(enum_progMode, F("prog_1"), F("prog_2")) MAKE_PSTR_LIST(enum_progMode2, F("own_1"), F("family"), F("morning"), F("evening"), F("am"), F("pm"), F("midday"), F("singles"), F("seniors"), F("new"), F("own_2")) MAKE_PSTR_LIST(enum_progMode3, F("family"), F("morning"), F("evening"), F("am"), F("pm"), F("midday"), F("singles"), F("seniors")) From ec1b0b364189ac3d545f382d77a4487e2d7b88e9 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 11 Apr 2022 15:03:07 +0200 Subject: [PATCH 214/319] add IPM ww-parameters to mixer --- src/devices/mixer.cpp | 105 ++++++++++++++++++++++++++++++++++-------- src/devices/mixer.h | 12 +++-- src/locale_DE.h | 18 ++++++++ 3 files changed, 114 insertions(+), 21 deletions(-) diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index 3db9cdfb7..794fac20a 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -100,8 +100,9 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c // HT3 if (flags == EMSdevice::EMS_DEVICE_FLAG_IPM) { if (device_id >= 0x40) { // special DHW pos 10 - register_telegram_type(0x34, F("UBAMonitorWW"), false, MAKE_PF_CB(process_MonitorWW)); - register_telegram_type(0x1E, F("HydrTemp"), false, MAKE_PF_CB(process_HydrTemp)); + register_telegram_type(0x34, F("UBAMonitorWW"), false, MAKE_PF_CB(process_IPMMonitorWW)); + register_telegram_type(0x1E, F("HydrTemp"), false, MAKE_PF_CB(process_IPMHydrTemp)); + register_telegram_type(0x33, F("UBAParameterWW"), true, MAKE_PF_CB(process_IPMParameterWW)); // register_telegram_type(0x10D, F("wwNTCStatus"), false, MAKE_PF_CB(process_wwNTCStatus)); type_ = Type::WWC; hc_ = device_id - 0x40 + 1; @@ -110,7 +111,26 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(tag, &wwCurTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); register_device_value(tag, &wwCurTemp_2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); register_device_value(tag, &HydrTemp_, DeviceValueType::USHORT, FL_(div10), FL_(hydrTemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); + register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE); + register_device_value( + tag, &wwFlowTempOffset_, DeviceValueType::UINT, nullptr, FL_(wwFlowTempOffset), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwFlowTempOffset)); + register_device_value(tag, &wwHystOn_, DeviceValueType::INT, nullptr, FL_(wwHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwHystOn)); + register_device_value(tag, &wwHystOff_, DeviceValueType::INT, nullptr, FL_(wwHystOff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwHystOff)); + register_device_value(tag, + &wwDisinfectionTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwDisinfectionTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_wwDisinfectionTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwCircPump_, + DeviceValueType::BOOL, + nullptr, + FL_(wwCircPump), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwCircPump)); + register_device_value(tag, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircMode)); } else { register_telegram_type(0x010C, F("IPMStatusMessage"), false, MAKE_PF_CB(process_IPMStatusMessage)); register_telegram_type(0x011E, F("IPMTempMessage"), false, MAKE_PF_CB(process_IPMTempMessage)); @@ -217,23 +237,35 @@ void Mixer::process_MMPLUSConfigMessage_WWC(std::shared_ptr tele has_update(telegram, wwMaxTemp_, 10); } -// 0x34 only8 bytes long +// 0x34 only 8 bytes long // Mixer(0x41) -> All(0x00), UBAMonitorWW(0x34), data: 37 02 1E 02 1E 00 00 00 00 -void Mixer::process_MonitorWW(std::shared_ptr telegram) { +void Mixer::process_IPMMonitorWW(std::shared_ptr telegram) { has_update(telegram, wwSelTemp_, 0); has_update(telegram, wwCurTemp_1_, 1); has_update(telegram, wwCurTemp_2_, 3); - has_bitupdate(telegram, pumpStatus_, 5, 0); // not sure thisisthe right value + has_bitupdate(telegram, pumpStatus_, 5, 3); } +// Mixer(0x41) -> Me(0x0B), UBAParameterWW(0x33), data: 08 FF 46 FB FF 28 FF 07 46 00 FF 00 +void Mixer::process_IPMParameterWW(std::shared_ptr telegram) { + // has_update(telegram, wwActivated_, 1); // 0xFF means on + // has_update(telegram, wwSelTemp_, 2); + has_update(telegram, wwHystOn_, 3); // Hyst on (default -5) + has_update(telegram, wwHystOff_, 4); // Hyst off (default -1) + has_update(telegram, wwFlowTempOffset_, 5); // default 40 + has_update(telegram, wwCircPump_, 6); // 0xFF means on + has_update(telegram, wwCircMode_, 7); // 1=1x3min 6=6x3min 7=continuous + has_update(telegram, wwDisinfectionTemp_, 8); + // has_bitupdate(telegram, wwChargeType_, 10, 0); // 0 = charge pump, 0xff = 3-way valve +} + + // 0x1E, only16 bit temperature // Mixer(0x41) -> Boiler(0x08), HydrTemp(0x1E), data: 01 D8 -void Mixer::process_HydrTemp(std::shared_ptr telegram) { +void Mixer::process_IPMHydrTemp(std::shared_ptr telegram) { has_update(telegram, HydrTemp_, 0); } - - #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -281,7 +313,6 @@ bool Mixer::set_wwSelTemp(const char * value, const int8_t id) { return true; } - bool Mixer::set_flowSetTemp(const char * value, const int8_t id) { int v; if (!Helpers::value2number(value, v)) { @@ -390,34 +421,72 @@ bool Mixer::set_wwRequiredTemp(const char * value, const int8_t id) { } bool Mixer::set_wwDisinfectionTemp(const char * value, const int8_t id) { - uint8_t wwc = device_id() - 0x28; - float v = 0; + float v = 0; if (!Helpers::value2temperature(value, v)) { return false; } - write_command(0x313 + wwc, 9, (uint8_t)v, 0x313 + wwc); + if (flags() == EMSdevice::EMS_DEVICE_FLAG_IPM) { + write_command(0x33, 8, (uint8_t)v, 0x33); + } else { + uint8_t wwc = device_id() - 0x28; + write_command(0x313 + wwc, 9, (uint8_t)v, 0x313 + wwc); + } return true; } bool Mixer::set_wwCircPump(const char * value, const int8_t id) { - uint8_t wwc = device_id() - 0x28; - bool v = false; + bool v = false; if (!Helpers::value2bool(value, v)) { return false; } - write_command(0x33B + wwc, 0, v ? 0x01 : 0x00, 0x33B + wwc); + if (flags() == EMSdevice::EMS_DEVICE_FLAG_IPM) { + write_command(0x33, 6, v ? 0xFF : 0x00, 0x33); + } else { + uint8_t wwc = device_id() - 0x28; + write_command(0x33B + wwc, 0, v ? 0x01 : 0x00, 0x33B + wwc); + } return true; } bool Mixer::set_wwCircMode(const char * value, const int8_t id) { - uint8_t wwc = device_id() - 0x28; uint8_t n; if (!Helpers::value2enum(value, n, FL_(enum_wwCircMode))) { return false; } - write_command(0x313 + wwc, 0, n, 0x313 + wwc); + if (flags() == EMSdevice::EMS_DEVICE_FLAG_IPM) { + write_command(0x33, 7, n, 0x33); + } else { + uint8_t wwc = device_id() - 0x28; + write_command(0x313 + wwc, 0, n, 0x313 + wwc); + } return true; } +bool Mixer::set_wwFlowTempOffset(const char * value, const int8_t id) { + int n; + if (!Helpers::value2number(value, n)) { + return false; + } + write_command(0x33, 5, n, 0x33); + return true; +} + +bool Mixer::set_wwHystOn(const char * value, const int8_t id) { + int n; + if (!Helpers::value2number(value, n)) { + return false; + } + write_command(0x33, 3, n, 0x33); + return true; +} + +bool Mixer::set_wwHystOff(const char * value, const int8_t id) { + int n; + if (!Helpers::value2number(value, n)) { + return false; + } + write_command(0x33, 4, n, 0x33); + return true; +} } // namespace emsesp diff --git a/src/devices/mixer.h b/src/devices/mixer.h index 8c8cf72ea..0a2c12039 100644 --- a/src/devices/mixer.h +++ b/src/devices/mixer.h @@ -43,8 +43,9 @@ class Mixer : public EMSdevice { void process_MMSetMessage(std::shared_ptr telegram); void process_HpPoolStatus(std::shared_ptr telegram); - void process_MonitorWW(std::shared_ptr telegram); - void process_HydrTemp(std::shared_ptr telegram); + void process_IPMMonitorWW(std::shared_ptr telegram); + void process_IPMHydrTemp(std::shared_ptr telegram); + void process_IPMParameterWW(std::shared_ptr telegram); bool set_flowSetTemp(const char * value, const int8_t id); bool set_pump(const char * value, const int8_t id); @@ -60,7 +61,9 @@ class Mixer : public EMSdevice { bool set_wwCircMode(const char * value, const int8_t id); bool set_wwSelTemp(const char * value, const int8_t id); - + bool set_wwFlowTempOffset(const char * value, const int8_t id); + bool set_wwHystOn(const char * value, const int8_t id); + bool set_wwHystOff(const char * value, const int8_t id); enum class Type { NONE, @@ -100,6 +103,9 @@ class Mixer : public EMSdevice { uint16_t wwCurTemp_1_; uint16_t wwCurTemp_2_; uint16_t HydrTemp_; + int8_t wwHystOn_; // Hyst on (default -5) + int8_t wwHystOff_; // Hyst off (default -1) + uint8_t wwFlowTempOffset_; // default 40 }; } // namespace emsesp diff --git a/src/locale_DE.h b/src/locale_DE.h index 894d55274..02c25e4e3 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -221,6 +221,12 @@ MAKE_PSTR(tag_wwc1, "wwc1") MAKE_PSTR(tag_wwc2, "wwc2") MAKE_PSTR(tag_wwc3, "wwc3") MAKE_PSTR(tag_wwc4, "wwc4") +MAKE_PSTR(tag_wwc5, "wwc5") +MAKE_PSTR(tag_wwc6, "wwc6") +MAKE_PSTR(tag_wwc7, "wwc7") +MAKE_PSTR(tag_wwc8, "wwc8") +MAKE_PSTR(tag_wwc9, "wwc9") +MAKE_PSTR(tag_wwc10, "wwc10") MAKE_PSTR(tag_hs1, "hs1") MAKE_PSTR(tag_hs2, "hs2") MAKE_PSTR(tag_hs3, "hs3") @@ -520,6 +526,16 @@ MAKE_PSTR_LIST(hpTl2, F("hptl2"), F("Außenlufttemperaturfühler (TL2)")) MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("Niedrigdruckfühler (PL1)")) MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("Hochdruckfühler (PH1)")) +// hybrid heatpump +MAKE_PSTR_LIST(enum_hybridStrategy, F("co2-optimized"), F("cost-optimized"), F("outside-temp-switched"), F("co2-cost-mix")) +MAKE_PSTR_LIST(hybridStrategy, F("hybridstrategy"), F("hybrid control strategy")) +MAKE_PSTR_LIST(switchOverTemp, F("switchovertemp"), F("outside switchover temperature")) +MAKE_PSTR_LIST(energyCostRatio, F("energycostratio"), F("energy cost ratio")) +MAKE_PSTR_LIST(fossileFactor, F("fossilefactor"), F("fossile energy factor")) +MAKE_PSTR_LIST(electricFactor, F("electricfactor"), F("electric energy factor")) +MAKE_PSTR_LIST(delayBoiler, F("delayboiler"), F("delay boiler support")) +MAKE_PSTR_LIST(tempDiffBoiler, F("tempdiffboiler"), F("tempediff boiler support")) + // the following are dhw for the boiler and automatically tagged with 'ww' MAKE_PSTR_LIST(wWSelTemp, F("wwseltemp"), F("gewählte Temperatur")) MAKE_PSTR_LIST(wwSelTempLow, F("wwseltemplow"), F("selected lower temperature")) @@ -562,6 +578,7 @@ MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("Maximale Temperatur")) MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("Einmalladungstaste")) // mqtt values / commands +MAKE_PSTR_LIST(switchtime, F("switchtime"), F("program switchtime")) MAKE_PSTR_LIST(switchtime1, F("switchtime1"), F("own1 program switchtime")) MAKE_PSTR_LIST(switchtime2, F("switchtime2"), F("own2 program switchtime")) MAKE_PSTR_LIST(wwswitchtime, F("wwswitchtime"), F("program switchtime")) @@ -671,6 +688,7 @@ MAKE_PSTR_LIST(poolSetTemp, F("poolsettemp"), F("pool set temperature")) MAKE_PSTR_LIST(poolTemp, F("pooltemp"), F("pool temperature")) MAKE_PSTR_LIST(poolShuntStatus, F("poolshuntstatus"), F("pool shunt status opening/closing")) MAKE_PSTR_LIST(poolShunt, F("poolshunt"), F("pool shunt open/close (0% = pool / 100% = heat)")) +MAKE_PSTR_LIST(hydrTemp, F("hydrTemp"), F("hydraulic header temperature")) // solar MAKE_PSTR_LIST(collectorTemp, F("collectortemp"), F("Kollektortemperatur (TS1)")) From 88399094253b89ad2c09b9722b55dea23547ceda Mon Sep 17 00:00:00 2001 From: kwertie01 <48419274+kwertie01@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:43:15 +0200 Subject: [PATCH 215/319] Added Moduline 400 WW settings and clock program --- src/devices/thermostat.cpp | 207 ++++++++++++++++++++++++++++++++++++- src/devices/thermostat.h | 19 +++- src/locale_DE.h | 2 + src/locale_EN.h | 2 + 4 files changed, 223 insertions(+), 7 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 48253bb2b..05190370a 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -107,10 +107,15 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i } else if (model == EMSdevice::EMS_DEVICE_FLAG_RC30) { monitor_typeids = {0x41}; set_typeids = {0xA7}; + curve_typeids = {0x40}; + timer_typeids = {0x3F}; for (uint8_t i = 0; i < monitor_typeids.size(); i++) { register_telegram_type(monitor_typeids[i], F("RC30Monitor"), false, MAKE_PF_CB(process_RC30Monitor)); register_telegram_type(set_typeids[i], F("RC30Set"), false, MAKE_PF_CB(process_RC30Set)); + register_telegram_type(curve_typeids[i], F("RC30Temp"), false, MAKE_PF_CB(process_RC30Temp)); + register_telegram_type(timer_typeids[i], F("RC30Timer"), false, MAKE_PF_CB(process_RC30Timer)); } + register_telegram_type(EMS_TYPE_RC30wwSettings, F("RC30WWSettings"), true, MAKE_PF_CB(process_RC30wwSettings)); // EASY } else if (model == EMSdevice::EMS_DEVICE_FLAG_EASY) { @@ -788,6 +793,15 @@ void Thermostat::process_RC35wwSettings(std::shared_ptr telegram has_update(telegram, wwOneTimeKey_, 9); // 0-off, 0xFF on } +// Settings WW 0x3A - RC30 +void Thermostat::process_RC30wwSettings(std::shared_ptr telegram) { + has_update(telegram, wwMode_, 0); // 0-on, 1-off, 2-auto + has_update(telegram, wwWhenModeOff_, 1); // 0-off, 0xFF on + has_update(telegram, wwDisinfecting_, 2); // 0-off, 0xFF on + has_update(telegram, wwDisinfectDay_, 3); // 0-6 Day of week, 7 every day + has_update(telegram, wwDisinfectHour_, 4); +} + // type 0x38 (ww) and 0x39 (circ) void Thermostat::process_RC35wwTimer(std::shared_ptr telegram) { if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1)) @@ -1040,7 +1054,7 @@ void Thermostat::process_RC30Monitor(std::shared_ptr telegram) { add_ha_climate(hc); } -// type 0xA7 - for reading the mode from the RC30 thermostat (0x10) +// type 0xA7 - for reading the mode from the RC30 thermostat (0x10) and all the installation settings void Thermostat::process_RC30Set(std::shared_ptr telegram) { std::shared_ptr hc = heating_circuit(telegram); if (hc == nullptr) { @@ -1060,6 +1074,87 @@ void Thermostat::process_RC30Set(std::shared_ptr telegram) { has_update(telegram, preheating_, 26); // Preheating in the clock program: (0x00 = off, 0xFF = on) } +// type 0x40 (HC1) - for reading the operating mode from the RC30 thermostat (0x10) +void Thermostat::process_RC30Temp(std::shared_ptr telegram) { + // check to see we have a valid type. heating: 1 radiator, 2 convectors, 3 floors + if (telegram->offset == 0 && telegram->message_data[0] == 0x00) { + return; + } + + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } + + has_update(telegram, hc->heatingtype, 0); // 0- off, 1-radiator, 2-convector, 3-floor + has_update(telegram, hc->controlmode, 1); // 0-outdoortemp, 1-roomtemp + has_update(telegram, hc->nighttemp, 3); // is * 2 (T1) + has_update(telegram, hc->daylowtemp, 4); // is * 2 (T2) + has_update(telegram, hc->daymidtemp, 5); // is * 2 (T3) + has_update(telegram, hc->daytemp, 6); // is * 2 (T4) + has_update(telegram, hc->holidaytemp, 7); // is * 2 + +} + +// type 0x3F (HC1) - timer setting for RC30 +void Thermostat::process_RC30Timer(std::shared_ptr telegram) { + std::shared_ptr hc = heating_circuit(telegram); + if (hc == nullptr) { + return; + } + + if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1)) + || (!telegram->offset && telegram->message_length > 1 && !strlen(hc->switchtime1))) { + + char data[sizeof(hc->switchtime1)]; + uint8_t no = telegram->offset / 2; + uint8_t day = telegram->message_data[0] >> 5; + uint8_t temp = telegram->message_data[0] & 7; + uint8_t time = telegram->message_data[1]; + + std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + if (day == 7) { + snprintf(data, sizeof(data), "%02d not_set", no); + } else { + snprintf(data, sizeof(data), "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), temp); + } + strlcpy(hc->switchtime1, data, sizeof(hc->switchtime1)); + has_update(hc->switchtime1); // always publish + } + + has_update(telegram, hc->program, 84); // 0 .. 10, 0-userprogram 1, 10-userprogram 2 + has_update(telegram, hc->pause, 85); // time in hours + has_update(telegram, hc->party, 86); // time in hours + + if (telegram->message_length + telegram->offset >= 92 && telegram->offset <= 87) { + char data[sizeof(hc->vacation)]; + snprintf(data, + sizeof(data), + "%02d.%02d.%04d-%02d.%02d.%04d", + telegram->message_data[87 - telegram->offset], + telegram->message_data[88 - telegram->offset], + telegram->message_data[89 - telegram->offset] + 2000, + telegram->message_data[90 - telegram->offset], + telegram->message_data[91 - telegram->offset], + telegram->message_data[92 - telegram->offset] + 2000); + has_update(hc->vacation, data, sizeof(hc->vacation)); + } + + if (telegram->message_length + telegram->offset >= 98 && telegram->offset <= 93) { + char data[sizeof(hc->holiday)]; + snprintf(data, + sizeof(data), + "%02d.%02d.%04d-%02d.%02d.%04d", + telegram->message_data[93 - telegram->offset], + telegram->message_data[94 - telegram->offset], + telegram->message_data[95 - telegram->offset] + 2000, + telegram->message_data[96 - telegram->offset], + telegram->message_data[97 - telegram->offset], + telegram->message_data[98 - telegram->offset] + 2000); + has_update(hc->holiday, data, sizeof(hc->holiday)); + } +} + // type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4) - data from the RC35 thermostat (0x10) - 16 bytes void Thermostat::process_RC35Monitor(std::shared_ptr telegram) { // exit if the 15th byte (second from last) is 0x00, which I think is calculated flow setpoint temperature @@ -1509,6 +1604,11 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) { return false; } write_command(0x02F5, 2, set, 0x02F5); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + if (!Helpers::value2enum(value, set, FL_(enum_wwMode3))) { + return false; + } + write_command(EMS_TYPE_RC30wwSettings, 0, set, EMS_TYPE_RC30wwSettings); } else { if (!Helpers::value2enum(value, set, FL_(enum_wwMode2))) { return false; @@ -1519,6 +1619,18 @@ bool Thermostat::set_wwmode(const char * value, const int8_t id) { return true; } +//Set ww when thermostat mode is off (RC30) +bool Thermostat::set_wwwhenmodeoff(const char * value, const int8_t id) { + bool b = false; + if (!Helpers::value2bool(value, b)) { + return false; + } + + write_command(EMS_TYPE_RC30wwSettings, 1, b ? 0xFF : 0x00, EMS_TYPE_RC30wwSettings); + + return true; +} + // Set ww temperature, ems+ bool Thermostat::set_wwtemp(const char * value, const int8_t id) { int t = 0; @@ -1640,6 +1752,8 @@ bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) { if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x2F5, 5, b ? 0xFF : 0x00, 0x2F5); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30wwSettings, 2, b ? 0xFF : 0x00, EMS_TYPE_RC30wwSettings); } else { write_command(0x37, 4, b ? 0xFF : 0x00, 0x37); } @@ -1655,6 +1769,8 @@ bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) { if ((model() == EMS_DEVICE_FLAG_RC300) || (model() == EMS_DEVICE_FLAG_RC100)) { write_command(0x2F5, 7, set, 0x2F5); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(EMS_TYPE_RC30wwSettings, 3, set, EMS_TYPE_RC30wwSettings); } else { write_command(0x37, 5, set, 0x37); } @@ -1669,6 +1785,11 @@ bool Thermostat::set_wwDisinfectHour(const char * value, const int8_t id) { return false; } write_command(0x2F5, 6, (set + 8) / 15, 0x2F5); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + if (!Helpers::value2number(value, set, 0, 23)) { + return false; + } + write_command(EMS_TYPE_RC30wwSettings, 4, set, EMS_TYPE_RC30wwSettings); } else { if (!Helpers::value2number(value, set, 0, 23)) { return false; @@ -2226,6 +2347,8 @@ bool Thermostat::set_heatingtype(const char * value, const int8_t id) { write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { write_command(set_typeids[hc->hc()], 0, set, set_typeids[hc->hc()]); + } else if (model() == EMS_DEVICE_FLAG_RC30) { + write_command(curve_typeids[hc->hc()], 0, set, curve_typeids[hc->hc()]); } else { write_command(curve_typeids[hc->hc()], 1, set, curve_typeids[hc->hc()]); return true; @@ -2249,6 +2372,11 @@ bool Thermostat::set_controlmode(const char * value, const int8_t id) { write_command(curve_typeids[hc->hc()], 0, set, curve_typeids[hc->hc()]); return true; } + } else if (model() == EMS_DEVICE_FLAG_RC30) { + if (Helpers::value2enum(value, set, FL_(enum_controlmode2))) { + write_command(curve_typeids[hc->hc()], 1, set, curve_typeids[hc->hc()]); + return true; + } } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { if (Helpers::value2enum(value, set, FL_(enum_controlmode2))) { write_command(set_typeids[hc->hc()], 33, set, set_typeids[hc->hc()]); @@ -2468,7 +2596,7 @@ bool Thermostat::set_program(const char * value, const int8_t id) { if (Helpers::value2enum(value, set, FL_(enum_progMode3))) { write_command(set_typeids[hc->hc()], 11, set + 1, set_typeids[hc->hc()]); } - } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { + } else if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N || model() == EMS_DEVICE_FLAG_RC30) { if (Helpers::value2enum(value, set, FL_(enum_progMode2))) { write_command(timer_typeids[hc->hc()], 84, set, timer_typeids[hc->hc()]); } @@ -2563,7 +2691,32 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co } } else if (model == EMS_DEVICE_FLAG_RC30) { - offset = EMS_OFFSET_RC30Set_temp; + + switch (mode) { + case HeatingCircuit::Mode::NIGHT: // change the night temp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_night; + break; + case HeatingCircuit::Mode::DAYLOW: // change the offset temp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_daylow; + break; + case HeatingCircuit::Mode::DAYMID: // change the offset of flowtemp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_daymid; + break; + case HeatingCircuit::Mode::DAY: // change the day temp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_day; + break; + case HeatingCircuit::Mode::HOLIDAY: // change the holiday temp + set_typeid = curve_typeids[hc->hc()]; + offset = EMS_OFFSET_RC30Temp_temp_holiday; + break; + default: + offset = EMS_OFFSET_RC30Set_temp; + break; + } } else if ((model == EMS_DEVICE_FLAG_RC300) || (model == EMS_DEVICE_FLAG_RC100)) { validate_typeid = set_typeids[hc->hc()]; @@ -3174,6 +3327,38 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_offtemp), 5, 30); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwMode_, + DeviceValueType::ENUM, + FL_(enum_wwMode3), + FL_(wwMode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwmode)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwWhenModeOff_, DeviceValueType::BOOL, nullptr, FL_(wwWhenModeOff), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwwhenmodeoff)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfecting_, + DeviceValueType::BOOL, + nullptr, + FL_(wwDisinfecting), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfect)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfectDay_, + DeviceValueType::ENUM, + FL_(enum_dayOfWeek), + FL_(wwDisinfectDay), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfectDay)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwDisinfectHour_, + DeviceValueType::UINT, + nullptr, + FL_(wwDisinfectHour), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_wwDisinfectHour), + 0, + 23); break; case EMS_DEVICE_FLAG_RC30_N: register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime @@ -3539,6 +3724,22 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); + register_device_value(tag, &hc->holiday, DeviceValueType::STRING, FL_(tpl_holidays), FL_(holidays), DeviceValueUOM::NONE, MAKE_CF_CB(set_holiday)); + register_device_value(tag, &hc->vacation, DeviceValueType::STRING, FL_(tpl_holidays), FL_(vacations), DeviceValueUOM::NONE, MAKE_CF_CB(set_vacation)); + register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode2), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); + register_device_value(tag, &hc->pause, DeviceValueType::UINT, nullptr, FL_(pause), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pause)); + register_device_value(tag, &hc->party, DeviceValueType::UINT, nullptr, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party)); + register_device_value( + tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime), FL_(switchtime1), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); + register_device_value( + tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); + register_device_value( + tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode2), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); + register_device_value(tag, &hc->holidaytemp, DeviceValueType::UINT, FL_(div2), FL_(holidaytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_holidaytemp)); + register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp2), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value(tag, &hc->daylowtemp, DeviceValueType::UINT, FL_(div2), FL_(daylowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daylowtemp)); + register_device_value(tag, &hc->daymidtemp, DeviceValueType::UINT, FL_(div2), FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); + register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); break; case EMS_DEVICE_FLAG_RC30_N: case EMS_DEVICE_FLAG_RC35: diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 4c0a42b6c..b72e2f97f 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -215,6 +215,7 @@ class Thermostat : public EMSdevice { char wwCircSwitchTime_[16]; uint8_t wwDailyHeating_; uint8_t wwDailyHeatTime_; + uint8_t wwWhenModeOff_; std::vector> heating_circuits_; // each thermostat can have multiple heating circuits @@ -243,6 +244,11 @@ class Thermostat : public EMSdevice { static constexpr uint8_t EMS_OFFSET_RC30StatusMessage_curr = 2; // current temp static constexpr uint8_t EMS_OFFSET_RC30Set_mode = 23; // position of thermostat mode static constexpr uint8_t EMS_OFFSET_RC30Set_temp = 28; // position of thermostat setpoint temperature + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_night = 3; // position of thermostat setpoint temperature for night time (T1) + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_daylow = 4; // position of thermostat setpoint temperature for daylow time (T2) + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_daymid = 5; // position of thermostat setpoint temperature for daymid time (T3) + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_day = 6; // position of thermostat setpoint temperature for day time (T4) + static constexpr uint8_t EMS_OFFSET_RC30Temp_temp_holiday = 7; // temp during holiday mode static constexpr uint8_t EMS_OFFSET_RC35StatusMessage_setpoint = 2; // desired temp static constexpr uint8_t EMS_OFFSET_RC35StatusMessage_curr = 3; // current temp @@ -300,10 +306,11 @@ class Thermostat : public EMSdevice { static constexpr uint8_t AUTO_HEATING_CIRCUIT = 0; // Installation settings - static constexpr uint8_t EMS_TYPE_IBASettings = 0xA5; // installation settings - static constexpr uint8_t EMS_TYPE_RC30Settings = 0xA7; // RC30 settings - static constexpr uint8_t EMS_TYPE_wwSettings = 0x37; // ww settings - static constexpr uint8_t EMS_TYPE_time = 0x06; // time + static constexpr uint8_t EMS_TYPE_IBASettings = 0xA5; // installation settings + static constexpr uint8_t EMS_TYPE_RC30Settings = 0xA7; // RC30 settings + static constexpr uint8_t EMS_TYPE_wwSettings = 0x37; // ww settings + static constexpr uint8_t EMS_TYPE_RC30wwSettings = 0x3A; // RC30 ww settings + static constexpr uint8_t EMS_TYPE_time = 0x06; // time std::shared_ptr heating_circuit(std::shared_ptr telegram); std::shared_ptr heating_circuit(const uint8_t hc_num); @@ -324,6 +331,9 @@ class Thermostat : public EMSdevice { void process_RC35Timer(std::shared_ptr telegram); void process_RC30Monitor(std::shared_ptr telegram); void process_RC30Set(std::shared_ptr telegram); + void process_RC30Temp(std::shared_ptr telegram); + void process_RC30wwSettings(std::shared_ptr telegram); + void process_RC30Timer(std::shared_ptr telegram); void process_RC20Monitor(std::shared_ptr telegram); void process_RC20Set(std::shared_ptr telegram); void process_RC20Temp(std::shared_ptr telegram); @@ -423,6 +433,7 @@ class Thermostat : public EMSdevice { bool set_wwCircSwitchTime(const char * value, const int8_t id); bool set_wwDailyHeating(const char * value, const int8_t id); bool set_wwDailyHeatTime(const char * value, const int8_t id); + bool set_wwwhenmodeoff(const char * value, const int8_t id); bool set_datetime(const char * value, const int8_t id); bool set_minexttemp(const char * value, const int8_t id); diff --git a/src/locale_DE.h b/src/locale_DE.h index 894d55274..05e8d83f0 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -600,6 +600,7 @@ MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("Kreis 1 Extra")) MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("Kreis 2 Extra")) MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) +MAKE_PSTR_LIST(wwWhenModeOff, F("wwwhenmodeoff"), F("wenn Thermostatmodus ist aus")) // thermostat hc MAKE_PSTR_LIST(climate, F("climate")) MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("Sollwert Raumtemperatur")) @@ -613,6 +614,7 @@ MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("Tagestemperatur T3")) MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("Tagestemperatur T4")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("Heizen Temperatur")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("Nachttemperatur")) +MAKE_PSTR_LIST(nighttemp2, F("nighttemp2"), F("Nachttemperatur T1")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco Temperatur")) MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manuelle Temperatur")) MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("zwischenzeitliche Solltemperatur")) diff --git a/src/locale_EN.h b/src/locale_EN.h index c1b14c3a2..d1fdc828c 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -590,6 +590,7 @@ MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("circuit 1 extra")) MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra")) MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) +MAKE_PSTR_LIST(wwWhenModeOff, F("wwwhenmodeoff"), F("when thermostat mode off")) // thermostat hc MAKE_PSTR_LIST(climate, F("climate")) MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("selected room temperature")) @@ -603,6 +604,7 @@ MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("day temperature T3")) MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("day temperature T4")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature")) +MAKE_PSTR_LIST(nighttemp2, F("nighttemp2"), F("night temperature T1")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco temperature")) MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manual temperature")) MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("temporary set temperature automode")) From f23bf270d0f5bf0291212ad7936137421c8e9b33 Mon Sep 17 00:00:00 2001 From: kwertie01 <48419274+kwertie01@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:57:42 +0200 Subject: [PATCH 216/319] fix wrong offset in set_party --- src/devices/thermostat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 05190370a..1e624462a 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1970,7 +1970,7 @@ bool Thermostat::set_party(const char * value, const int8_t id) { } if (value == nullptr) { - read_command(timer_typeids[hc->hc()], 85, 1); + read_command(timer_typeids[hc->hc()], 86, 1); return true; } From 7bad5d10d8ca1d4305ad8350088b2870d95bd938 Mon Sep 17 00:00:00 2001 From: kwertie01 <48419274+kwertie01@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:59:29 +0200 Subject: [PATCH 217/319] fix sunday in dayofweek enum --- src/locale_EN.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locale_EN.h b/src/locale_EN.h index d1fdc828c..bc43d7857 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -382,7 +382,7 @@ MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x)) MAKE_PSTR_LIST(enum_j_control, F_(off), F("fb10"), F("fb100")) MAKE_PSTR_LIST(enum_wwProgMode, F("std_prog"), F_(own_prog)) -MAKE_PSTR_LIST(enum_dayOfWeek, F("mo"), F("tu"), F("we"), F("th"), F("fr"), F("sa"), F("so"), F("all")) +MAKE_PSTR_LIST(enum_dayOfWeek, F("mo"), F("tu"), F("we"), F("th"), F("fr"), F("sa"), F("su"), F("all")) MAKE_PSTR_LIST(enum_progMode, F("prog_1"), F("prog_2")) MAKE_PSTR_LIST(enum_progMode2, F("own_1"), F("family"), F("morning"), F("evening"), F("am"), F("pm"), F("midday"), F("singles"), F("seniors"), F("new"), F("own_2")) MAKE_PSTR_LIST(enum_progMode3, F("family"), F("morning"), F("evening"), F("am"), F("pm"), F("midday"), F("singles"), F("seniors")) From 9ed2a99f50650d12fcc645b0c78988b99e38a5de Mon Sep 17 00:00:00 2001 From: Friso <48419274+kwertie01@users.noreply.github.com> Date: Tue, 12 Apr 2022 07:00:41 +0200 Subject: [PATCH 218/319] fix duplicate functions after rebase --- src/devices/thermostat.cpp | 81 -------------------------------------- 1 file changed, 81 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index dac15dc07..1e624462a 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1155,87 +1155,6 @@ void Thermostat::process_RC30Timer(std::shared_ptr telegram) { } } -// type 0x40 (HC1) - for reading the operating mode from the RC30 thermostat (0x10) -void Thermostat::process_RC30Temp(std::shared_ptr telegram) { - // check to see we have a valid type. heating: 1 radiator, 2 convectors, 3 floors - if (telegram->offset == 0 && telegram->message_data[0] == 0x00) { - return; - } - - std::shared_ptr hc = heating_circuit(telegram); - if (hc == nullptr) { - return; - } - - has_update(telegram, hc->heatingtype, 0); // 0- off, 1-radiator, 2-convector, 3-floor - has_update(telegram, hc->controlmode, 1); // 0-outdoortemp, 1-roomtemp - has_update(telegram, hc->nighttemp, 3); // is * 2 (T1) - has_update(telegram, hc->daylowtemp, 4); // is * 2 (T2) - has_update(telegram, hc->daymidtemp, 5); // is * 2 (T3) - has_update(telegram, hc->daytemp, 6); // is * 2 (T4) - has_update(telegram, hc->holidaytemp, 7); // is * 2 - -} - -// type 0x3F (HC1) - timer setting for RC30 -void Thermostat::process_RC30Timer(std::shared_ptr telegram) { - std::shared_ptr hc = heating_circuit(telegram); - if (hc == nullptr) { - return; - } - - if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1)) - || (!telegram->offset && telegram->message_length > 1 && !strlen(hc->switchtime1))) { - - char data[sizeof(hc->switchtime1)]; - uint8_t no = telegram->offset / 2; - uint8_t day = telegram->message_data[0] >> 5; - uint8_t temp = telegram->message_data[0] & 7; - uint8_t time = telegram->message_data[1]; - - std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); - if (day == 7) { - snprintf(data, sizeof(data), "%02d not_set", no); - } else { - snprintf(data, sizeof(data), "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), temp); - } - strlcpy(hc->switchtime1, data, sizeof(hc->switchtime1)); - has_update(hc->switchtime1); // always publish - } - - has_update(telegram, hc->program, 84); // 0 .. 10, 0-userprogram 1, 10-userprogram 2 - has_update(telegram, hc->pause, 85); // time in hours - has_update(telegram, hc->party, 86); // time in hours - - if (telegram->message_length + telegram->offset >= 92 && telegram->offset <= 87) { - char data[sizeof(hc->vacation)]; - snprintf(data, - sizeof(data), - "%02d.%02d.%04d-%02d.%02d.%04d", - telegram->message_data[87 - telegram->offset], - telegram->message_data[88 - telegram->offset], - telegram->message_data[89 - telegram->offset] + 2000, - telegram->message_data[90 - telegram->offset], - telegram->message_data[91 - telegram->offset], - telegram->message_data[92 - telegram->offset] + 2000); - has_update(hc->vacation, data, sizeof(hc->vacation)); - } - - if (telegram->message_length + telegram->offset >= 98 && telegram->offset <= 93) { - char data[sizeof(hc->holiday)]; - snprintf(data, - sizeof(data), - "%02d.%02d.%04d-%02d.%02d.%04d", - telegram->message_data[93 - telegram->offset], - telegram->message_data[94 - telegram->offset], - telegram->message_data[95 - telegram->offset] + 2000, - telegram->message_data[96 - telegram->offset], - telegram->message_data[97 - telegram->offset], - telegram->message_data[98 - telegram->offset] + 2000); - has_update(hc->holiday, data, sizeof(hc->holiday)); - } -} - // type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4) - data from the RC35 thermostat (0x10) - 16 bytes void Thermostat::process_RC35Monitor(std::shared_ptr telegram) { // exit if the 15th byte (second from last) is 0x00, which I think is calculated flow setpoint temperature From 94f5d4d50322d4eb878327c8708048e037f70daa Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 12 Apr 2022 18:56:23 +0200 Subject: [PATCH 219/319] fix set_switchtime --- src/devices/thermostat.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 61d7a776c..0e28ece89 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -631,7 +631,7 @@ void Thermostat::process_RC20Timer(std::shared_ptr telegram) { char data[sizeof(hc->switchtime1)]; uint8_t no = telegram->offset / 2; uint8_t day = telegram->message_data[0] >> 5; - uint8_t temp = telegram->message_data[0] & 1; + uint8_t temp = telegram->message_data[0] & 7; uint8_t time = telegram->message_data[1]; std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); @@ -1176,14 +1176,12 @@ void Thermostat::process_RC35Timer(std::shared_ptr telegram) { char data[sizeof(hc->switchtime1)]; uint8_t no = telegram->offset / 2; uint8_t day = telegram->message_data[0] >> 5; - uint8_t on = telegram->message_data[0] & 0x07; + uint8_t on = telegram->message_data[0] & 1; uint8_t time = telegram->message_data[1]; std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); if (day == 7) { snprintf(data, sizeof(data), "%02d not_set", no); - } else if (model() == EMS_DEVICE_FLAG_RC30_N) { - snprintf(data, sizeof(data), "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on); } else { snprintf(data, sizeof(data), "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); } @@ -2470,8 +2468,8 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char data[1] = time; } - uint8_t max_on = 3; - if (model() == EMS_DEVICE_FLAG_RC35) { + uint8_t max_on = 4; + if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { max_on = 1; } if (no > 41 || time > 0x90 || (on > max_on && on != 7)) { @@ -2481,10 +2479,8 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char } if (data[0] != 0xE7) { std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); - if (model() == EMS_DEVICE_FLAG_RC35) { + if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); - } else if (model() == EMS_DEVICE_FLAG_RC30_N) { - snprintf(out, len, "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on + 1); } else if (model() == EMS_DEVICE_FLAG_RC20) { snprintf(out, len, "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on); } else { From b59ef15cae15a896ba410b607c9fe6faca61e4e0 Mon Sep 17 00:00:00 2001 From: Friso <48419274+kwertie01@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:17:22 +0200 Subject: [PATCH 220/319] fixed set_switchtemp, process_RC20Timer --- src/devices/thermostat.cpp | 12 ++++++++---- src/locale_DE.h | 3 ++- src/locale_EN.h | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 1e624462a..36c220100 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -629,7 +629,7 @@ void Thermostat::process_RC20Timer(std::shared_ptr telegram) { char data[sizeof(hc->switchtime1)]; uint8_t no = telegram->offset / 2; uint8_t day = telegram->message_data[0] >> 5; - uint8_t temp = telegram->message_data[0] & 1; + uint8_t temp = telegram->message_data[0] & 7; uint8_t time = telegram->message_data[1]; std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); @@ -2480,6 +2480,8 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char } if (strlen(value) > 13 && value[12] == 'o') { on = value[13] == 'n' ? 1 : 0; + } else if (strlen(value) == 14 && value[12] == 'T') { + on = value[13] - '0'; } else if (strlen(value) == 13) { on = value[12] - '0'; } @@ -2499,6 +2501,8 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char uint8_t max_on = 3; if ((model() == EMS_DEVICE_FLAG_RC35) || (model() == EMS_DEVICE_FLAG_RC30_N)) { max_on = 1; + } else if (model() == EMS_DEVICE_FLAG_RC30) { + max_on = 4; } if (no > 41 || time > 0x90 || (on > max_on && on != 7)) { // LOG_WARNING(F("Setting switchtime: Invalid data: %s"), value); @@ -2509,7 +2513,7 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); if ((model() == EMS_DEVICE_FLAG_RC35) || (model() == EMS_DEVICE_FLAG_RC30_N)) { snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); - } else if (model() == EMS_DEVICE_FLAG_RC20) { + } else if ((model() == EMS_DEVICE_FLAG_RC20) || (model() == EMS_DEVICE_FLAG_RC30)){ snprintf(out, len, "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on); } else { std::string son = read_flash_string(FL_(enum_switchmode)[on]); @@ -3691,7 +3695,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrdaymidtemp, DeviceValueType::UINT, FL_(div2), FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); - register_device_value(tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime), FL_(switchtime), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); + register_device_value(tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime1), FL_(switchtime), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); break; case EMS_DEVICE_FLAG_RC20_N: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); @@ -3730,7 +3734,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrpause, DeviceValueType::UINT, nullptr, FL_(pause), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pause)); register_device_value(tag, &hc->party, DeviceValueType::UINT, nullptr, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party)); register_device_value( - tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime), FL_(switchtime1), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); + tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime1), FL_(switchtime1), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); register_device_value( tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value( diff --git a/src/locale_DE.h b/src/locale_DE.h index 05e8d83f0..f7a41d1bd 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -335,6 +335,7 @@ MAKE_PSTR(smoke_temperature, "Abgastemperatur") // thermostat lists MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | dd.mm.yyyy-hh:mm:ss-dw-dst >")) MAKE_PSTR_LIST(tpl_switchtime, F("Format: < nn.d.o.hh:mm >")) +MAKE_PSTR_LIST(tpl_switchtime1, F("Format: [ not_set | day hh:mm Tn ]")) MAKE_PSTR_LIST(tpl_holidays, F("Format: < dd.mm.yyyy-dd.mm.yyyy >")) MAKE_PSTR_LIST(enum_ibaMainDisplay, F_(internal_temperature), @@ -614,7 +615,7 @@ MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("Tagestemperatur T3")) MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("Tagestemperatur T4")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("Heizen Temperatur")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("Nachttemperatur")) -MAKE_PSTR_LIST(nighttemp2, F("nighttemp2"), F("Nachttemperatur T1")) +MAKE_PSTR_LIST(nighttemp2, F("nighttemp"), F("Nachttemperatur T1")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco Temperatur")) MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manuelle Temperatur")) MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("zwischenzeitliche Solltemperatur")) diff --git a/src/locale_EN.h b/src/locale_EN.h index bc43d7857..c2ed561d4 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -335,6 +335,7 @@ MAKE_PSTR(smoke_temperature, "smoke temperature") // thermostat lists MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | dd.mm.yyyy-hh:mm:ss-dw-dst >")) MAKE_PSTR_LIST(tpl_switchtime, F("Format: [ not_set | day hh:mm on|off ]")) +MAKE_PSTR_LIST(tpl_switchtime1, F("Format: [ not_set | day hh:mm Tn ]")) MAKE_PSTR_LIST(tpl_holidays, F("format: < dd.mm.yyyy-dd.mm.yyyy >")) MAKE_PSTR_LIST(enum_ibaMainDisplay, F_(internal_temperature), @@ -604,7 +605,7 @@ MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("day temperature T3")) MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("day temperature T4")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature")) -MAKE_PSTR_LIST(nighttemp2, F("nighttemp2"), F("night temperature T1")) +MAKE_PSTR_LIST(nighttemp2, F("nighttemp"), F("night temperature T1")) MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco temperature")) MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manual temperature")) MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("temporary set temperature automode")) From 258db5c7e8d66903497160f8fc4217b5399f2685 Mon Sep 17 00:00:00 2001 From: Friso <48419274+kwertie01@users.noreply.github.com> Date: Wed, 13 Apr 2022 11:09:31 +0200 Subject: [PATCH 221/319] disable usage of T0 for RC30 in set_switchtime --- src/devices/thermostat.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 36c220100..d3b2c8bcf 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -2498,13 +2498,15 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char data[1] = time; } + uint8_t min_on = 0; uint8_t max_on = 3; if ((model() == EMS_DEVICE_FLAG_RC35) || (model() == EMS_DEVICE_FLAG_RC30_N)) { max_on = 1; } else if (model() == EMS_DEVICE_FLAG_RC30) { + min_on = 1; max_on = 4; } - if (no > 41 || time > 0x90 || (on > max_on && on != 7)) { + if (no > 41 || time > 0x90 || ((on < min_on || on > max_on) && on != 7)) { // LOG_WARNING(F("Setting switchtime: Invalid data: %s"), value); // LOG_WARNING(F("Setting switchtime: Invalid data: %02d.%1d.0x%02X.%1d"), no, day, time, on); return false; From 4cdeef212d02f0cdda9e6369870c4047733ea8a8 Mon Sep 17 00:00:00 2001 From: Friso <48419274+kwertie01@users.noreply.github.com> Date: Wed, 13 Apr 2022 11:18:28 +0200 Subject: [PATCH 222/319] fixed T1 to T4 for RC20 --- src/devices/thermostat.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index d3b2c8bcf..3c56635be 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -2498,13 +2498,11 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char data[1] = time; } - uint8_t min_on = 0; - uint8_t max_on = 3; + uint8_t min_on = 1; + uint8_t max_on = 4; if ((model() == EMS_DEVICE_FLAG_RC35) || (model() == EMS_DEVICE_FLAG_RC30_N)) { + min_on = 0; max_on = 1; - } else if (model() == EMS_DEVICE_FLAG_RC30) { - min_on = 1; - max_on = 4; } if (no > 41 || time > 0x90 || ((on < min_on || on > max_on) && on != 7)) { // LOG_WARNING(F("Setting switchtime: Invalid data: %s"), value); @@ -3696,7 +3694,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrdaylowtemp, DeviceValueType::UINT, FL_(div2), FL_(daylowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daylowtemp)); register_device_value(tag, &hc->daymidtemp, DeviceValueType::UINT, FL_(div2), FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp2), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); register_device_value(tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime1), FL_(switchtime), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); break; case EMS_DEVICE_FLAG_RC20_N: From 2a4288e11d1d57cc3ff13bb3f9f5f3c4886f8a05 Mon Sep 17 00:00:00 2001 From: Proddy Date: Thu, 14 Apr 2022 11:44:01 +0200 Subject: [PATCH 223/319] initial commit with new table code --- interface/package-lock.json | 735 +++++++++++++++--------- interface/package.json | 15 +- interface/src/project/DashboardData.tsx | 717 ++++++++++++++--------- interface/src/project/types.ts | 16 +- mock-api/server.js | 191 +++--- 5 files changed, 1020 insertions(+), 654 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 3272ddc92..eec53f3ca 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -11,10 +11,11 @@ "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.6.0", - "@mui/material": "^5.6.0", + "@mui/icons-material": "^5.6.1", + "@mui/material": "^5.6.1", + "@table-library/react-table-library": "^2.0.32", "@types/lodash": "^4.14.181", - "@types/node": "^17.0.23", + "@types/node": "^17.0.24", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -23,15 +24,15 @@ "http-proxy-middleware": "^2.0.4", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", - "notistack": "^2.0.3", + "notistack": "^2.0.4", "parse-ms": "^3.0.0", "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.4", + "react-dropzone": "^12.0.5", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", - "react-scripts": "5.0.0", + "react-scripts": "5.0.1", "sockette": "^2.0.6", "typescript": "^4.6.3" }, @@ -2855,15 +2856,15 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.75", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.75.tgz", - "integrity": "sha512-eQ8SP2ML5nJyOdSqmk26ezg/eEP1k42Z+k6uMfNbgHZc8iZwgw9iVe+6g5j/qZPKS88AtxVG8YsLLZkXT82/Bw==", + "version": "5.0.0-alpha.76", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.76.tgz", + "integrity": "sha512-Pd0l4DvjXiGRyipn/CTDlYB2XrJwhpLktVXvbvcmzL2SMDaNprSarZqBkPHIubkulmRDZEEcnFDrpKgeSJDg4A==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", - "@popperjs/core": "^2.11.4", + "@mui/utils": "^5.6.1", + "@popperjs/core": "^2.11.5", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" @@ -2876,7 +2877,7 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" }, @@ -2887,9 +2888,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.0.tgz", - "integrity": "sha512-2GDGt+/BbwM3oVkF84b9FFKQdQ9TxBJIRnTwT99vO2mimdfJaojxMRB2lkysm9tUY4HOf0yoU6O//X6GTC0Zhw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.1.tgz", + "integrity": "sha512-I1x8u+FRLOmoJpRJASMx9UG+jZrSkNLyRQmBXivQQwXu3m3iasMoaKYhhI0J18t8+FWktbkNTp63oEUHE9Gw0Q==", "dependencies": { "@babel/runtime": "^7.17.2" }, @@ -2902,7 +2903,7 @@ }, "peerDependencies": { "@mui/material": "^5.0.0", - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { @@ -2912,15 +2913,15 @@ } }, "node_modules/@mui/material": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.0.tgz", - "integrity": "sha512-yh4FoRRPTgJWjv1oIu3YuvfYGD/WOEnyGizQ9fKs+hlMjIc0rzFpyUCo++P/3BUd0/hRKcI8D8mrpJK9OiOy1g==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.1.tgz", + "integrity": "sha512-xg6pPq+1jxWupwmPpnfmsHNjrsOe2xynUQWrRfcH8WHrrr1sQulq0VF4gORq/l8DD8a/jb4s8SsC20e/e6mHKQ==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.75", - "@mui/system": "^5.6.0", + "@mui/base": "5.0.0-alpha.76", + "@mui/system": "^5.6.1", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -2939,7 +2940,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" }, @@ -2956,12 +2957,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.0.tgz", - "integrity": "sha512-62jUFaMGfW3nvq/worcOAEiY++rWd44tpWShq4o97DybWmmWvEFYlBIuHEcXrtBIK/cloaQw8jqelQIFZeiVdw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.1.tgz", + "integrity": "sha512-8lgh+tUt/3ftStfvml3dwAzhW3fe/cUFjLcBViOTnWk7UixWR79me4qehsO4NVj0THpu3d2qclrLzdD8qBAWAQ==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "prop-types": "^15.7.2" }, "engines": { @@ -2972,7 +2973,7 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { @@ -2982,9 +2983,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.0.tgz", - "integrity": "sha512-K1WPKTruJTPA49cub0HtDCBBvosPKizqgZ4RenAfWz/ldlFtM4p7e7Mt3YEnNWTOJMHvDGcEke1tCuELkVAMyA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.1.tgz", + "integrity": "sha512-jEhH6TBY8jc9S8yVncXmoTYTbATjEu44RMFXj6sIYfKr5NArVwTwRo3JexLL0t3BOAiYM4xsFLgfKEIvB9SAeQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -3012,15 +3013,15 @@ } }, "node_modules/@mui/system": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.0.tgz", - "integrity": "sha512-FoytH73hY78Dll6F0fg7AI/hnpplygbFeW0HsqBfwFWrt2PMc2YSq2ICqHzd2CZPIhzEgRHDTSI8bMTLtG9W7A==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.1.tgz", + "integrity": "sha512-Y5pDvEOK6VOY+0vgNeyDuEEO5QCinhXbZQDyLOlaGLKuAoRGLXO9pcSsjZoGkewYZitXD44EDfgBQ+BqsAfgUA==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.6.0", - "@mui/styled-engine": "^5.6.0", + "@mui/private-theming": "^5.6.1", + "@mui/styled-engine": "^5.6.1", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.7.2" @@ -3035,7 +3036,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^16.8.6 || ^17.0.0 || ^18.0.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { @@ -3064,9 +3065,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.0.tgz", - "integrity": "sha512-LbZKkCOn4243vbEVGbaKV7t6eN6kz7t95DR6AcUCRk4daH3l7CXPYkWsyzysRWdXgSzHmIyrgg4FZKzTy0dTHQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.1.tgz", + "integrity": "sha512-CPrzrkiBusCZBLWu0Sg5MJvR3fKJyK3gKecLVX012LULyqg2U64Oz04BKhfkbtBrPBbSQxM+DWW9B1c9hmV9nQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", @@ -3258,9 +3259,9 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz", - "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.2.tgz", + "integrity": "sha512-oe5WJEDaVsW8fBlGT7udrSCgOwWfoYHQOmSpnh8X+0GXpqqcRCP8k4y+Dxb0taWJDPpB+rdDUtumIiBwkY9qGA==" }, "node_modules/@sindresorhus/is": { "version": "0.14.0", @@ -3547,6 +3548,22 @@ "node": ">=6" } }, + "node_modules/@table-library/react-table-library": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-2.0.32.tgz", + "integrity": "sha512-hHxR5DkAdU+62rRukjId1XqdI1ZkWQhdmvYwJM60StrFpah0nbpk8/HG21k7mFdlwjoO7HtDgWDDReLDUbPS7Q==", + "dependencies": { + "clsx": "1.1.1", + "react-virtualized-auto-sizer": "1.0.6", + "react-window": "1.8.6", + "use-double-click": "1.0.5" + }, + "peerDependencies": { + "@emotion/react": ">= 11", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3746,9 +3763,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3908,13 +3925,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", - "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz", + "integrity": "sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg==", "dependencies": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/type-utils": "5.18.0", - "@typescript-eslint/utils": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/type-utils": "5.19.0", + "@typescript-eslint/utils": "5.19.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -3939,26 +3956,37 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "lru-cache": "^7.4.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz", - "integrity": "sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.19.0.tgz", + "integrity": "sha512-F+X/TTzmb2UXbghY1LrNLNDjMcGZMhKzXuzvu0xD+YEB77EamLM7zMOLuz2kP5807IJRDLBoAFFPYa7HT62sYg==", "dependencies": { - "@typescript-eslint/utils": "5.18.0" + "@typescript-eslint/utils": "5.19.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3972,13 +4000,13 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", - "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.19.0.tgz", + "integrity": "sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ==", "dependencies": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", "debug": "^4.3.2" }, "engines": { @@ -3998,12 +4026,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", - "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", + "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", "dependencies": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0" + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4014,11 +4042,11 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", - "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz", + "integrity": "sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q==", "dependencies": { - "@typescript-eslint/utils": "5.18.0", + "@typescript-eslint/utils": "5.19.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -4039,9 +4067,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", - "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", + "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4051,12 +4079,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", - "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", + "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", "dependencies": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -4076,29 +4104,40 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "lru-cache": "^7.4.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/@typescript-eslint/utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", - "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.19.0.tgz", + "integrity": "sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4134,11 +4173,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", - "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", + "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", "dependencies": { - "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/types": "5.19.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -4601,13 +4640,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4617,13 +4657,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6848,6 +6889,14 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -7026,9 +7075,9 @@ } }, "node_modules/eslint-config-react-app": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", - "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", "dependencies": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", @@ -7327,9 +7376,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz", - "integrity": "sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.3.1.tgz", + "integrity": "sha512-OfF4dlG/q6ck6DL3P8Z0FPdK0dU5K57gsBu7eUcaVbwYKaNzjgejnXiM9CCUevppORkvfek+9D3Uj/9ZZ8Vz8g==", "dependencies": { "@typescript-eslint/utils": "^5.13.0" }, @@ -8071,9 +8120,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", + "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -8175,6 +8224,17 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -8193,17 +8253,17 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { - "lru-cache": "^7.4.0" + "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { @@ -11695,6 +11755,11 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -12078,9 +12143,9 @@ } }, "node_modules/notistack": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz", - "integrity": "sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.4.tgz", + "integrity": "sha512-kOJmKvTG91ElMzi4aHu82BDe1liQ0zMrBp+TnWJptgowDsTbeTKbZmsRqJNIj145BmlOtZsEE9xjcrN46zVo3w==", "dependencies": { "clsx": "^1.1.0", "hoist-non-react-statics": "^3.3.0" @@ -12093,8 +12158,8 @@ "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "@mui/material": "^5.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -14192,9 +14257,9 @@ } }, "node_modules/react-dev-utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", - "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -14215,7 +14280,7 @@ "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", - "react-error-overlay": "^6.0.10", + "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", @@ -14365,9 +14430,9 @@ } }, "node_modules/react-dropzone": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz", - "integrity": "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.5.tgz", + "integrity": "sha512-zUjZigD0VJ91CSm9T1h7ErxFReBLaa9sjS2dUL0+inb0RROZpSJTNDHPY1rrBES5V2NXhF8v0kghmaHc81BMFg==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", @@ -14381,9 +14446,9 @@ } }, "node_modules/react-error-overlay": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", - "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "node_modules/react-icons": { "version": "4.3.1", @@ -14431,9 +14496,9 @@ } }, "node_modules/react-scripts": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", - "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", "dependencies": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -14451,7 +14516,7 @@ "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", + "eslint-config-react-app": "^7.0.1", "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "fs-extra": "^10.0.0", @@ -14468,7 +14533,7 @@ "postcss-preset-env": "^7.0.1", "prompts": "^2.4.2", "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", + "react-dev-utils": "^12.0.1", "react-refresh": "^0.11.0", "resolve": "^1.20.0", "resolve-url-loader": "^4.0.0", @@ -14531,6 +14596,34 @@ "react-dom": ">=16.6.0" } }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", + "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0" + } + }, + "node_modules/react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -16583,6 +16676,19 @@ "node": ">=4" } }, + "node_modules/use-double-click": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/use-double-click/-/use-double-click-1.0.5.tgz", + "integrity": "sha512-71LUca6NtzpzHYlcfM/dOdmwvmvpMbzeIVQpN87w+DctpLiMCXtZpsN8FNWPgHpPBtNhvucPUHIDh5al8D8C7w==", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -17541,6 +17647,11 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", @@ -19525,38 +19636,38 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.75", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.75.tgz", - "integrity": "sha512-eQ8SP2ML5nJyOdSqmk26ezg/eEP1k42Z+k6uMfNbgHZc8iZwgw9iVe+6g5j/qZPKS88AtxVG8YsLLZkXT82/Bw==", + "version": "5.0.0-alpha.76", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.76.tgz", + "integrity": "sha512-Pd0l4DvjXiGRyipn/CTDlYB2XrJwhpLktVXvbvcmzL2SMDaNprSarZqBkPHIubkulmRDZEEcnFDrpKgeSJDg4A==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", - "@popperjs/core": "^2.11.4", + "@mui/utils": "^5.6.1", + "@popperjs/core": "^2.11.5", "clsx": "^1.1.1", "prop-types": "^15.7.2", "react-is": "^17.0.2" } }, "@mui/icons-material": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.0.tgz", - "integrity": "sha512-2GDGt+/BbwM3oVkF84b9FFKQdQ9TxBJIRnTwT99vO2mimdfJaojxMRB2lkysm9tUY4HOf0yoU6O//X6GTC0Zhw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.1.tgz", + "integrity": "sha512-I1x8u+FRLOmoJpRJASMx9UG+jZrSkNLyRQmBXivQQwXu3m3iasMoaKYhhI0J18t8+FWktbkNTp63oEUHE9Gw0Q==", "requires": { "@babel/runtime": "^7.17.2" } }, "@mui/material": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.0.tgz", - "integrity": "sha512-yh4FoRRPTgJWjv1oIu3YuvfYGD/WOEnyGizQ9fKs+hlMjIc0rzFpyUCo++P/3BUd0/hRKcI8D8mrpJK9OiOy1g==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.1.tgz", + "integrity": "sha512-xg6pPq+1jxWupwmPpnfmsHNjrsOe2xynUQWrRfcH8WHrrr1sQulq0VF4gORq/l8DD8a/jb4s8SsC20e/e6mHKQ==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.75", - "@mui/system": "^5.6.0", + "@mui/base": "5.0.0-alpha.76", + "@mui/system": "^5.6.1", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -19567,19 +19678,19 @@ } }, "@mui/private-theming": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.0.tgz", - "integrity": "sha512-62jUFaMGfW3nvq/worcOAEiY++rWd44tpWShq4o97DybWmmWvEFYlBIuHEcXrtBIK/cloaQw8jqelQIFZeiVdw==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.1.tgz", + "integrity": "sha512-8lgh+tUt/3ftStfvml3dwAzhW3fe/cUFjLcBViOTnWk7UixWR79me4qehsO4NVj0THpu3d2qclrLzdD8qBAWAQ==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "prop-types": "^15.7.2" } }, "@mui/styled-engine": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.0.tgz", - "integrity": "sha512-K1WPKTruJTPA49cub0HtDCBBvosPKizqgZ4RenAfWz/ldlFtM4p7e7Mt3YEnNWTOJMHvDGcEke1tCuELkVAMyA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.1.tgz", + "integrity": "sha512-jEhH6TBY8jc9S8yVncXmoTYTbATjEu44RMFXj6sIYfKr5NArVwTwRo3JexLL0t3BOAiYM4xsFLgfKEIvB9SAeQ==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -19587,15 +19698,15 @@ } }, "@mui/system": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.0.tgz", - "integrity": "sha512-FoytH73hY78Dll6F0fg7AI/hnpplygbFeW0HsqBfwFWrt2PMc2YSq2ICqHzd2CZPIhzEgRHDTSI8bMTLtG9W7A==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.1.tgz", + "integrity": "sha512-Y5pDvEOK6VOY+0vgNeyDuEEO5QCinhXbZQDyLOlaGLKuAoRGLXO9pcSsjZoGkewYZitXD44EDfgBQ+BqsAfgUA==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.6.0", - "@mui/styled-engine": "^5.6.0", + "@mui/private-theming": "^5.6.1", + "@mui/styled-engine": "^5.6.1", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.0", + "@mui/utils": "^5.6.1", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.7.2" @@ -19608,9 +19719,9 @@ "requires": {} }, "@mui/utils": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.0.tgz", - "integrity": "sha512-LbZKkCOn4243vbEVGbaKV7t6eN6kz7t95DR6AcUCRk4daH3l7CXPYkWsyzysRWdXgSzHmIyrgg4FZKzTy0dTHQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.1.tgz", + "integrity": "sha512-CPrzrkiBusCZBLWu0Sg5MJvR3fKJyK3gKecLVX012LULyqg2U64Oz04BKhfkbtBrPBbSQxM+DWW9B1c9hmV9nQ==", "requires": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.4", @@ -19719,9 +19830,9 @@ } }, "@rushstack/eslint-patch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz", - "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.2.tgz", + "integrity": "sha512-oe5WJEDaVsW8fBlGT7udrSCgOwWfoYHQOmSpnh8X+0GXpqqcRCP8k4y+Dxb0taWJDPpB+rdDUtumIiBwkY9qGA==" }, "@sindresorhus/is": { "version": "0.14.0", @@ -19902,6 +20013,17 @@ "defer-to-connect": "^1.0.1" } }, + "@table-library/react-table-library": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-2.0.32.tgz", + "integrity": "sha512-hHxR5DkAdU+62rRukjId1XqdI1ZkWQhdmvYwJM60StrFpah0nbpk8/HG21k7mFdlwjoO7HtDgWDDReLDUbPS7Q==", + "requires": { + "clsx": "1.1.1", + "react-virtualized-auto-sizer": "1.0.6", + "react-window": "1.8.6", + "use-double-click": "1.0.5" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -20095,9 +20217,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" }, "@types/parse-json": { "version": "4.0.0", @@ -20257,13 +20379,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", - "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz", + "integrity": "sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg==", "requires": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/type-utils": "5.18.0", - "@typescript-eslint/utils": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/type-utils": "5.19.0", + "@typescript-eslint/utils": "5.19.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -20272,66 +20394,74 @@ "tsutils": "^3.21.0" }, "dependencies": { - "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "lru-cache": "^7.4.0" + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" } } } }, "@typescript-eslint/experimental-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.18.0.tgz", - "integrity": "sha512-hypiw5N0aM2aH91/uMmG7RpyUH3PN/iOhilMwkMFZIbm/Bn/G3ZnbaYdSoAN4PG/XHQjdhBYLi0ZoRZsRYT4hA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.19.0.tgz", + "integrity": "sha512-F+X/TTzmb2UXbghY1LrNLNDjMcGZMhKzXuzvu0xD+YEB77EamLM7zMOLuz2kP5807IJRDLBoAFFPYa7HT62sYg==", "requires": { - "@typescript-eslint/utils": "5.18.0" + "@typescript-eslint/utils": "5.19.0" } }, "@typescript-eslint/parser": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", - "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.19.0.tgz", + "integrity": "sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ==", "requires": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", - "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", + "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", "requires": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0" + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0" } }, "@typescript-eslint/type-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", - "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz", + "integrity": "sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q==", "requires": { - "@typescript-eslint/utils": "5.18.0", + "@typescript-eslint/utils": "5.19.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", - "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==" + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", + "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==" }, "@typescript-eslint/typescript-estree": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", - "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", + "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", "requires": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -20339,25 +20469,33 @@ "tsutils": "^3.21.0" }, "dependencies": { - "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "lru-cache": "^7.4.0" + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" } } } }, "@typescript-eslint/utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", - "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.19.0.tgz", + "integrity": "sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -20379,11 +20517,11 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", - "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", + "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", "requires": { - "@typescript-eslint/types": "5.18.0", + "@typescript-eslint/types": "5.19.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -20757,23 +20895,25 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "asap": { @@ -22420,6 +22560,14 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -22664,9 +22812,9 @@ } }, "eslint-config-react-app": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz", - "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", "requires": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", @@ -22891,9 +23039,9 @@ "requires": {} }, "eslint-plugin-testing-library": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.2.1.tgz", - "integrity": "sha512-88qJv6uzYALtiYJDzhelP3ov0Px/GLgnu+UekjjDxL2nMyvgdTyboKqcDBsvFPmAeizlCoSWOjeBN4DxO0BxaA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.3.1.tgz", + "integrity": "sha512-OfF4dlG/q6ck6DL3P8Z0FPdK0dU5K57gsBu7eUcaVbwYKaNzjgejnXiM9CCUevppORkvfek+9D3Uj/9ZZ8Vz8g==", "requires": { "@typescript-eslint/utils": "^5.13.0" } @@ -23302,9 +23450,9 @@ "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", + "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -23367,6 +23515,14 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -23378,11 +23534,11 @@ } }, "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { - "lru-cache": "^7.4.0" + "lru-cache": "^6.0.0" } }, "supports-color": { @@ -25913,6 +26069,11 @@ "fs-monkey": "1.0.3" } }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -26192,9 +26353,9 @@ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "notistack": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz", - "integrity": "sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.4.tgz", + "integrity": "sha512-kOJmKvTG91ElMzi4aHu82BDe1liQ0zMrBp+TnWJptgowDsTbeTKbZmsRqJNIj145BmlOtZsEE9xjcrN46zVo3w==", "requires": { "clsx": "^1.1.0", "hoist-non-react-statics": "^3.3.0" @@ -27566,9 +27727,9 @@ } }, "react-dev-utils": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", - "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "requires": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -27589,7 +27750,7 @@ "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", - "react-error-overlay": "^6.0.10", + "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", @@ -27693,9 +27854,9 @@ } }, "react-dropzone": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz", - "integrity": "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.5.tgz", + "integrity": "sha512-zUjZigD0VJ91CSm9T1h7ErxFReBLaa9sjS2dUL0+inb0RROZpSJTNDHPY1rrBES5V2NXhF8v0kghmaHc81BMFg==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.4.0", @@ -27703,9 +27864,9 @@ } }, "react-error-overlay": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", - "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, "react-icons": { "version": "4.3.1", @@ -27741,9 +27902,9 @@ } }, "react-scripts": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz", - "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", "requires": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -27761,7 +27922,7 @@ "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", + "eslint-config-react-app": "^7.0.1", "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "fs-extra": "^10.0.0", @@ -27779,7 +27940,7 @@ "postcss-preset-env": "^7.0.1", "prompts": "^2.4.2", "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", + "react-dev-utils": "^12.0.1", "react-refresh": "^0.11.0", "resolve": "^1.20.0", "resolve-url-loader": "^4.0.0", @@ -27816,6 +27977,21 @@ "prop-types": "^15.6.2" } }, + "react-virtualized-auto-sizer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", + "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", + "requires": {} + }, + "react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -29346,6 +29522,12 @@ "prepend-http": "^2.0.0" } }, + "use-double-click": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/use-double-click/-/use-double-click-1.0.5.tgz", + "integrity": "sha512-71LUca6NtzpzHYlcfM/dOdmwvmvpMbzeIVQpN87w+DctpLiMCXtZpsN8FNWPgHpPBtNhvucPUHIDh5al8D8C7w==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -30103,6 +30285,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", diff --git a/interface/package.json b/interface/package.json index c3688025f..5001fd899 100644 --- a/interface/package.json +++ b/interface/package.json @@ -7,10 +7,11 @@ "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.6.0", - "@mui/material": "^5.6.0", + "@mui/icons-material": "^5.6.1", + "@mui/material": "^5.6.1", + "@table-library/react-table-library": "^2.0.32", "@types/lodash": "^4.14.181", - "@types/node": "^17.0.23", + "@types/node": "^17.0.24", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -19,15 +20,15 @@ "http-proxy-middleware": "^2.0.4", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", - "notistack": "^2.0.3", + "notistack": "^2.0.4", "parse-ms": "^3.0.0", "react": "^17.0.2", - "react-dom": "^17.0.2", "react-app-rewired": "^2.2.1", - "react-dropzone": "^12.0.4", + "react-dom": "^17.0.2", + "react-dropzone": "^12.0.5", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", - "react-scripts": "5.0.0", + "react-scripts": "5.0.1", "sockette": "^2.0.6", "typescript": "^4.6.3" }, diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 21cf4072c..3c64dc673 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -1,11 +1,7 @@ -import { FC, useState, useContext, useEffect } from 'react'; +import { FC, useState, useContext, useCallback, useEffect } from 'react'; import { Button, - Table, - TableBody, - TableHead, - TableRow, Typography, Box, Dialog, @@ -20,15 +16,18 @@ import { ListItem, ListItemText, Grid, - useMediaQuery + FormControlLabel, + Checkbox } from '@mui/material'; -import TableCell, { tableCellClasses } from '@mui/material/TableCell'; - -import { styled } from '@mui/material/styles'; - import { useSnackbar } from 'notistack'; +import { Table } from '@table-library/react-table-library/table'; +import { useTheme } from '@table-library/react-table-library/theme'; +import { useSort, HeaderCellSort } from '@table-library/react-table-library/sort'; +import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; +import { useRowSelect } from '@table-library/react-table-library/select'; + import RefreshIcon from '@mui/icons-material/Refresh'; import EditIcon from '@mui/icons-material/Edit'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; @@ -37,10 +36,11 @@ import CancelIcon from '@mui/icons-material/Cancel'; import SendIcon from '@mui/icons-material/TrendingFlat'; import SaveIcon from '@mui/icons-material/Save'; import RemoveIcon from '@mui/icons-material/RemoveCircleOutline'; -import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder'; import PlayArrowIcon from '@mui/icons-material/PlayArrow'; import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; +import KeyboardArrowUpOutlinedIcon from '@mui/icons-material/KeyboardArrowUpOutlined'; +import KeyboardArrowDownOutlinedIcon from '@mui/icons-material/KeyboardArrowDownOutlined'; import DeviceIcon from './DeviceIcon'; @@ -54,10 +54,11 @@ import { ButtonRow, FormLoader, ValidatedTextField, SectionContent, MessageBox } import * as EMSESP from './api'; -import { numberValue, updateValue, extractErrorMessage, useRest } from '../utils'; +import { numberValue, updateValue, extractErrorMessage } from '../utils'; import { SensorData, + Device, CoreData, DeviceData, DeviceValue, @@ -70,81 +71,255 @@ import { DeviceEntityMask } from './types'; -const StyledTableCell = styled(TableCell)(({ theme }) => ({ - [`&.${tableCellClasses.head}`]: { - backgroundColor: theme.palette.common.black, - color: theme.palette.common.white, - fontSize: 14 - } -})); - -const StyledTableRow = styled(TableRow)(({ theme }) => ({ - '&:nth-of-type(odd)': { - backgroundColor: theme.palette.action.hover - }, - '&:hover': { - backgroundColor: theme.palette.info.light - } -})); - const DashboardData: FC = () => { - const { loadData, data, errorMessage } = useRest({ read: EMSESP.readCoreData }); - const { me } = useContext(AuthenticatedContext); const { enqueueSnackbar } = useSnackbar(); - const [deviceData, setDeviceData] = useState(); - const [sensorData, setSensorData] = useState(); + const [errorMessage, setErrorMessage] = useState(); + const [coreData, setCoreData] = useState({ devices: [], active_sensors: 0, analog_enabled: false }); + const [deviceData, setDeviceData] = useState({ label: '', data: [] }); + const [sensorData, setSensorData] = useState({ sensors: [], analogs: [] }); const [deviceValue, setDeviceValue] = useState(); const [sensor, setSensor] = useState(); const [analog, setAnalog] = useState(); - const [selectedDevice, setSelectedDevice] = useState(); const [deviceDialog, setDeviceDialog] = useState(-1); + const [onlyFav, setOnlyFav] = useState(false); - const desktopWindow = useMediaQuery('(min-width:600px)'); + const device_theme = useTheme({ + BaseRow: ` + font-size: 14px; + color: white; + height: 46px; + &:focus { + z-index: 2; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + } + `, + HeaderRow: ` + background-color: black; + font-size: 14px; + border-bottom: 1px solid #e0e0e0; + `, + Row: ` + background-color: #1e1e1e; + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + z-index: 2; + color: white; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + }, + &.tr.tr-body.row-select.row-select-single-selected, &.tr.tr-body.row-select.row-select-selected { + background-color: #3d4752; + color: white; + font-weight: normal; + z-index: 2; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + &:nth-of-type(1) { + min-width: 42px; + width: 42px; + div { + width: 100%; + } + } + &:nth-of-type(2) { + min-width: 120px; + width: 120px; + } + &:nth-of-type(3) { + flex: 1; + } + &:nth-of-type(4) { + text-align: center; + max-width: 100px; + } + &:last-of-type { + text-align: right; + min-width: 64px; + } + ` + }); - const refreshAllData = () => { - if (analog || sensor || deviceValue) { - return; + const data_theme = useTheme({ + BaseRow: ` + font-size: 14px; + color: white; + height: 32px; + `, + HeaderRow: ` + background-color: black; + font-size: 14px; + border-bottom: 1px solid #e0e0e0; + `, + Row: ` + &:nth-of-type(odd) { + background-color: #303030; + } + &:nth-of-type(even) { + background-color: #1e1e1e; + } + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + z-index: 2; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + color: white; + cursor: 'pointer', + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + &:last-of-type { + text-align: right; + min-width: 64px; + } + ` + }); + + const analog_sort = useSort( + { nodes: sensorData.analogs }, + { + state: { + sortKey: 'GPIO', + reverse: false + } + }, + { + sortIcon: { + iconDefault: null, + iconUp: , + iconDown: + }, + sortFns: { + GPIO: (array) => array.sort((a, b) => a.i - b.i), + NAME: (array) => array.sort((a, b) => a.n.localeCompare(b.n)), + TYPE: (array) => array.sort((a, b) => a.t - b.t) + } } - loadData(); - if (sensorData) { - fetchSensorData(); - } else if (selectedDevice) { - fetchDeviceData(selectedDevice); + ); + + const sensor_sort = useSort( + { nodes: sensorData.sensors }, + { + state: { + sortKey: 'NAME', + reverse: false + } + }, + { + sortIcon: { + iconDefault: null, + iconUp: , + iconDown: + }, + sortFns: { + NAME: (array) => array.sort((a, b) => a.id.localeCompare(b.id)), + TEMPERATURE: (array) => array.sort((a, b) => a.id.localeCompare(b.id)) + } } - }; + ); + + const dv_sort = useSort( + { nodes: deviceData.data }, + {}, + { + sortIcon: { + margin: '0px', + iconDefault: null, + iconUp: , + iconDown: + }, + sortFns: { + NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))) + } + } + ); + + const device_select = useRowSelect( + { nodes: coreData.devices }, + { + onChange: onSelectChange + } + ); + + function onSelectChange(action: any, state: any) { + if (action.type === 'ADD_BY_ID_EXCLUSIVELY') { + refreshData(); + } else { + setSensorData({ sensors: [], analogs: [] }); + } + } const refreshData = () => { - if (analog || sensor || deviceValue) { + const selectedDevice = device_select.state.id; + if (selectedDevice === 'sensor') { + fetchSensorData(); return; } - if (sensorData) { - fetchSensorData(); - } else if (selectedDevice) { + + setSensorData({ sensors: [], analogs: [] }); + if (selectedDevice) { fetchDeviceData(selectedDevice); } else { - loadData(); + fetchCoreData(); } }; + const fetchCoreData = useCallback(async () => { + try { + setCoreData((await EMSESP.readCoreData()).data); + } catch (error: any) { + setErrorMessage(extractErrorMessage(error, 'Failed to fetch core data')); + } + }, []); + + useEffect(() => { + fetchCoreData(); + }, [fetchCoreData]); + useEffect(() => { const timer = setInterval(() => refreshData(), 60000); return () => { clearInterval(timer); }; // eslint-disable-next-line - }, [analog, sensor, deviceValue, sensorData, selectedDevice]); + }, [analog, sensor, deviceValue, sensorData]); - const fetchDeviceData = async (unique_id: number) => { + const fetchDeviceData = async (id: string) => { + const unique_id = parseInt(id); try { setDeviceData((await EMSESP.readDeviceData({ id: unique_id })).data); } catch (error: any) { - enqueueSnackbar(extractErrorMessage(error, 'Problem fetching device data'), { variant: 'error' }); - } finally { - setSelectedDevice(unique_id); - setSensorData(undefined); + setErrorMessage(extractErrorMessage(error, 'Problem fetching device data')); } }; @@ -152,9 +327,7 @@ const DashboardData: FC = () => { try { setSensorData((await EMSESP.readSensorData()).data); } catch (error: any) { - enqueueSnackbar(extractErrorMessage(error, 'Problem fetching sensor data'), { variant: 'error' }); - } finally { - setSelectedDevice(undefined); + setErrorMessage(extractErrorMessage(error, 'Problem fetching sensor data')); } }; @@ -192,10 +365,10 @@ const DashboardData: FC = () => { } const sendDeviceValue = async () => { - if (selectedDevice && deviceValue) { + if (deviceValue) { try { const response = await EMSESP.writeValue({ - id: selectedDevice, + id: Number(device_select.state.id), devicevalue: deviceValue }); if (response.status === 204) { @@ -207,11 +380,10 @@ const DashboardData: FC = () => { } setDeviceValue(undefined); } catch (error: any) { - enqueueSnackbar(extractErrorMessage(error, 'Problem writing value'), { variant: 'error' }); + setErrorMessage(extractErrorMessage(error, 'Problem writing value')); } finally { + refreshData(); setDeviceValue(undefined); - fetchDeviceData(selectedDevice); - loadData(); } } }; @@ -225,7 +397,7 @@ const DashboardData: FC = () => { {deviceValue.l && ( { {!deviceValue.l && ( { }; const addAnalogSensor = () => { - setAnalog({ i: 0, n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); + setAnalog({ id: '0', n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); }; const sendSensor = async () => { if (sensor) { try { const response = await EMSESP.writeSensor({ - id_str: sensor.is, + id_str: sensor.id, name: sensor.n, offset: sensor.o }); @@ -299,7 +471,7 @@ const DashboardData: FC = () => { } setSensor(undefined); } catch (error: any) { - enqueueSnackbar(extractErrorMessage(error, 'Problem updating sensor'), { variant: 'error' }); + setErrorMessage(extractErrorMessage(error, 'Problem updating sensor')); } finally { setSensor(undefined); fetchSensorData(); @@ -314,7 +486,7 @@ const DashboardData: FC = () => { Edit Temperature Sensor - Sensor ID {sensor.is} + Sensor ID {sensor.id} @@ -369,32 +541,32 @@ const DashboardData: FC = () => { }; const renderDeviceDialog = () => { - if (data && data.devices.length > 0 && deviceDialog !== -1) { + if (coreData && coreData.devices.length > 0 && deviceDialog !== -1) { return ( setDeviceDialog(-1)}> Device Details - + - + - + - + - + @@ -408,104 +580,86 @@ const DashboardData: FC = () => { } }; - const toggleDeviceData = (index: number) => { - loadData(); - if (selectedDevice === index) { - setSelectedDevice(undefined); - } else { - fetchDeviceData(index); - } - }; - - const toggleSensorData = () => { - loadData(); - if (sensorData) { - setSensorData(undefined); - } else { - fetchSensorData(); - } - }; - const renderCoreData = () => { - if (!data) { - return ; + if (!coreData) { + return ; } + console.log('** Rendering main data'); + return ( - {data.devices.length === 0 && } -
- - - - TYPE - - {desktopWindow && DESCRIPTION} - ENTITIES - - - - - {data.devices.map((device, index) => ( - device.e && toggleDeviceData(device.i)} - > - - - - {device.t} - {desktopWindow && {device.n}} - {device.e} - - setDeviceDialog(index)}> - - - - - ))} - {(data.active_sensors > 0 || data.analog_enabled) && ( - toggleSensorData()}> - - - - Sensors - {desktopWindow && Attached EMS-ESP Sensors} - {data.active_sensors} - - addAnalogSensor()} disabled={!data.analog_enabled}> - - - - - )} - + {coreData.devices.length === 0 && } + +
+ {(tableList: any) => ( + <> +
+ + + TYPE + DESCRIPTION + ENTITIES + + +
+ + {tableList.map((device: Device, index: number) => ( + + + + + {device.t} + {device.n} + {device.e} + + setDeviceDialog(index)}> + + + + + ))} + {(coreData.active_sensors > 0 || coreData.analog_enabled) && ( + + + + + Sensors + Attached EMS-ESP Sensors + {coreData.active_sensors} + + addAnalogSensor()}> + + + + + )} + + + )}
); }; const renderDeviceData = () => { - if (data?.devices.length === 0 || !deviceData || !selectedDevice) { + if (!device_select.state.id || device_select.state.id === 'sensor') { return; } - const hasMask = (entityName: string, mask: number) => (parseInt(entityName.slice(0, 2), 16) & mask) === mask; + const hasMask = (id: string, mask: number) => (parseInt(id.slice(0, 2), 16) & mask) === mask; const sendCommand = (dv: DeviceValue) => { - if (dv.c && me.admin && !hasMask(dv.n, DeviceEntityMask.DV_READONLY)) { + if (dv.c && me.admin && !hasMask(dv.id, DeviceEntityMask.DV_READONLY)) { setDeviceValue(dv); } }; const renderNameCell = (dv: DeviceValue) => ( <> - {dv.n.slice(2)}  - {hasMask(dv.n, DeviceEntityMask.DV_FAVORITE) && } - {hasMask(dv.n, DeviceEntityMask.DV_READONLY) && } - {hasMask(dv.n, DeviceEntityMask.DV_API_MQTT_EXCLUDE) && ( + {dv.id.slice(2)}  + {hasMask(dv.id, DeviceEntityMask.DV_READONLY) && } + {hasMask(dv.id, DeviceEntityMask.DV_API_MQTT_EXCLUDE) && ( )} @@ -516,47 +670,67 @@ const DashboardData: FC = () => { {deviceData.label} - - - - - ENTITY NAME - VALUE - - - - {deviceData.data.map((dv, i) => ( - sendCommand(dv)}> - - {dv.c && me.admin && !hasMask(dv.n, DeviceEntityMask.DV_READONLY) && ( - - - - )} - - - {renderNameCell(dv)} - - - {isCmdOnly(dv) ? : formatValue(dv.v, dv.u)} - - - ))} - + + setOnlyFav(!onlyFav)} />} + label="show favorites only" + /> + +
hasMask(dv.id, DeviceEntityMask.DV_FAVORITE)) + : deviceData.data + }} + theme={data_theme} + sort={dv_sort} + > + {(tableList: any) => ( + <> +
+ + + ENTITY NAME + + VALUE + + +
+ + {tableList.map((dv: DeviceValue) => ( + sendCommand(dv)}> + {renderNameCell(dv)} + {formatValue(dv.v, dv.u)} + + {dv.c && me.admin && !hasMask(dv.id, DeviceEntityMask.DV_READONLY) && ( + sendCommand(dv)}> + {isCmdOnly(dv) ? ( + + ) : ( + + )} + + )} + + + ))} + + + )}
); }; - const updateSensor = (sensordata: Sensor) => { - if (sensordata && me.admin) { - setSensor(sensordata); + const updateSensor = (s: Sensor) => { + if (s && me.admin) { + setSensor(s); } }; - const updateAnalog = (analogdata: Analog) => { + const updateAnalog = (a: Analog) => { if (me.admin) { - setAnalog(analogdata); + setAnalog(a); } }; @@ -565,31 +739,36 @@ const DashboardData: FC = () => { Temperature Sensors - - - - - NAME - TEMPERATURE - - - - {sensorData?.sensors.map((sensor_data) => ( - updateSensor(sensor_data)}> - - {me.admin && ( - - - - )} - - - {sensor_data.n} - - {formatValue(sensor_data.t, sensor_data.u)} - - ))} - + +
+ {(tableList: any) => ( + <> +
+ + + NAME + + TEMPERATURE + + +
+ + {tableList.map((s: Sensor) => ( + updateSensor(s)}> + {s.n} + {formatValue(s.t, s.u)} + + {me.admin && ( + updateSensor(s)}> + + + )} + + + ))} + + + )}
); @@ -599,35 +778,44 @@ const DashboardData: FC = () => { Analog Sensors - - - - - GPIO - NAME - TYPE - VALUE - - - - {sensorData?.analogs.map((analog_data) => ( - updateAnalog(analog_data)}> - - {me.admin && ( - - - - )} - - - {analog_data.i} - - {analog_data.n} - {AnalogTypeNames[analog_data.t]} - {formatValue(analog_data.v, analog_data.u)} - - ))} - + +
+ {(tableList: any) => ( + <> +
+ + + GPIO + + + NAME + + + TYPE + + VALUE + + +
+ + {tableList.map((a: Analog) => ( + updateAnalog(a)}> + {a.id} + {a.n} + {AnalogTypeNames[a.t]} + {formatValue(a.v, a.u)} + + {me.admin && ( + updateAnalog(a)}> + + + )} + + + ))} + + + )}
); @@ -636,7 +824,7 @@ const DashboardData: FC = () => { if (analog) { try { const response = await EMSESP.writeAnalog({ - id: analog.i, + id: analog.id, name: analog.n, offset: analog.o, factor: analog.f, @@ -664,7 +852,7 @@ const DashboardData: FC = () => { if (analog) { try { const response = await EMSESP.writeAnalog({ - id: analog.i, + id: analog.id, name: analog.n, offset: analog.o, factor: analog.f, @@ -697,10 +885,11 @@ const DashboardData: FC = () => { { )} - {analog.t === AnalogType.DIGITAL_OUT && (analog.i === 25 || analog.i === 26) && ( + {analog.t === AnalogType.DIGITAL_OUT && (analog.id === '25' || analog.id === '26') && ( <> { )} - {analog.t === AnalogType.DIGITAL_OUT && analog.i !== 25 && analog.i !== 26 && ( + {analog.t === AnalogType.DIGITAL_OUT && analog.id !== '25' && analog.id !== '26' && ( <> { } }; - const content = () => { - if (!data) { - return ; - } - - return ( - <> - {renderCoreData()} - {renderDeviceData()} - {renderDeviceDialog()} - {sensorData && sensorData.sensors.length > 0 && renderDallasData()} - {sensorData && sensorData.analogs.length > 0 && renderAnalogData()} - {renderDeviceValueDialog()} - {renderSensorDialog()} - {renderAnalogDialog()} - - - - - ); - }; - return ( - {content()} + {renderCoreData()} + {renderDeviceData()} + {renderDeviceDialog()} + {sensorData.sensors.length !== 0 && renderDallasData()} + {sensorData.analogs.length !== 0 && renderAnalogData()} + {renderDeviceValueDialog()} + {renderSensorDialog()} + {renderAnalogDialog()} + + + ); }; diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index dc73bbe5e..d3d096aea 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -69,7 +69,7 @@ export interface Status { } export interface Device { - i: number; // id + id: string; // id index t: string; // type b: string; // brand n: string; // name @@ -80,7 +80,7 @@ export interface Device { } export interface Sensor { - is: string; // id string + id: string; // id string n: string; // name/alias t?: number; // temp, optional o: number; // offset @@ -88,7 +88,7 @@ export interface Sensor { } export interface Analog { - i: number; + id: string; // id string, is GPIO n: string; v?: number; u: number; @@ -126,11 +126,11 @@ export interface Devices { } export interface DeviceValue { + id: string; // index, contains mask+name v?: any; // value, in any format u: number; // uom - n: string; // name - c: string; // command - l: string[]; // list + c?: string; // command + l?: string[]; // list h?: string; // help text, optional s?: string; // steps for up/down, optional m?: string; // min, optional @@ -143,8 +143,8 @@ export interface DeviceData { } export interface DeviceEntity { - v?: any; // value, in any format n: string; // name + v?: any; // value, in any format s: string; // shortname m: number; // mask om?: number; // original mask before edits @@ -277,7 +277,7 @@ export interface WriteValue { } export interface WriteAnalog { - id: number; + id: string; name: string; factor: number; offset: number; diff --git a/mock-api/server.js b/mock-api/server.js index 49e86fa46..0645388ad 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -253,7 +253,7 @@ const UPLOAD_FIRMWARE_ENDPOINT = REST_ENDPOINT_ROOT + 'uploadFirmware' const SIGN_IN_ENDPOINT = REST_ENDPOINT_ROOT + 'signIn' const GENERATE_TOKEN_ENDPOINT = REST_ENDPOINT_ROOT + 'generateToken' const system_status = { - emsesp_version: '3.4.0demo', + emsesp_version: '3.4demo', esp_platform: 'ESP32', max_alloc_heap: 113792, psram_size: 0, @@ -364,7 +364,7 @@ const emsesp_devices = { const emsesp_coredata = { devices: [ { - i: 2, + id: '2', t: 'Boiler', s: 'Boiler', b: 'Nefit', @@ -375,7 +375,7 @@ const emsesp_coredata = { e: 68, }, { - i: 1, + id: '1', t: 'Thermostat', s: 'Thermostat', b: '', @@ -386,7 +386,7 @@ const emsesp_coredata = { e: 5, }, { - i: 4, + id: '4', t: 'Thermostat', s: 'Thermostat', b: 'Buderus', @@ -403,17 +403,17 @@ const emsesp_coredata = { const emsesp_sensordata = { sensors: [ - { is: '28-233D-9497-0C03', n: 'Dallas 1', t: 25.7, o: 1.2, u: 1 }, - { is: '28-243D-7437-1E3A', n: 'Dallas 2 outside', t: 26.1, o: 0, u: 1 }, - { is: '28-243E-7437-1E3B', n: 'Zolder', t: 27.1, o: 0, u: 16 }, - { is: '28-183D-1892-0C33', n: 'Roof', o: 2, u: 1 }, + { id: '28-233D-9497-0C03', n: 'Dallas 1', t: 25.7, o: 1.2, u: 1 }, + { id: '28-243D-7437-1E3A', n: 'Dallas 2 outside', t: 26.1, o: 0, u: 1 }, + { id: '28-243E-7437-1E3B', n: 'Zolder', t: 27.1, o: 0, u: 16 }, + { id: '28-183D-1892-0C33', n: 'Roof', o: 2, u: 1 }, ], // sensors: [], analogs: [ - { i: 36, n: 'motor', u: 0, o: 17, f: 0, t: 0 }, - { i: 37, n: 'External switch', v: 13, u: 0, o: 17, f: 0, t: 1 }, - { i: 39, n: 'Pulse count', v: 144, u: 0, o: 0, f: 0, t: 2 }, - { i: 40, n: 'Pressure', v: 16, u: 17, o: 0, f: 0, t: 3 }, + { id: '36', n: 'motor', u: 0, o: 17, f: 0, t: 0 }, + { id: '37', n: 'External switch', v: 13, u: 0, o: 17, f: 0, t: 1 }, + { id: '39', n: 'Pulse count', v: 144, u: 0, o: 0, f: 0, t: 2 }, + { id: '40', n: 'Pressure', v: 16, u: 17, o: 0, f: 0, t: 3 }, ], // analogs: [], } @@ -455,31 +455,28 @@ const emsesp_devicedata_1 = { { v: '(0)', u: 0, - n: '00error code', - c: '', + id: '00error code', }, { v: '14:54:39 06/06/2021', u: 0, - n: '00date/time', - c: '', + id: '00date/time', }, { v: 18, u: 1, - n: '00hc1 selected room temperature', + id: '00hc1 selected room temperature', c: 'hc1/seltemp', }, { v: 22.6, u: 1, - n: '00hc1 current room temperature', - c: '', + id: '00hc1 current room temperature', }, { v: 'auto', u: 0, - n: '00hc1 mode', + id: '00hc1 mode', c: 'hc1/mode', }, ], @@ -488,81 +485,81 @@ const emsesp_devicedata_1 = { const emsesp_devicedata_2 = { label: 'Boiler: Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i', data: [ - { u: 0, n: '08reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, - { v: 'false', u: 0, n: '08heating active' }, - { v: 'false', u: 0, n: '04tapwater active' }, - { v: 5, u: 1, n: '04selected flow temperature', c: 'selflowtemp' }, - { v: 0, u: 3, n: '0Eburner selected max power', c: 'selburnpow' }, - { v: 0, u: 3, n: '00heating pump modulation' }, - { v: 53.4, u: 1, n: '00current flow temperature' }, - { v: 52.7, u: 1, n: '00return temperature' }, - { v: 1.3, u: 10, n: '00system pressure' }, - { v: 54.9, u: 1, n: '00actual boiler temperature' }, - { v: 'false', u: 0, n: '00gas' }, - { v: 'false', u: 0, n: '00gas stage 2' }, - { v: 0, u: 9, n: '00flame current' }, - { v: 'false', u: 0, n: '00heating pump' }, - { v: 'false', u: 0, n: '00fan' }, - { v: 'false', u: 0, n: '00ignition' }, - { v: 'false', u: 0, n: '00oil preheating' }, - { v: 'true', u: 0, n: '00heating activated', c: 'heatingactivated', l: ['off', 'on'] }, - { v: 80, u: 1, n: '00heating temperature', c: 'heatingtemp' }, - { v: 70, u: 3, n: '00burner pump max power', c: 'pumpmodmax' }, - { v: 30, u: 3, n: '00burner pump min power', c: 'pumpmodmin' }, - { v: 1, u: 8, n: '00pump delay', c: 'pumpdelay' }, - { v: 10, u: 8, n: '00burner min period', c: 'burnminperiod' }, - { v: 0, u: 3, n: '00burner min power', c: 'burnminpower' }, - { v: 50, u: 3, n: '00burner max power', c: 'burnmaxpower' }, - { v: -6, u: 2, n: '00hysteresis on temperature', c: 'boilhyston' }, - { v: 6, u: 2, n: '00hysteresis off temperature', c: 'boilhystoff' }, - { v: 0, u: 1, n: '00set flow temperature' }, - { v: 0, u: 3, n: '00burner set power' }, - { v: 0, u: 3, n: '00burner current power' }, - { v: 326323, u: 0, n: '00burner starts' }, - { v: 553437, u: 8, n: '00total burner operating time' }, - { v: 451286, u: 8, n: '00total heat operating time' }, - { v: 4672173, u: 8, n: '00total UBA operating time' }, - { v: '1C(210) 06.06.2020 12:07 (0 min)', u: 0, n: '00last error code' }, - { v: '0H', u: 0, n: '00service code' }, - { v: 203, u: 0, n: '00service code number' }, - { v: 'H00', u: 0, n: '00maintenance message' }, - { v: 'manual', u: 0, n: '00maintenance scheduled', c: 'maintenance', l: ['off', 'time', 'date', 'manual'] }, - { v: 6000, u: 7, n: '00time to next maintenance', c: 'maintenancetime' }, - { v: '01.01.2012', u: 0, n: '00next maintenance date', c: 'maintenancedate', o: 'Format: < dd.mm.yyyy >' }, - { v: 'true', u: 0, n: '00dhw turn on/off', c: 'wwtapactivated', l: ['off', 'on'] }, - { v: 62, u: 1, n: '00dhw set temperature' }, - { v: 60, u: 1, n: '00dhw selected temperature', c: 'wwseltemp' }, - { v: 'flow', u: 0, n: '00dhw type' }, - { v: 'hot', u: 0, n: '00dhw comfort', c: 'wwcomfort', l: ['hot', 'eco', 'intelligent'] }, - { v: 40, u: 2, n: '00dhw flow temperature offset', c: 'wwflowtempoffset' }, - { v: 100, u: 3, n: '00dhw max power', c: 'wwmaxpower' }, - { v: 'false', u: 0, n: '00dhw circulation pump available', c: 'wwcircpump', l: ['off', 'on'] }, - { v: '3-way valve', u: 0, n: '00dhw charging type' }, - { v: -5, u: 2, n: '00dhw hysteresis on temperature', c: 'wwhyston' }, - { v: 0, u: 2, n: '00dhw hysteresis off temperature', c: 'wwhystoff' }, - { v: 70, u: 1, n: '00dhw disinfection temperature', c: 'wwdisinfectiontemp' }, + { u: 0, id: '08reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, + { v: 'false', u: 0, id: '08heating active' }, + { v: 'false', u: 0, id: '04tapwater active' }, + { v: 5, u: 1, id: '04selected flow temperature', c: 'selflowtemp' }, + { v: 0, u: 3, id: '0Eburner selected max power', c: 'selburnpow' }, + { v: 0, u: 3, id: '00heating pump modulation' }, + { v: 53.4, u: 1, id: '00current flow temperature' }, + { v: 52.7, u: 1, id: '00return temperature' }, + { v: 1.3, u: 10, id: '00system pressure' }, + { v: 54.9, u: 1, id: '00actual boiler temperature' }, + { v: 'false', u: 0, id: '00gas' }, + { v: 'false', u: 0, id: '00gas stage 2' }, + { v: 0, u: 9, id: '00flame current' }, + { v: 'false', u: 0, id: '00heating pump' }, + { v: 'false', u: 0, id: '00fan' }, + { v: 'false', u: 0, id: '00ignition' }, + { v: 'false', u: 0, id: '00oil preheating' }, + { v: 'true', u: 0, id: '00heating activated', c: 'heatingactivated', l: ['off', 'on'] }, + { v: 80, u: 1, id: '00heating temperature', c: 'heatingtemp' }, + { v: 70, u: 3, id: '00burner pump max power', c: 'pumpmodmax' }, + { v: 30, u: 3, id: '00burner pump min power', c: 'pumpmodmin' }, + { v: 1, u: 8, id: '00pump delay', c: 'pumpdelay' }, + { v: 10, u: 8, id: '00burner min period', c: 'burnminperiod' }, + { v: 0, u: 3, id: '00burner min power', c: 'burnminpower' }, + { v: 50, u: 3, id: '00burner max power', c: 'burnmaxpower' }, + { v: -6, u: 2, id: '00hysteresis on temperature', c: 'boilhyston' }, + { v: 6, u: 2, id: '00hysteresis off temperature', c: 'boilhystoff' }, + { v: 0, u: 1, id: '00set flow temperature' }, + { v: 0, u: 3, id: '00burner set power' }, + { v: 0, u: 3, id: '00burner current power' }, + { v: 326323, u: 0, id: '00burner starts' }, + { v: 553437, u: 8, id: '00total burner operating time' }, + { v: 451286, u: 8, id: '00total heat operating time' }, + { v: 4672173, u: 8, id: '00total UBA operating time' }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', u: 0, id: '00last error code' }, + { v: '0H', u: 0, id: '00service code' }, + { v: 203, u: 0, id: '00service code number' }, + { v: 'H00', u: 0, id: '00maintenance message' }, + { v: 'manual', u: 0, id: '00maintenance scheduled', c: 'maintenance', l: ['off', 'time', 'date', 'manual'] }, + { v: 6000, u: 7, id: '00time to next maintenance', c: 'maintenancetime' }, + { v: '01.01.2012', u: 0, id: '00next maintenance date', c: 'maintenancedate', o: 'Format: < dd.mm.yyyy >' }, + { v: 'true', u: 0, id: '00dhw turn on/off', c: 'wwtapactivated', l: ['off', 'on'] }, + { v: 62, u: 1, id: '00dhw set temperature' }, + { v: 60, u: 1, id: '00dhw selected temperature', c: 'wwseltemp' }, + { v: 'flow', u: 0, id: '00dhw type' }, + { v: 'hot', u: 0, id: '00dhw comfort', c: 'wwcomfort', l: ['hot', 'eco', 'intelligent'] }, + { v: 40, u: 2, id: '00dhw flow temperature offset', c: 'wwflowtempoffset' }, + { v: 100, u: 3, id: '00dhw max power', c: 'wwmaxpower' }, + { v: 'false', u: 0, id: '00dhw circulation pump available', c: 'wwcircpump', l: ['off', 'on'] }, + { v: '3-way valve', u: 0, id: '00dhw charging type' }, + { v: -5, u: 2, id: '00dhw hysteresis on temperature', c: 'wwhyston' }, + { v: 0, u: 2, id: '00dhw hysteresis off temperature', c: 'wwhystoff' }, + { v: 70, u: 1, id: '00dhw disinfection temperature', c: 'wwdisinfectiontemp' }, { v: 'off', u: 0, - n: '00dhw circulation pump mode', + id: '00dhw circulation pump mode', c: 'wwcircmode', l: ['off', '1x3min', '2x3min', '3x3min', '4x3min', '5x3min', '6x3min', 'continuous'], }, - { v: 'false', u: 0, n: '00dhw circulation active', c: 'wwcirc', l: ['off', 'on'] }, - { v: 47.3, u: 1, n: '00dhw current intern temperature' }, - { v: 0, u: 4, n: '00dhw current tap water flow' }, - { v: 47.3, u: 1, n: '00dhw storage intern temperature' }, - { v: 'true', u: 0, n: '00dhw activated', c: 'wwactivated', l: ['off', 'on'] }, - { v: 'false', u: 0, n: '00dhw one time charging', c: 'wwonetime', l: ['off', 'on'] }, - { v: 'false', u: 0, n: '00dhw disinfecting', c: 'wwdisinfecting', l: ['off', 'on'] }, - { v: 'false', u: 0, n: '00dhw charging' }, - { v: 'false', u: 0, n: '00dhw recharging' }, - { v: 'true', u: 0, n: '00dhw temperature ok' }, - { v: 'false', u: 0, n: '00dhw active' }, - { v: 'true', u: 0, n: '00dhw 3way valve active' }, - { v: 0, u: 3, n: '00dhw set pump power' }, - { v: 288768, u: 0, n: '00dhw starts' }, - { v: 102151, u: 8, n: '00dhw active time' }, + { v: 'false', u: 0, id: '00dhw circulation active', c: 'wwcirc', l: ['off', 'on'] }, + { v: 47.3, u: 1, id: '00dhw current intern temperature' }, + { v: 0, u: 4, id: '00dhw current tap water flow' }, + { v: 47.3, u: 1, id: '00dhw storage intern temperature' }, + { v: 'true', u: 0, id: '00dhw activated', c: 'wwactivated', l: ['off', 'on'] }, + { v: 'false', u: 0, id: '00dhw one time charging', c: 'wwonetime', l: ['off', 'on'] }, + { v: 'false', u: 0, id: '00dhw disinfecting', c: 'wwdisinfecting', l: ['off', 'on'] }, + { v: 'false', u: 0, id: '00dhw charging' }, + { v: 'false', u: 0, id: '00dhw recharging' }, + { v: 'true', u: 0, id: '00dhw temperature ok' }, + { v: 'false', u: 0, id: '00dhw active' }, + { v: 'true', u: 0, id: '00dhw 3way valve active' }, + { v: 0, u: 3, id: '00dhw set pump power' }, + { v: 288768, u: 0, id: '00dhw starts' }, + { v: 102151, u: 8, id: '00dhw active time' }, ], } @@ -572,19 +569,19 @@ const emsesp_devicedata_4 = { { v: 16, u: 1, - n: '00hc2 selected room temperature', + id: '00hc2 selected room temperature', c: 'hc2/seltemp', }, { v: 18.6, u: 1, - n: '00hc2 current room temperature', + id: '00hc2 current room temperature', c: '', }, { v: 'off', u: 0, - n: '00hc2 mode', + id: '00hc2 mode', c: 'hc2/mode', }, ], @@ -870,9 +867,12 @@ rest_server.post(EMSESP_SETTINGS_ENDPOINT, (req, res) => { // res.status(200).json(settings); // no restart needed }) rest_server.get(EMSESP_CORE_DATA_ENDPOINT, (req, res) => { + console.log('send back core data...') res.json(emsesp_coredata) }) rest_server.get(EMSESP_SENSOR_DATA_ENDPOINT, (req, res) => { + console.log('send back sensor data...') + res.json(emsesp_sensordata) }) rest_server.get(EMSESP_DEVICES_ENDPOINT, (req, res) => { @@ -887,6 +887,7 @@ rest_server.get(EMSESP_STATUS_ENDPOINT, (req, res) => { }) rest_server.post(EMSESP_DEVICEDATA_ENDPOINT, (req, res) => { const id = req.body.id + console.log('send back device data for ' + id) if (id === 1) { const encoded = msgpack.encode(emsesp_devicedata_1) res.write(encoded, 'binary') @@ -986,7 +987,7 @@ rest_server.post(EMSESP_WRITE_VALUE_ENDPOINT, (req, res) => { rest_server.post(EMSESP_WRITE_SENSOR_ENDPOINT, (req, res) => { const sensor = req.body console.log('Write sensor: ' + JSON.stringify(sensor)) - objIndex = emsesp_sensordata.sensors.findIndex((obj) => obj.is == sensor.id_str) + objIndex = emsesp_sensordata.sensors.findIndex((obj) => obj.id == sensor.id_str) emsesp_sensordata.sensors[objIndex].n = sensor.name emsesp_sensordata.sensors[objIndex].o = sensor.offset res.sendStatus(200) @@ -995,12 +996,12 @@ rest_server.post(EMSESP_WRITE_SENSOR_ENDPOINT, (req, res) => { rest_server.post(EMSESP_WRITE_ANALOG_ENDPOINT, (req, res) => { const analog = req.body console.log('Write analog: ' + JSON.stringify(analog)) - objIndex = emsesp_sensordata.analogs.findIndex((obj) => obj.i == analog.id) + objIndex = emsesp_sensordata.analogs.findIndex((obj) => obj.id == analog.id) if (objIndex === -1) { console.log('new analog') emsesp_sensordata.analogs.push({ - i: analog.id, + id: analog.id, n: analog.name, f: analog.factor, o: analog.offset, From a9a11f464b2359fd4dbca3f92a8f5b8967509ee4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 14 Apr 2022 11:59:44 +0200 Subject: [PATCH 224/319] add comment to boiler: hybrid heatpump --- src/devices/boiler.cpp | 12 ++++++++++++ src/devices/boiler.h | 8 ++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index ccfa5a507..1b2d89588 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -90,6 +90,10 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const } /* + * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat + * thermostat always overwrites settings in boiler + * enable settings here if no thermostat is used in system + * if (model() == EMSdevice::EMS_DEVICE_FLAG_HYBRID) { register_telegram_type(0xBB, F("HybridHp"), true, MAKE_PF_CB(process_HybridHp)); } @@ -204,6 +208,10 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_maintenancedate)); /* + * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat + * thermostat always overwrites settings in boiler + * enable settings here if no thermostat is used in system + * // Hybrid Heatpump if (model() == EMSdevice::EMS_DEVICE_FLAG_HYBRID) { register_device_value(DeviceValueTAG::TAG_BOILER_DATA, @@ -1065,6 +1073,10 @@ void Boiler::process_UBAMaintenanceData(std::shared_ptr telegram } } /* + * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat + * thermostat always overwrites settings in boiler + * enable settings here if no thermostat is used in system + * // 0xBB Heatpump optimization // Boiler(0x08) -> Me(0x0B), ?(0xBB), data: 00 00 00 00 00 00 00 00 00 00 00 FF 02 0F 1E 0B 1A 00 14 03 void Boiler::process_HybridHp(std::shared_ptr telegram) { diff --git a/src/devices/boiler.h b/src/devices/boiler.h index d1365f1f7..00d019898 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -193,8 +193,12 @@ class Boiler : public EMSdevice { // Pool unit int8_t poolSetTemp_; - /* - // HybridHP +/* + * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat + * thermostat always overwrites settings in boiler + * enable settings here if no thermostat is used in system + * +// HybridHP uint8_t hybridStrategy_; // cost = 2, temperature = 3, mix = 4 int8_t switchOverTemp_; // degrees uint8_t energyCostRatio_; // is *10 From cd5fef6891727281c9e23dd51f420686b3f07ab6 Mon Sep 17 00:00:00 2001 From: Proddy Date: Thu, 14 Apr 2022 18:25:50 +0200 Subject: [PATCH 225/319] add export button --- interface/src/project/DashboardData.tsx | 208 +++++++++++++++++++----- interface/src/project/types.ts | 13 +- mock-api/server.js | 19 ++- 3 files changed, 186 insertions(+), 54 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 3c64dc673..0ba5600c5 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -24,10 +24,11 @@ import { useSnackbar } from 'notistack'; import { Table } from '@table-library/react-table-library/table'; import { useTheme } from '@table-library/react-table-library/theme'; -import { useSort, HeaderCellSort } from '@table-library/react-table-library/sort'; +import { useSort } from '@table-library/react-table-library/sort'; import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; import { useRowSelect } from '@table-library/react-table-library/select'; +import DownloadIcon from '@mui/icons-material/GetApp'; import RefreshIcon from '@mui/icons-material/Refresh'; import EditIcon from '@mui/icons-material/Edit'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; @@ -98,8 +99,8 @@ const DashboardData: FC = () => { } `, HeaderRow: ` + text-transform: uppercase; background-color: black; - font-size: 14px; border-bottom: 1px solid #e0e0e0; `, Row: ` @@ -165,8 +166,9 @@ const DashboardData: FC = () => { height: 32px; `, HeaderRow: ` + text-transform: uppercase; background-color: black; - font-size: 14px; + color: #90CAF9; border-bottom: 1px solid #e0e0e0; `, Row: ` @@ -195,6 +197,7 @@ const DashboardData: FC = () => { } `, BaseCell: ` + padding-left: 8px; border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; @@ -202,9 +205,22 @@ const DashboardData: FC = () => { text-align: right; min-width: 64px; } + `, + HeaderCell: ` + padding-left: 0px; ` }); + const getSortIcon = (state: any, sortKey: any) => { + if (state.sortKey === sortKey && state.reverse) { + return ; + } + + if (state.sortKey === sortKey && !state.reverse) { + return ; + } + }; + const analog_sort = useSort( { nodes: sensorData.analogs }, { @@ -222,7 +238,8 @@ const DashboardData: FC = () => { sortFns: { GPIO: (array) => array.sort((a, b) => a.i - b.i), NAME: (array) => array.sort((a, b) => a.n.localeCompare(b.n)), - TYPE: (array) => array.sort((a, b) => a.t - b.t) + TYPE: (array) => array.sort((a, b) => a.t - b.t), + VALUE: (array) => array.sort((a, b) => a.v.toString().localeCompare(b.v.toString())) } } ); @@ -250,16 +267,21 @@ const DashboardData: FC = () => { const dv_sort = useSort( { nodes: deviceData.data }, - {}, + { + state: { + sortKey: 'NAME', + reverse: false + } + }, { sortIcon: { - margin: '0px', iconDefault: null, iconUp: , iconDown: }, sortFns: { - NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))) + NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))), + VALUE: (array) => array.sort((a, b) => a.v.toString().localeCompare(b.v.toString())) } } ); @@ -279,6 +301,52 @@ const DashboardData: FC = () => { } } + const escapeCsvCell = (cell: any) => { + if (cell == null) { + return ''; + } + const sc = cell.toString().trim(); + if (sc === '' || sc === '""') { + return sc; + } + if (sc.includes('"') || sc.includes(',') || sc.includes('\n') || sc.includes('\r')) { + return '"' + sc.replace(/"/g, '""') + '"'; + } + return sc; + }; + + const makeCsvData = (columns: any, data: any) => { + return data.reduce((csvString: any, rowItem: any) => { + return csvString + columns.map(({ accessor }: any) => escapeCsvCell(accessor(rowItem))).join(',') + '\r\n'; + }, columns.map(({ name }: any) => escapeCsvCell(name)).join(',') + '\r\n'); + }; + + const downloadAsCsv = (columns: any, data: any, filename: string) => { + const csvData = makeCsvData(columns, data); + const csvFile = new Blob([csvData], { type: 'text/csv' }); + const downloadLink = document.createElement('a'); + + downloadLink.download = filename; + downloadLink.href = window.URL.createObjectURL(csvFile); + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + }; + + const hasMask = (id: string, mask: number) => (parseInt(id.slice(0, 2), 16) & mask) === mask; + + const handleDownloadCsv = () => { + const columns = [ + { accessor: (dv: any) => dv.id.slice(2), name: 'Entity' }, + { accessor: (dv: any) => formatValue(dv.v, dv.u), name: 'Value' } + ]; + downloadAsCsv( + columns, + onlyFav ? deviceData.data.filter((dv) => hasMask(dv.id, DeviceEntityMask.DV_FAVORITE)) : deviceData.data, + 'device_entities' + ); + }; + const refreshData = () => { const selectedDevice = device_select.state.id; if (selectedDevice === 'sensor') { @@ -451,7 +519,7 @@ const DashboardData: FC = () => { }; const addAnalogSensor = () => { - setAnalog({ id: '0', n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); + setAnalog({ id: '0', i: 0, n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); }; const sendSensor = async () => { @@ -585,8 +653,6 @@ const DashboardData: FC = () => { return ; } - console.log('** Rendering main data'); - return ( {coreData.devices.length === 0 && } @@ -647,8 +713,6 @@ const DashboardData: FC = () => { return; } - const hasMask = (id: string, mask: number) => (parseInt(id.slice(0, 2), 16) & mask) === mask; - const sendCommand = (dv: DeviceValue) => { if (dv.c && me.admin && !hasMask(dv.id, DeviceEntityMask.DV_READONLY)) { setDeviceValue(dv); @@ -672,8 +736,8 @@ const DashboardData: FC = () => {
setOnlyFav(!onlyFav)} />} - label="show favorites only" + control={ setOnlyFav(!onlyFav)} />} + label={favorites only} /> { <>
- - ENTITY NAME - - VALUE + + + + + +
@@ -745,10 +825,26 @@ const DashboardData: FC = () => { <>
- - NAME - - TEMPERATURE + + + + + +
@@ -784,16 +880,46 @@ const DashboardData: FC = () => { <>
- - GPIO - - - NAME - - - TYPE - - VALUE + + + + + + + + + + + +
@@ -803,7 +929,7 @@ const DashboardData: FC = () => { {a.id}{a.n}{AnalogTypeNames[a.t]} - {formatValue(a.v, a.u)} + {a.t ? formatValue(a.v, a.u) : ''} {me.admin && ( updateAnalog(a)}> @@ -824,7 +950,7 @@ const DashboardData: FC = () => { if (analog) { try { const response = await EMSESP.writeAnalog({ - id: analog.id, + i: analog.i, name: analog.n, offset: analog.o, factor: analog.f, @@ -852,7 +978,7 @@ const DashboardData: FC = () => { if (analog) { try { const response = await EMSESP.writeAnalog({ - id: analog.id, + i: analog.i, name: analog.n, offset: analog.o, factor: analog.f, @@ -885,11 +1011,10 @@ const DashboardData: FC = () => { { + {device_select.state.id && device_select.state.id !== 'sensor' && ( + + )} ); diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index d3d096aea..db3433a10 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -88,9 +88,10 @@ export interface Sensor { } export interface Analog { - id: string; // id string, is GPIO + id: string; // id string + i: number; // GPIO n: string; - v?: number; + v: number; // is optional u: number; o: number; f: number; @@ -127,10 +128,10 @@ export interface Devices { export interface DeviceValue { id: string; // index, contains mask+name - v?: any; // value, in any format + v: any; // value, in any format u: number; // uom - c?: string; // command - l?: string[]; // list + c?: string; // command, optional + l?: string[]; // list, optional h?: string; // help text, optional s?: string; // steps for up/down, optional m?: string; // min, optional @@ -277,7 +278,7 @@ export interface WriteValue { } export interface WriteAnalog { - id: string; + i: number; name: string; factor: number; offset: number; diff --git a/mock-api/server.js b/mock-api/server.js index 0645388ad..66fbacdf5 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -410,10 +410,10 @@ const emsesp_sensordata = { ], // sensors: [], analogs: [ - { id: '36', n: 'motor', u: 0, o: 17, f: 0, t: 0 }, - { id: '37', n: 'External switch', v: 13, u: 0, o: 17, f: 0, t: 1 }, - { id: '39', n: 'Pulse count', v: 144, u: 0, o: 0, f: 0, t: 2 }, - { id: '40', n: 'Pressure', v: 16, u: 17, o: 0, f: 0, t: 3 }, + { id: '36', i: 36, n: 'motor', v: 0, u: 0, o: 17, f: 0, t: 0 }, + { id: '37', i: 37, n: 'External switch', v: 13, u: 0, o: 17, f: 0, t: 1 }, + { id: '39', i: 39, n: 'Pulse count', v: 144, u: 0, o: 0, f: 0, t: 2 }, + { id: '40', i: 40, n: 'Pressure', v: 16, u: 17, o: 0, f: 0, t: 3 }, ], // analogs: [], } @@ -485,7 +485,7 @@ const emsesp_devicedata_1 = { const emsesp_devicedata_2 = { label: 'Boiler: Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i', data: [ - { u: 0, id: '08reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, + { v: 0, u: 0, id: '08reset', c: 'reset', l: ['-', 'maintenance', 'error'] }, { v: 'false', u: 0, id: '08heating active' }, { v: 'false', u: 0, id: '04tapwater active' }, { v: 5, u: 1, id: '04selected flow temperature', c: 'selflowtemp' }, @@ -872,7 +872,6 @@ rest_server.get(EMSESP_CORE_DATA_ENDPOINT, (req, res) => { }) rest_server.get(EMSESP_SENSOR_DATA_ENDPOINT, (req, res) => { console.log('send back sensor data...') - res.json(emsesp_sensordata) }) rest_server.get(EMSESP_DEVICES_ENDPOINT, (req, res) => { @@ -996,12 +995,13 @@ rest_server.post(EMSESP_WRITE_SENSOR_ENDPOINT, (req, res) => { rest_server.post(EMSESP_WRITE_ANALOG_ENDPOINT, (req, res) => { const analog = req.body console.log('Write analog: ' + JSON.stringify(analog)) - objIndex = emsesp_sensordata.analogs.findIndex((obj) => obj.id == analog.id) + objIndex = emsesp_sensordata.analogs.findIndex((obj) => obj.i == analog.i) if (objIndex === -1) { console.log('new analog') emsesp_sensordata.analogs.push({ - id: analog.id, + id: analog.i.toString(), + i: analog.i, n: analog.name, f: analog.factor, o: analog.offset, @@ -1010,9 +1010,10 @@ rest_server.post(EMSESP_WRITE_ANALOG_ENDPOINT, (req, res) => { }) } else { if (analog.type === -1) { - console.log('removing analog ' + analog.id) + console.log('removing analog ' + analog.i) emsesp_sensordata.analogs[objIndex].t = -1 } else { + console.log('updating analog ' + analog.i) emsesp_sensordata.analogs[objIndex].n = analog.name emsesp_sensordata.analogs[objIndex].o = analog.offset emsesp_sensordata.analogs[objIndex].f = analog.factor From 4b3b9524ef0911cd58c06244d9f012de518a60b0 Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 15 Apr 2022 13:04:52 +0200 Subject: [PATCH 226/319] changes to backend, some refactoring --- interface/src/project/DashboardData.tsx | 146 +++++++-------- interface/src/project/types.ts | 6 +- mock-api/server.js | 12 +- src/analogsensor.cpp | 112 ++++++------ src/analogsensor.h | 12 +- src/dallassensor.cpp | 76 ++++---- src/dallassensor.h | 14 +- src/emsdevice.cpp | 224 ++++++++++++------------ src/emsesp.cpp | 4 +- src/system.cpp | 4 +- src/web/WebCustomizationService.cpp | 8 +- src/web/WebCustomizationService.h | 6 +- src/web/WebDataService.cpp | 45 +++-- 13 files changed, 340 insertions(+), 329 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 0ba5600c5..32edb00ad 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -51,7 +51,7 @@ import { formatDurationMin, pluralize } from '../utils'; import { AuthenticatedContext } from '../contexts/authentication'; -import { ButtonRow, FormLoader, ValidatedTextField, SectionContent, MessageBox } from '../components'; +import { ButtonRow, ValidatedTextField, SectionContent, MessageBox } from '../components'; import * as EMSESP from './api'; @@ -77,7 +77,6 @@ const DashboardData: FC = () => { const { enqueueSnackbar } = useSnackbar(); - const [errorMessage, setErrorMessage] = useState(); const [coreData, setCoreData] = useState({ devices: [], active_sensors: 0, analog_enabled: false }); const [deviceData, setDeviceData] = useState({ label: '', data: [] }); const [sensorData, setSensorData] = useState({ sensors: [], analogs: [] }); @@ -286,6 +285,11 @@ const DashboardData: FC = () => { } ); + const paul = () => { + console.log('paul'); + sensor_sort.fns.onToggleSort({ sortKey: 'NAME' }); + }; + const device_select = useRowSelect( { nodes: coreData.devices }, { @@ -338,7 +342,8 @@ const DashboardData: FC = () => { const handleDownloadCsv = () => { const columns = [ { accessor: (dv: any) => dv.id.slice(2), name: 'Entity' }, - { accessor: (dv: any) => formatValue(dv.v, dv.u), name: 'Value' } + { accessor: (dv: any) => dv.v, name: 'Value' }, + { accessor: (dv: any) => (dv.u >= 1 && dv.u <= 2 ? 'C' : DeviceValueUOM_s[dv.u]), name: 'UoM' } ]; downloadAsCsv( columns, @@ -366,9 +371,9 @@ const DashboardData: FC = () => { try { setCoreData((await EMSESP.readCoreData()).data); } catch (error: any) { - setErrorMessage(extractErrorMessage(error, 'Failed to fetch core data')); + enqueueSnackbar(extractErrorMessage(error, 'Failed to fetch core data'), { variant: 'error' }); } - }, []); + }, [enqueueSnackbar]); useEffect(() => { fetchCoreData(); @@ -387,7 +392,7 @@ const DashboardData: FC = () => { try { setDeviceData((await EMSESP.readDeviceData({ id: unique_id })).data); } catch (error: any) { - setErrorMessage(extractErrorMessage(error, 'Problem fetching device data')); + enqueueSnackbar(extractErrorMessage(error, 'Problem fetching device data'), { variant: 'error' }); } }; @@ -395,7 +400,7 @@ const DashboardData: FC = () => { try { setSensorData((await EMSESP.readSensorData()).data); } catch (error: any) { - setErrorMessage(extractErrorMessage(error, 'Problem fetching sensor data')); + enqueueSnackbar(extractErrorMessage(error, 'Problem fetching sensor data'), { variant: 'error' }); } }; @@ -448,7 +453,7 @@ const DashboardData: FC = () => { } setDeviceValue(undefined); } catch (error: any) { - setErrorMessage(extractErrorMessage(error, 'Problem writing value')); + enqueueSnackbar(extractErrorMessage(error, 'Problem writing value'), { variant: 'error' }); } finally { refreshData(); setDeviceValue(undefined); @@ -519,7 +524,7 @@ const DashboardData: FC = () => { }; const addAnalogSensor = () => { - setAnalog({ id: '0', i: 0, n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); + setAnalog({ id: '0', g: 0, n: '', u: 0, v: 0, o: 0, t: 0, f: 1 }); }; const sendSensor = async () => { @@ -539,7 +544,7 @@ const DashboardData: FC = () => { } setSensor(undefined); } catch (error: any) { - setErrorMessage(extractErrorMessage(error, 'Problem updating sensor')); + enqueueSnackbar(extractErrorMessage(error, 'Problem updating sensor'), { variant: 'error' }); } finally { setSensor(undefined); fetchSensorData(); @@ -648,65 +653,59 @@ const DashboardData: FC = () => { } }; - const renderCoreData = () => { - if (!coreData) { - return ; - } + const renderCoreData = () => ( + + {coreData.devices.length === 0 && } - return ( - - {coreData.devices.length === 0 && } - -
- {(tableList: any) => ( - <> -
- - - TYPE - DESCRIPTION - ENTITIES - - -
- - {tableList.map((device: Device, index: number) => ( - - - - - {device.t} - {device.n} - {device.e} - - setDeviceDialog(index)}> - - - - - ))} - {(coreData.active_sensors > 0 || coreData.analog_enabled) && ( - - - - - Sensors - Attached EMS-ESP Sensors - {coreData.active_sensors} - - addAnalogSensor()}> - - - - - )} - - - )} -
- - ); - }; + + {(tableList: any) => ( + <> +
+ + + TYPE + DESCRIPTION + ENTITIES + + +
+ + {tableList.map((device: Device, index: number) => ( + + + + + {device.t} + {device.n} + {device.e} + + setDeviceDialog(index)}> + + + + + ))} + {(coreData.active_sensors > 0 || coreData.analog_enabled) && ( + + + + + Sensors + Attached EMS-ESP Sensors + {coreData.active_sensors} + + addAnalogSensor()}> + + + + + )} + + + )} +
+ + ); const renderDeviceData = () => { if (!device_select.state.id || device_select.state.id === 'sensor') { @@ -830,7 +829,8 @@ const DashboardData: FC = () => { fullWidth style={{ fontSize: '14px', justifyContent: 'flex-start' }} endIcon={getSortIcon(sensor_sort.state, 'NAME')} - onClick={() => sensor_sort.fns.onToggleSort({ sortKey: 'NAME' })} + // onClick={() => sensor_sort.fns.onToggleSort({ sortKey: 'NAME' })} + onClick={() => paul()} > NAME @@ -950,7 +950,7 @@ const DashboardData: FC = () => { if (analog) { try { const response = await EMSESP.writeAnalog({ - i: analog.i, + gpio: analog.g, name: analog.n, offset: analog.o, factor: analog.f, @@ -978,7 +978,7 @@ const DashboardData: FC = () => { if (analog) { try { const response = await EMSESP.writeAnalog({ - i: analog.i, + gpio: analog.g, name: analog.n, offset: analog.o, factor: analog.f, @@ -1011,9 +1011,9 @@ const DashboardData: FC = () => { = AnalogType::DIGITAL_OUT) && (sensor_.type() != sensor.type || sensor_.offset() != sensor.offset || sensor_.factor() != sensor.factor)) { @@ -94,12 +94,12 @@ void AnalogSensor::reload() { for (const auto & sensor : settings.analogCustomizations) { bool found = false; for (const auto & sensor_ : sensors_) { - if (sensor_.id() == sensor.id) { + if (sensor_.gpio() == sensor.gpio) { found = true; } } if (!found) { - sensors_.emplace_back(sensor.id, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type); + sensors_.emplace_back(sensor.gpio, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type); sensors_.back().ha_registered = false; // this will trigger recrate of the HA config if (sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) { sensors_.back().set_value(sensor.offset); @@ -112,64 +112,64 @@ void AnalogSensor::reload() { }); // sort the list based on GPIO (id) - std::sort(sensors_.begin(), sensors_.end(), [](const Sensor & a, const Sensor & b) { return a.id() < b.id(); }); + // std::sort(sensors_.begin(), sensors_.end(), [](const Sensor & a, const Sensor & b) { return a.id() < b.id(); }); // activate each sensor for (auto & sensor : sensors_) { sensor.ha_registered = false; // force HA configs to be re-created if (sensor.type() == AnalogType::ADC) { - LOG_DEBUG(F("Adding analog ADC sensor on GPIO%d"), sensor.id()); + LOG_DEBUG(F("Adding analog ADC sensor on GPIO%d"), sensor.gpio()); // analogSetPinAttenuation does not work with analogReadMilliVolts sensor.analog_ = 0; // initialize sensor.last_reading_ = 0; } else if (sensor.type() == AnalogType::COUNTER) { - LOG_DEBUG(F("Adding analog I/O Counter sensor on GPIO%d"), sensor.id()); - pinMode(sensor.id(), INPUT_PULLUP); - if (sensor.id() == 25 || sensor.id() == 26) { - dacWrite(sensor.id(), 255); + LOG_DEBUG(F("Adding analog I/O Counter sensor on GPIO%d"), sensor.gpio()); + pinMode(sensor.gpio(), INPUT_PULLUP); + if (sensor.gpio() == 25 || sensor.gpio() == 26) { + dacWrite(sensor.gpio(), 255); } sensor.polltime_ = 0; - sensor.poll_ = digitalRead(sensor.id()); + sensor.poll_ = digitalRead(sensor.gpio()); publish_sensor(sensor); } else if (sensor.type() == AnalogType::TIMER || sensor.type() == AnalogType::RATE) { - LOG_DEBUG(F("Adding analog Timer/Rate sensor on GPIO%d"), sensor.id()); - pinMode(sensor.id(), INPUT_PULLUP); + LOG_DEBUG(F("Adding analog Timer/Rate sensor on GPIO%d"), sensor.gpio()); + pinMode(sensor.gpio(), INPUT_PULLUP); sensor.polltime_ = uuid::get_uptime(); sensor.last_polltime_ = uuid::get_uptime(); - sensor.poll_ = digitalRead(sensor.id()); + sensor.poll_ = digitalRead(sensor.gpio()); sensor.set_offset(0); sensor.set_value(0); publish_sensor(sensor); } else if (sensor.type() == AnalogType::DIGITAL_IN) { - LOG_DEBUG(F("Adding analog Read sensor on GPIO%d"), sensor.id()); - pinMode(sensor.id(), INPUT_PULLUP); - sensor.set_value(digitalRead(sensor.id())); // initial value - sensor.set_uom(0); // no uom, just for safe measures + LOG_DEBUG(F("Adding analog Read sensor on GPIO%d"), sensor.gpio()); + pinMode(sensor.gpio(), INPUT_PULLUP); + sensor.set_value(digitalRead(sensor.gpio())); // initial value + sensor.set_uom(0); // no uom, just for safe measures sensor.polltime_ = 0; - sensor.poll_ = digitalRead(sensor.id()); + sensor.poll_ = digitalRead(sensor.gpio()); publish_sensor(sensor); } else if (sensor.type() == AnalogType::DIGITAL_OUT) { - LOG_DEBUG(F("Adding analog Write sensor on GPIO%d"), sensor.id()); - pinMode(sensor.id(), OUTPUT); - if (sensor.id() == 25 || sensor.id() == 26) { + LOG_DEBUG(F("Adding analog Write sensor on GPIO%d"), sensor.gpio()); + pinMode(sensor.gpio(), OUTPUT); + if (sensor.gpio() == 25 || sensor.gpio() == 26) { if (sensor.offset() > 255) { sensor.set_offset(255); } else if (sensor.offset() < 0) { sensor.set_offset(0); } - dacWrite(sensor.id(), sensor.offset()); + dacWrite(sensor.gpio(), sensor.offset()); sensor.set_value(sensor.offset()); } else { - digitalWrite(sensor.id(), sensor.offset() > 0 ? 1 : 0); - sensor.set_value(digitalRead(sensor.id())); + digitalWrite(sensor.gpio(), sensor.offset() > 0 ? 1 : 0); + sensor.set_value(digitalRead(sensor.gpio())); } sensor.set_uom(0); // no uom, just for safe measures publish_sensor(sensor); } else if (sensor.type() >= AnalogType::PWM_0) { - LOG_DEBUG(F("Adding PWM output sensor on GPIO%d"), sensor.id()); + LOG_DEBUG(F("Adding PWM output sensor on GPIO%d"), sensor.gpio()); uint channel = sensor.type() - AnalogType::PWM_0; ledcSetup(channel, sensor.factor(), 13); - ledcAttachPin(sensor.id(), channel); + ledcAttachPin(sensor.gpio(), channel); if (sensor.offset() > 100) { sensor.set_offset(100); } else if (sensor.offset() < 0) { @@ -193,8 +193,8 @@ void AnalogSensor::measure() { // go through the list of adc sensors for (auto & sensor : sensors_) { if (sensor.type() == AnalogType::ADC) { - uint16_t a = analogReadMilliVolts(sensor.id()); // e.g. ADC1_CHANNEL_0_GPIO_NUM - if (!sensor.analog_) { // init first time + uint16_t a = analogReadMilliVolts(sensor.gpio()); // e.g. ADC1_CHANNEL_0_GPIO_NUM + if (!sensor.analog_) { // init first time sensor.analog_ = a; sensor.sum_ = a * 512; } else { // simple moving average filter @@ -218,7 +218,7 @@ void AnalogSensor::measure() { if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::COUNTER || sensor.type() == AnalogType::TIMER || sensor.type() == AnalogType::RATE) { auto old_value = sensor.value(); // remember current value before reading - auto current_reading = digitalRead(sensor.id()); + auto current_reading = digitalRead(sensor.gpio()); if (sensor.poll_ != current_reading) { // check for pinchange sensor.polltime_ = uuid::get_uptime(); // remember time of pinchange sensor.poll_ = current_reading; @@ -258,17 +258,17 @@ void AnalogSensor::loop() { } // update analog information name and offset -bool AnalogSensor::update(uint8_t id, const std::string & name, float offset, float factor, uint8_t uom, int8_t type) { +bool AnalogSensor::update(uint8_t gpio, const std::string & name, float offset, float factor, uint8_t uom, int8_t type) { boolean found_sensor = false; // see if we can find the sensor in our customization list EMSESP::webCustomizationService.update( [&](WebCustomization & settings) { for (auto & AnalogCustomization : settings.analogCustomizations) { - if (AnalogCustomization.id == id) { + if (AnalogCustomization.gpio == gpio) { found_sensor = true; // found the record // see if it's marked for deletion if (type == AnalogType::MARK_DELETED) { - LOG_DEBUG(F("Removing analog sensor ID %d"), id); + LOG_DEBUG(F("Removing analog sensor GPIO %d"), gpio); settings.analogCustomizations.remove(AnalogCustomization); } else { // update existing record @@ -277,7 +277,7 @@ bool AnalogSensor::update(uint8_t id, const std::string & name, float offset, fl AnalogCustomization.factor = factor; AnalogCustomization.uom = uom; AnalogCustomization.type = type; - LOG_DEBUG(F("Customizing existing analog sensor ID %d"), id); + LOG_DEBUG(F("Customizing existing analog GPIO %d"), gpio); } return StateUpdateResult::CHANGED; // persist the change } @@ -288,7 +288,7 @@ bool AnalogSensor::update(uint8_t id, const std::string & name, float offset, fl // if the sensor exists and we're using HA, delete the old HA record if (found_sensor && Mqtt::ha_enabled()) { - remove_ha_topic(id); // id is the GPIO + remove_ha_topic(gpio); // the GPIO } // we didn't find it, it's new, so create and store it @@ -296,14 +296,14 @@ bool AnalogSensor::update(uint8_t id, const std::string & name, float offset, fl EMSESP::webCustomizationService.update( [&](WebCustomization & settings) { auto newSensor = AnalogCustomization(); - newSensor.id = id; + newSensor.gpio = gpio; newSensor.name = name; newSensor.offset = offset; newSensor.factor = factor; newSensor.uom = uom; newSensor.type = type; settings.analogCustomizations.push_back(newSensor); - LOG_DEBUG(F("Adding new customization for analog sensor ID %d"), id); + LOG_DEBUG(F("Adding new customization for analog sensor GPIO %d"), gpio); return StateUpdateResult::CHANGED; // persist the change }, "local"); @@ -339,15 +339,15 @@ void AnalogSensor::publish_sensor(const Sensor & sensor) const { } // send empty config topic to remove the entry from HA -void AnalogSensor::remove_ha_topic(const uint8_t id) const { +void AnalogSensor::remove_ha_topic(const uint8_t gpio) const { if (!Mqtt::ha_enabled()) { return; } #ifdef EMSESP_DEBUG - LOG_DEBUG(F("Removing HA config for analog sensor ID %d"), id); + LOG_DEBUG(F("Removing HA config for analog sensor GPIO %d"), gpio); #endif char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%d/config", Mqtt::base().c_str(), id); + snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%d/config", Mqtt::base().c_str(), gpio); Mqtt::publish_ha(topic); } @@ -372,7 +372,7 @@ void AnalogSensor::publish_values(const bool force) { if (Mqtt::is_nested() || Mqtt::ha_enabled()) { // nested char s[10]; - JsonObject dataSensor = doc.createNestedObject(Helpers::smallitoa(s, sensor.id())); + JsonObject dataSensor = doc.createNestedObject(Helpers::smallitoa(s, sensor.gpio())); dataSensor["name"] = sensor.name(); switch (sensor.type()) { case AnalogType::COUNTER: @@ -391,7 +391,7 @@ void AnalogSensor::publish_values(const bool force) { // create HA config if (Mqtt::ha_enabled() && (!sensor.ha_registered || force)) { - LOG_DEBUG(F("Recreating HA config for analog sensor ID %d"), sensor.id()); + LOG_DEBUG(F("Recreating HA config for analog sensor GPIO %d"), sensor.gpio()); StaticJsonDocument config; @@ -400,13 +400,13 @@ void AnalogSensor::publish_values(const bool force) { config["stat_t"] = stat_t; char str[50]; - snprintf(str, sizeof(str), "{{value_json['%d'].value}}", sensor.id()); + snprintf(str, sizeof(str), "{{value_json['%d'].value}}", sensor.gpio()); config["val_tpl"] = str; snprintf(str, sizeof(str), "Analog Sensor %s", sensor.name().c_str()); config["name"] = str; - snprintf(str, sizeof(str), "analogsensor_%d", sensor.id()); + snprintf(str, sizeof(str), "analogsensor_%d", sensor.gpio()); config["uniq_id"] = str; JsonObject dev = config.createNestedObject("dev"); @@ -414,7 +414,7 @@ void AnalogSensor::publish_values(const bool force) { ids.add("ems-esp"); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%d/config", Mqtt::base().c_str(), sensor.id()); + snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%d/config", Mqtt::base().c_str(), sensor.gpio()); Mqtt::publish_ha(topic, config.as()); @@ -437,7 +437,7 @@ void AnalogSensor::publish_values(const bool force) { bool AnalogSensor::get_value_info(JsonObject & output, const char * cmd, const int8_t id) const { for (const auto & sensor : sensors_) { if (strcmp(cmd, sensor.name().c_str()) == 0) { - output["id"] = sensor.id(); + output["gpio"] = sensor.gpio(); output["name"] = sensor.name(); output["type"] = sensor.type(); output["uom"] = sensor.uom(); @@ -460,7 +460,7 @@ bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject for (const auto & sensor : sensors_) { if (id == -1) { // show number and id JsonObject dataSensor = output.createNestedObject(sensor.name()); - dataSensor["id"] = sensor.id(); + dataSensor["gpio"] = sensor.gpio(); dataSensor["type"] = FL_(enum_sensortype)[sensor.type()]; if (sensor.type() == AnalogType::ADC) { dataSensor["uom"] = EMSdevice::uom_to_string(sensor.uom()); @@ -486,8 +486,8 @@ bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject } // this creates the sensor, initializing everything -AnalogSensor::Sensor::Sensor(const uint8_t id, const std::string & name, const float offset, const float factor, const uint8_t uom, const int8_t type) - : id_(id) +AnalogSensor::Sensor::Sensor(const uint8_t gpio, const std::string & name, const float offset, const float factor, const uint8_t uom, const int8_t type) + : gpio_(gpio) , name_(name) , offset_(offset) , factor_(factor) @@ -500,20 +500,20 @@ AnalogSensor::Sensor::Sensor(const uint8_t id, const std::string & name, const f std::string AnalogSensor::Sensor::name() const { if (name_.empty()) { char name[50]; - snprintf(name, sizeof(name), "Analog Sensor GPIO%d", id_); + snprintf(name, sizeof(name), "Analog Sensor GPIO%d", gpio_); return name; } return name_; } // set the counter value, id is gpio-no -bool AnalogSensor::command_setvalue(const char * value, const int8_t id) { +bool AnalogSensor::command_setvalue(const char * value, const int8_t gpio) { float val; if (!Helpers::value2float(value, val)) { return false; } for (auto & sensor : sensors_) { - if (sensor.id() == id) { + if (sensor.gpio() == gpio) { if (sensor.type() == AnalogType::COUNTER) { if (val < 0 || value[0] == '+') { // sign corrects values sensor.set_offset(sensor.value() + val); @@ -529,18 +529,18 @@ bool AnalogSensor::command_setvalue(const char * value, const int8_t id) { return true; } else if (sensor.type() == AnalogType::DIGITAL_OUT) { uint8_t v = val; - if (sensor.id() == 25 || sensor.id() == 26) { + if (sensor.gpio() == 25 || sensor.gpio() == 26) { sensor.set_offset(v); sensor.set_value(v); - pinMode(sensor.id(), OUTPUT); - dacWrite(sensor.id(), sensor.offset()); + pinMode(sensor.gpio(), OUTPUT); + dacWrite(sensor.gpio(), sensor.offset()); publish_sensor(sensor); return true; } else if (v == 0 || v == 1) { sensor.set_offset(v); sensor.set_value(v); - pinMode(sensor.id(), OUTPUT); - digitalWrite(sensor.id(), sensor.offset() > 0 ? 1 : 0); + pinMode(sensor.gpio(), OUTPUT); + digitalWrite(sensor.gpio(), sensor.offset() > 0 ? 1 : 0); publish_sensor(sensor); return true; } diff --git a/src/analogsensor.h b/src/analogsensor.h index fc7f72ea6..3c10c11c8 100644 --- a/src/analogsensor.h +++ b/src/analogsensor.h @@ -36,7 +36,7 @@ class AnalogSensor { public: class Sensor { public: - Sensor(const uint8_t id, const std::string & name, const float offset, const float factor, const uint8_t uom, const int8_t type); + Sensor(const uint8_t gpio, const std::string & name, const float offset, const float factor, const uint8_t uom, const int8_t type); ~Sensor() = default; void set_offset(const float offset) { @@ -48,8 +48,8 @@ class AnalogSensor { name_ = name; } - uint8_t id() const { - return id_; + uint8_t gpio() const { + return gpio_; } float value() const { @@ -99,7 +99,7 @@ class AnalogSensor { uint32_t last_polltime_ = 0; // for timer private: - uint8_t id_; + uint8_t gpio_; std::string name_; float offset_; float factor_; @@ -157,7 +157,7 @@ class AnalogSensor { return sensors_.size(); } - bool update(uint8_t id, const std::string & name, float offset, float factor, uint8_t uom, int8_t type); + bool update(uint8_t gpio, const std::string & name, float offset, float factor, uint8_t uom, int8_t type); bool get_value_info(JsonObject & output, const char * cmd, const int8_t id) const; #ifdef EMSESP_DEBUG @@ -171,7 +171,7 @@ class AnalogSensor { static uuid::log::Logger logger_; void remove_ha_topic(const uint8_t id) const; - bool command_setvalue(const char * value, const int8_t id); + bool command_setvalue(const char * value, const int8_t gpio); void measure(); bool command_info(const char * value, const int8_t id, JsonObject & output) const; bool command_commands(const char * value, const int8_t id, JsonObject & output); diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index 3d4be1a15..bb4d3f624 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -149,7 +149,7 @@ void DallasSensor::loop() { // check if we already have this sensor bool found = false; for (auto & sensor : sensors_) { - if (sensor.id() == get_id(addr)) { + if (sensor.internal_id() == get_id(addr)) { t += sensor.offset(); if (t != sensor.temperature_c) { publish_sensor(sensor); @@ -171,7 +171,7 @@ void DallasSensor::loop() { sensors_.back().apply_customization(); publish_sensor(sensors_.back()); // call publish single // sort the sensors based on name - std::sort(sensors_.begin(), sensors_.end(), [](const Sensor & a, const Sensor & b) { return a.name() < b.name(); }); + // std::sort(sensors_.begin(), sensors_.end(), [](const Sensor & a, const Sensor & b) { return a.name() < b.name(); }); } } else { sensorfails_++; @@ -180,12 +180,12 @@ void DallasSensor::loop() { default: sensorfails_++; - LOG_ERROR(F("Unknown dallas sensor %s"), Sensor(addr).id_str().c_str()); + LOG_ERROR(F("Unknown dallas sensor %s"), Sensor(addr).id().c_str()); break; } } else { sensorfails_++; - LOG_ERROR(F("Invalid dallas sensor %s"), Sensor(addr).id_str().c_str()); + LOG_ERROR(F("Invalid dallas sensor %s"), Sensor(addr).id().c_str()); } } else { if (!parasite_) { @@ -229,7 +229,7 @@ bool DallasSensor::temperature_convert_complete() { int16_t DallasSensor::get_temperature_c(const uint8_t addr[]) { #ifndef EMSESP_STANDALONE if (!bus_.reset()) { - LOG_ERROR(F("Bus reset failed before reading scratchpad from %s"), Sensor(addr).id_str().c_str()); + LOG_ERROR(F("Bus reset failed before reading scratchpad from %s"), Sensor(addr).id().c_str()); return EMS_VALUE_SHORT_NOTSET; } YIELD; @@ -241,7 +241,7 @@ int16_t DallasSensor::get_temperature_c(const uint8_t addr[]) { YIELD; if (!bus_.reset()) { - LOG_ERROR(F("Bus reset failed after reading scratchpad from %s"), Sensor(addr).id_str().c_str()); + LOG_ERROR(F("Bus reset failed after reading scratchpad from %s"), Sensor(addr).id().c_str()); return EMS_VALUE_SHORT_NOTSET; } YIELD; @@ -257,7 +257,7 @@ int16_t DallasSensor::get_temperature_c(const uint8_t addr[]) { scratchpad[6], scratchpad[7], scratchpad[8], - Sensor(addr).id_str().c_str()); + Sensor(addr).id().c_str()); return EMS_VALUE_SHORT_NOTSET; } @@ -290,15 +290,15 @@ int16_t DallasSensor::get_temperature_c(const uint8_t addr[]) { } // update dallas information name and offset -bool DallasSensor::update(const std::string & id_str, const std::string & name, int16_t offset) { +bool DallasSensor::update(const std::string & id, const std::string & name, int16_t offset) { // find the sensor for (auto & sensor : sensors_) { - if (sensor.id_str() == id_str) { + if (sensor.id() == id) { // found a match, update the sensor object // if HA is enabled then delete the old record if (Mqtt::ha_enabled()) { - remove_ha_topic(id_str); + remove_ha_topic(id); } sensor.set_name(name); @@ -310,21 +310,21 @@ bool DallasSensor::update(const std::string & id_str, const std::string & name, // look it up to see if it exists bool found = false; for (auto & SensorCustomization : settings.sensorCustomizations) { - if (SensorCustomization.id_str == id_str) { + if (SensorCustomization.id == id) { SensorCustomization.name = name; SensorCustomization.offset = offset; found = true; - LOG_DEBUG(F("Customizing existing sensor ID %s"), id_str.c_str()); + LOG_DEBUG(F("Customizing existing sensor ID %s"), id.c_str()); break; } } if (!found) { SensorCustomization newSensor = SensorCustomization(); - newSensor.id_str = id_str; + newSensor.id = id; newSensor.name = name; newSensor.offset = offset; settings.sensorCustomizations.push_back(newSensor); - LOG_DEBUG(F("Adding new customization for sensor ID %s"), id_str.c_str()); + LOG_DEBUG(F("Adding new customization for sensor ID %s"), id.c_str()); } sensor.ha_registered = false; // it's changed so we may need to recreate the HA config return StateUpdateResult::CHANGED; @@ -361,7 +361,7 @@ bool DallasSensor::command_info(const char * value, const int8_t id, JsonObject for (const auto & sensor : sensors_) { if (id == -1) { // show number and id JsonObject dataSensor = output.createNestedObject(sensor.name()); - dataSensor["id_str"] = sensor.id_str(); + dataSensor["id"] = sensor.id(); if (Helpers::hasValue(sensor.temperature_c)) { dataSensor["temp"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } @@ -377,8 +377,8 @@ bool DallasSensor::command_info(const char * value, const int8_t id, JsonObject bool DallasSensor::get_value_info(JsonObject & output, const char * cmd, const int8_t id) { for (const auto & sensor : sensors_) { if (strcmp(cmd, sensor.name().c_str()) == 0) { - output["id_str"] = sensor.id_str(); - output["name"] = sensor.name(); + output["id"] = sensor.id(); + output["name"] = sensor.name(); if (Helpers::hasValue(sensor.temperature_c)) { output["value"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } @@ -408,15 +408,15 @@ void DallasSensor::publish_sensor(const Sensor & sensor) { } // send empty config topic to remove the entry from HA -void DallasSensor::remove_ha_topic(const std::string & id_str) { +void DallasSensor::remove_ha_topic(const std::string & id) { if (!Mqtt::ha_enabled()) { return; } #ifdef EMSESP_DEBUG - LOG_DEBUG(F("Removing HA config for temperature sensor ID %s"), id_str.c_str()); + LOG_DEBUG(F("Removing HA config for temperature sensor ID %s"), id.c_str()); #endif // use '_' as HA doesn't like '-' in the topic name - std::string sensorid = id_str; + std::string sensorid = id; std::replace(sensorid.begin(), sensorid.end(), '-', '_'); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; snprintf(topic, sizeof(topic), "sensor/%s/dallassensor_%s/config", Mqtt::base().c_str(), sensorid.c_str()); @@ -442,7 +442,7 @@ void DallasSensor::publish_values(const bool force) { for (auto & sensor : sensors_) { bool has_value = Helpers::hasValue(sensor.temperature_c); if (Mqtt::is_nested() || Mqtt::ha_enabled()) { - JsonObject dataSensor = doc.createNestedObject(sensor.id_str()); + JsonObject dataSensor = doc.createNestedObject(sensor.id()); dataSensor["name"] = sensor.name(); if (has_value) { dataSensor["temp"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); @@ -455,7 +455,7 @@ void DallasSensor::publish_values(const bool force) { // to e.g. homeassistant/sensor/ems-esp/dallassensor_28-233D-9497-0C03/config if (Mqtt::ha_enabled()) { if (!sensor.ha_registered || force) { - LOG_DEBUG(F("Recreating HA config for sensor ID %s"), sensor.id_str().c_str()); + LOG_DEBUG(F("Recreating HA config for sensor ID %s"), sensor.id().c_str()); StaticJsonDocument config; config["dev_cla"] = FJSON("temperature"); @@ -467,13 +467,13 @@ void DallasSensor::publish_values(const bool force) { config["unit_of_meas"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); char str[50]; - snprintf(str, sizeof(str), "{{value_json['%s'].temp}}", sensor.id_str().c_str()); + snprintf(str, sizeof(str), "{{value_json['%s'].temp}}", sensor.id().c_str()); config["val_tpl"] = str; snprintf(str, sizeof(str), "Temperature Sensor %s", sensor.name().c_str()); config["name"] = str; - snprintf(str, sizeof(str), "dallasensor_%s", sensor.id_str().c_str()); + snprintf(str, sizeof(str), "dallasensor_%s", sensor.id().c_str()); config["uniq_id"] = str; JsonObject dev = config.createNestedObject("dev"); @@ -482,7 +482,7 @@ void DallasSensor::publish_values(const bool force) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; // use '_' as HA doesn't like '-' in the topic name - std::string sensorid = sensor.id_str(); + std::string sensorid = sensor.id(); std::replace(sensorid.begin(), sensorid.end(), '-', '_'); snprintf(topic, sizeof(topic), "sensor/%s/dallassensor_%s/config", Mqtt::base().c_str(), sensorid.c_str()); @@ -500,18 +500,18 @@ void DallasSensor::publish_values(const bool force) { // skip crc from id DallasSensor::Sensor::Sensor(const uint8_t addr[]) - : id_(((uint64_t)addr[0] << 48) | ((uint64_t)addr[1] << 40) | ((uint64_t)addr[2] << 32) | ((uint64_t)addr[3] << 24) | ((uint64_t)addr[4] << 16) - | ((uint64_t)addr[5] << 8) | ((uint64_t)addr[6])) { + : internal_id_(((uint64_t)addr[0] << 48) | ((uint64_t)addr[1] << 40) | ((uint64_t)addr[2] << 32) | ((uint64_t)addr[3] << 24) | ((uint64_t)addr[4] << 16) + | ((uint64_t)addr[5] << 8) | ((uint64_t)addr[6])) { // create ID string - char id[20]; - snprintf(id, - sizeof(id), + char id_str[20]; + snprintf(id_str, + sizeof(id_str), "%02X-%04X-%04X-%04X", - (unsigned int)(id_ >> 48) & 0xFF, - (unsigned int)(id_ >> 32) & 0xFFFF, - (unsigned int)(id_ >> 16) & 0xFFFF, - (unsigned int)(id_)&0xFFFF); - id_str_ = std::string(id); + (unsigned int)(internal_id_ >> 48) & 0xFF, + (unsigned int)(internal_id_ >> 32) & 0xFFFF, + (unsigned int)(internal_id_ >> 16) & 0xFFFF, + (unsigned int)(internal_id_)&0xFFFF); + id_ = std::string(id_str); name_ = std::string{}; // name (alias) is empty offset_ = 0; // 0 degrees offset } @@ -525,7 +525,7 @@ uint64_t DallasSensor::get_id(const uint8_t addr[]) { // if empty, return the ID as a string std::string DallasSensor::Sensor::name() const { if (name_.empty()) { - return id_str_; + return id_; } return name_; } @@ -538,9 +538,9 @@ bool DallasSensor::Sensor::apply_customization() { if (!sensors.empty()) { for (const auto & sensor : sensors) { #if defined(EMSESP_DEBUG) - LOG_DEBUG(F("Loading customization for dallas sensor %s"), sensor.id_str.c_str()); + LOG_DEBUG(F("Loading customization for dallas sensor %s"), sensor.id.c_str()); #endif - if (id_str_ == sensor.id_str) { + if (id_ == sensor.id) { set_name(sensor.name); set_offset(sensor.offset); return true; diff --git a/src/dallassensor.h b/src/dallassensor.h index c9567e32f..009db5fa6 100644 --- a/src/dallassensor.h +++ b/src/dallassensor.h @@ -40,12 +40,12 @@ class DallasSensor { Sensor(const uint8_t addr[]); ~Sensor() = default; - uint64_t id() const { - return id_; + uint64_t internal_id() const { + return internal_id_; } - std::string id_str() const { - return id_str_; + std::string id() const { + return id_; } int16_t offset() const { @@ -67,8 +67,8 @@ class DallasSensor { bool ha_registered = false; private: - uint64_t id_; - std::string id_str_; + uint64_t internal_id_; + std::string id_; std::string name_; int16_t offset_; }; @@ -109,7 +109,7 @@ class DallasSensor { return sensors_.size(); } - bool update(const std::string & id_str, const std::string & name, int16_t offset); + bool update(const std::string & id, const std::string & name, int16_t offset); #ifdef EMSESP_DEBUG void test(); diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 4711ddcbf..fe52772a7 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -656,119 +656,118 @@ void EMSdevice::generate_values_web(JsonObject & output) { output["label"] = to_string_short(); JsonArray data = output.createNestedArray("data"); - // do two passes. First for all entities marked as favorites, then for all others. This sorts the list. - for (int8_t fav = 1; fav >= 0; fav--) { - for (auto & dv : devicevalues_) { - // check conditions: - // 1. full_name cannot be empty - // 2. it must have a valid value, if it is not a command like 'reset' - // 3. show favorites first - bool show = (fav && dv.has_state(DeviceValueState::DV_FAVORITE)) || (!fav && !dv.has_state(DeviceValueState::DV_FAVORITE)); - if (show && !dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { - JsonObject obj = data.createNestedObject(); // create the object, we know there is a value - uint8_t fahrenheit = 0; + for (auto & dv : devicevalues_) { + // check conditions: + // 1. full_name cannot be empty + // 2. it must have a valid value, if it is not a command like 'reset' + // 3. show favorites first + if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { + JsonObject obj = data.createNestedObject(); // create the object, we know there is a value + uint8_t fahrenheit = 0; - // handle Booleans (true, false), use strings, no native true/false) - if (dv.type == DeviceValueType::BOOL) { - bool value_b = (bool)*(uint8_t *)(dv.value_p); - if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - obj["v"] = value_b ? 1 : 0; - } else { - char s[7]; - obj["v"] = Helpers::render_boolean(s, value_b); - } - } - - // handle TEXT strings - else if (dv.type == DeviceValueType::STRING) { - obj["v"] = (char *)(dv.value_p); - } - - // handle ENUMs - else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { - obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; - } - - // handle numbers - else { - // If a divider is specified, do the division to 2 decimals places and send back as double/float - // otherwise force as an integer whole - // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler - int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; - fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; - - if ((dv.type == DeviceValueType::INT) && Helpers::hasValue(*(int8_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::UINT) && Helpers::hasValue(*(uint8_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::SHORT) && Helpers::hasValue(*(int16_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::USHORT) && Helpers::hasValue(*(uint16_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::ULONG) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint32_t *)(dv.value_p), divider, fahrenheit); - } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - uint32_t time_value = *(uint32_t *)(dv.value_p); - obj["v"] = (divider > 0) ? time_value / divider : time_value; // sometimes we need to divide by 60 - } - } - - // add the unit of measure (uom) - obj["u"] = fahrenheit ? (uint8_t)DeviceValueUOM::FAHRENHEIT : dv.uom; - - auto mask = Helpers::hextoa((uint8_t)(dv.state >> 4), false); // create mask to a 2-char string - - // add name, prefixing the tag if it exists - if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - obj["n"] = mask + read_flash_string(dv.full_name); - } else if (dv.tag < DeviceValueTAG::TAG_HC1) { - obj["n"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + // handle Booleans (true, false), use strings, no native true/false) + if (dv.type == DeviceValueType::BOOL) { + bool value_b = (bool)*(uint8_t *)(dv.value_p); + if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + obj["v"] = value_b ? 1 : 0; } else { - obj["n"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + char s[7]; + obj["v"] = Helpers::render_boolean(s, value_b); } + } - // add commands and options - if (dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY)) { - // add the name of the Command function - if (dv.tag >= DeviceValueTAG::TAG_HC1) { - obj["c"] = tag_to_mqtt(dv.tag) + "/" + read_flash_string(dv.short_name); - } else { - obj["c"] = dv.short_name; - } - // add the Command options - if (dv.type == DeviceValueType::ENUM || (dv.type == DeviceValueType::CMD && dv.options_size > 1)) { - JsonArray l = obj.createNestedArray("l"); - for (uint8_t i = 0; i < dv.options_size; i++) { - if (!read_flash_string(dv.options[i]).empty()) { - l.add(read_flash_string(dv.options[i])); - } - } - } else if (dv.type == DeviceValueType::BOOL) { - JsonArray l = obj.createNestedArray("l"); - char result[10]; - l.add(Helpers::render_boolean(result, false)); - l.add(Helpers::render_boolean(result, true)); - } - // add command help template - else if (dv.type == DeviceValueType::STRING || dv.type == DeviceValueType::CMD) { - if (dv.options_size == 1) { - obj["h"] = dv.options[0]; + // handle TEXT strings + else if (dv.type == DeviceValueType::STRING) { + obj["v"] = (char *)(dv.value_p); + } + + // handle ENUMs + else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { + obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; + } + + // handle numbers + else { + // If a divider is specified, do the division to 2 decimals places and send back as double/float + // otherwise force as an integer whole + // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler + int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; + + if ((dv.type == DeviceValueType::INT) && Helpers::hasValue(*(int8_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::UINT) && Helpers::hasValue(*(uint8_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::SHORT) && Helpers::hasValue(*(int16_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::USHORT) && Helpers::hasValue(*(uint16_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::ULONG) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { + obj["v"] = Helpers::round2(*(uint32_t *)(dv.value_p), divider, fahrenheit); + } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { + uint32_t time_value = *(uint32_t *)(dv.value_p); + obj["v"] = (divider > 0) ? time_value / divider : time_value; // sometimes we need to divide by 60 + } else { + // must have a value for sorting to work + obj["v"] = ""; + } + } + + // add the unit of measure (uom) + obj["u"] = fahrenheit ? (uint8_t)DeviceValueUOM::FAHRENHEIT : dv.uom; + + auto mask = Helpers::hextoa((uint8_t)(dv.state >> 4), false); // create mask to a 2-char string + + // add name, prefixing the tag if it exists. This is the id used for the table sorting + if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { + obj["id"] = mask + read_flash_string(dv.full_name); + } else if (dv.tag < DeviceValueTAG::TAG_HC1) { + obj["id"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + } else { + obj["id"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + } + + // add commands and options + if (dv.has_cmd && !dv.has_state(DeviceValueState::DV_READONLY)) { + // add the name of the Command function + if (dv.tag >= DeviceValueTAG::TAG_HC1) { + obj["c"] = tag_to_mqtt(dv.tag) + "/" + read_flash_string(dv.short_name); + } else { + obj["c"] = dv.short_name; + } + // add the Command options + if (dv.type == DeviceValueType::ENUM || (dv.type == DeviceValueType::CMD && dv.options_size > 1)) { + JsonArray l = obj.createNestedArray("l"); + for (uint8_t i = 0; i < dv.options_size; i++) { + if (!read_flash_string(dv.options[i]).empty()) { + l.add(read_flash_string(dv.options[i])); } } - // add steps to numeric values with divider/multiplier - else { - int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; - char s[10]; - if (divider > 0) { - obj["s"] = Helpers::render_value(s, (float)1 / divider, 1); - } else if (divider < 0) { - obj["s"] = Helpers::render_value(s, (-1) * divider, 0); - } - int16_t dv_set_min, dv_set_max; - if (dv.get_min_max(dv_set_min, dv_set_max)) { - obj["m"] = Helpers::render_value(s, dv_set_min, 0); - obj["x"] = Helpers::render_value(s, dv_set_max, 0); - } + } else if (dv.type == DeviceValueType::BOOL) { + JsonArray l = obj.createNestedArray("l"); + char result[10]; + l.add(Helpers::render_boolean(result, false)); + l.add(Helpers::render_boolean(result, true)); + } + // add command help template + else if (dv.type == DeviceValueType::STRING || dv.type == DeviceValueType::CMD) { + if (dv.options_size == 1) { + obj["h"] = dv.options[0]; + } + } + // add steps to numeric values with divider/multiplier + else { + int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + char s[10]; + if (divider > 0) { + obj["s"] = Helpers::render_value(s, (float)1 / divider, 1); + } else if (divider < 0) { + obj["s"] = Helpers::render_value(s, (-1) * divider, 0); + } + int16_t dv_set_min, dv_set_max; + if (dv.get_min_max(dv_set_min, dv_set_max)) { + obj["m"] = Helpers::render_value(s, dv_set_min, 0); + obj["x"] = Helpers::render_value(s, dv_set_max, 0); } } } @@ -838,19 +837,22 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { obj["v"] = (divider > 0) ? time_value / divider : time_value * factor; // sometimes we need to divide by 60 } } + } else { + // must always have v for sorting to work in web + obj["v"] = ""; } - // add name, prefixing the tag if it exists + // add name, prefixing the tag if it exists as the id (key for table sorting) if (dv.full_name) { if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - obj["n"] = dv.full_name; + obj["id"] = dv.full_name; } else { char name[50]; snprintf(name, sizeof(name), "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); - obj["n"] = name; + obj["id"] = name; } } else { - obj["n"] = ""; + obj["id"] = ""; } // shortname diff --git a/src/emsesp.cpp b/src/emsesp.cpp index f2e8e93b8..4e37ee919 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -432,12 +432,12 @@ void EMSESP::show_sensor_values(uuid::console::Shell & shell) { (fahrenheit == 0) ? 'C' : 'F', COLOR_RESET, Helpers::render_value(s2, sensor.offset(), 10, fahrenheit), - sensor.id_str().c_str()); + sensor.id().c_str()); } else { shell.printfln(F(" %s (offset %s, ID: %s)"), sensor.name().c_str(), Helpers::render_value(s, sensor.offset(), 10, fahrenheit), - sensor.id_str().c_str()); + sensor.id().c_str()); } } shell.println(); diff --git a/src/system.cpp b/src/system.cpp index f2063415f..4eaa88ec0 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1036,7 +1036,7 @@ bool System::command_customizations(const char * value, const int8_t id, JsonObj JsonArray sensorsJson = node.createNestedArray("sensors"); for (const auto & sensor : settings.sensorCustomizations) { JsonObject sensorJson = sensorsJson.createNestedObject(); - sensorJson["id_str"] = sensor.id_str; // key, is + sensorJson["id"] = sensor.id; // key sensorJson["name"] = sensor.name; // n sensorJson["offset"] = sensor.offset; // o } @@ -1044,7 +1044,7 @@ bool System::command_customizations(const char * value, const int8_t id, JsonObj JsonArray analogJson = node.createNestedArray("analogs"); for (const AnalogCustomization & sensor : settings.analogCustomizations) { JsonObject sensorJson = analogJson.createNestedObject(); - sensorJson["gpio"] = sensor.id; + sensorJson["gpio"] = sensor.gpio; sensorJson["name"] = sensor.name; if (EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX) { sensorJson["type"] = sensor.type; diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 3b01c0291..3a0afb88e 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -61,7 +61,7 @@ void WebCustomization::read(WebCustomization & settings, JsonObject & root) { JsonArray sensorsJson = root.createNestedArray("sensors"); for (const SensorCustomization & sensor : settings.sensorCustomizations) { JsonObject sensorJson = sensorsJson.createNestedObject(); - sensorJson["id_str"] = sensor.id_str; // is + sensorJson["id"] = sensor.id; // is sensorJson["name"] = sensor.name; // n sensorJson["offset"] = sensor.offset; // o } @@ -70,7 +70,7 @@ void WebCustomization::read(WebCustomization & settings, JsonObject & root) { JsonArray analogJson = root.createNestedArray("analogs"); for (const AnalogCustomization & sensor : settings.analogCustomizations) { JsonObject sensorJson = analogJson.createNestedObject(); - sensorJson["id"] = sensor.id; // i + sensorJson["gpio"] = sensor.gpio; // g sensorJson["name"] = sensor.name; // n sensorJson["offset"] = sensor.offset; // o sensorJson["factor"] = sensor.factor; // f @@ -101,7 +101,7 @@ StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & for (const JsonObject sensorJson : root["sensors"].as()) { // create each of the sensor, overwritting any previous settings auto sensor = SensorCustomization(); - sensor.id_str = sensorJson["id_str"].as(); + sensor.id = sensorJson["id"].as(); sensor.name = sensorJson["name"].as(); sensor.offset = sensorJson["offset"]; settings.sensorCustomizations.push_back(sensor); // add to list @@ -114,7 +114,7 @@ StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & for (const JsonObject analogJson : root["analogs"].as()) { // create each of the sensor, overwritting any previous settings auto sensor = AnalogCustomization(); - sensor.id = analogJson["id"]; + sensor.gpio = analogJson["gpio"]; sensor.name = analogJson["name"].as(); sensor.offset = analogJson["offset"]; sensor.factor = analogJson["factor"]; diff --git a/src/web/WebCustomizationService.h b/src/web/WebCustomizationService.h index 526259dbe..d595c1f43 100644 --- a/src/web/WebCustomizationService.h +++ b/src/web/WebCustomizationService.h @@ -35,14 +35,14 @@ namespace emsesp { // Customization for dallas sensor class SensorCustomization { public: - std::string id_str; + std::string id; std::string name; uint16_t offset; }; class AnalogCustomization { public: - uint8_t id; + uint8_t gpio; std::string name; float offset; float factor; @@ -51,7 +51,7 @@ class AnalogCustomization { // used for removing from a list bool operator==(const AnalogCustomization & a) const { - return id == a.id; + return gpio == a.gpio; } bool operator!=(const AnalogCustomization & a) const { return !operator==(a); diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index b4d61dc65..d1df1596e 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -76,17 +76,18 @@ void WebDataService::core_data(AsyncWebServerRequest * request) { // list is already sorted by device type // Ignore Contoller JsonArray devices = root.createNestedArray("devices"); + char buffer[3]; for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice && (emsdevice->device_type() != EMSdevice::DeviceType::CONTROLLER || emsdevice->count_entities() > 0)) { JsonObject obj = devices.createNestedObject(); - obj["i"] = emsdevice->unique_id(); // a unique id - obj["t"] = emsdevice->device_type_name(); // type - obj["b"] = emsdevice->brand_to_string(); // brand - obj["n"] = emsdevice->name(); // name - obj["d"] = emsdevice->device_id(); // deviceid - obj["p"] = emsdevice->product_id(); // productid - obj["v"] = emsdevice->version(); // version - obj["e"] = emsdevice->count_entities(); // number of entities (device values) + obj["id"] = Helpers::smallitoa(buffer, emsdevice->unique_id()); // a unique id as a string + obj["t"] = emsdevice->device_type_name(); // type + obj["b"] = emsdevice->brand_to_string(); // brand + obj["n"] = emsdevice->name(); // name + obj["d"] = emsdevice->device_id(); // deviceid + obj["p"] = emsdevice->product_id(); // productid + obj["v"] = emsdevice->version(); // version + obj["e"] = emsdevice->count_entities(); // number of entities (device values) } } @@ -110,8 +111,8 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) { if (EMSESP::dallassensor_.have_sensors()) { for (const auto & sensor : EMSESP::dallassensor_.sensors()) { JsonObject obj = sensors.createNestedObject(); - obj["is"] = sensor.id_str(); // id - obj["n"] = sensor.name(); // name + obj["id"] = sensor.id(); // id as string + obj["n"] = sensor.name(); // name if (EMSESP::system_.fahrenheit()) { if (Helpers::hasValue(sensor.temperature_c)) { obj["t"] = (float)sensor.temperature_c * 0.18 + 32; @@ -129,14 +130,16 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) { } // analog sensors - // assume list is already sorted by id JsonArray analogs = root.createNestedArray("analogs"); if (EMSESP::analog_enabled() && EMSESP::analogsensor_.have_sensors()) { + uint8_t count = 0; + char buffer[3]; for (const auto & sensor : EMSESP::analogsensor_.sensors()) { // don't send if it's marked for removal if (sensor.type() != AnalogSensor::AnalogType::MARK_DELETED) { JsonObject obj = analogs.createNestedObject(); - obj["i"] = sensor.id(); + obj["id"] = Helpers::smallitoa(buffer, ++count); // needed for sorting table + obj["g"] = sensor.gpio(); obj["n"] = sensor.name(); obj["u"] = sensor.uom(); obj["o"] = sensor.offset(); @@ -145,6 +148,8 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) { if (sensor.type() != AnalogSensor::AnalogType::NOTUSED) { obj["v"] = Helpers::round2(sensor.value(), 0); // is optional and is a float + } else { + obj["v"] = 0; // must have a value for web sorting to work } } } @@ -169,6 +174,12 @@ void WebDataService::device_data(AsyncWebServerRequest * request, JsonVariant & #ifndef EMSESP_STANDALONE JsonObject output = response->getRoot(); emsdevice->generate_values_web(output); +#endif + +#ifdef EMSESP_USE_SERIAL +#ifdef EMSESP_DEBUG + serializeJson(output, Serial); +#endif #endif response->setLength(); request->send(response); @@ -246,8 +257,8 @@ void WebDataService::write_sensor(AsyncWebServerRequest * request, JsonVariant & if (json.is()) { JsonObject sensor = json; - std::string id_str = sensor["id_str"]; // this is the key - std::string name = sensor["name"]; + std::string id = sensor["id"]; // this is the key + std::string name = sensor["name"]; // calculate offset. We'll convert it to an int and * 10 float offset = sensor["offset"]; @@ -255,7 +266,7 @@ void WebDataService::write_sensor(AsyncWebServerRequest * request, JsonVariant & if (EMSESP::system_.fahrenheit()) { offset10 = offset / 0.18; } - ok = EMSESP::dallassensor_.update(id_str, name, offset10); + ok = EMSESP::dallassensor_.update(id, name, offset10); } AsyncWebServerResponse * response = request->beginResponse(ok ? 200 : 204); @@ -268,13 +279,13 @@ void WebDataService::write_analog(AsyncWebServerRequest * request, JsonVariant & if (json.is()) { JsonObject analog = json; - uint8_t id = analog["id"]; // this is the unique key + uint8_t gpio = analog["gpio"]; // this is the unique key, the GPIO std::string name = analog["name"]; float factor = analog["factor"]; float offset = analog["offset"]; uint8_t uom = analog["uom"]; int8_t type = analog["type"]; - ok = EMSESP::analogsensor_.update(id, name, offset, factor, uom, type); + ok = EMSESP::analogsensor_.update(gpio, name, offset, factor, uom, type); } AsyncWebServerResponse * response = request->beginResponse(ok ? 200 : 204); From 04a374c3803ba47f6c2b1d37db9224c72695ef2a Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 15 Apr 2022 16:22:05 +0200 Subject: [PATCH 227/319] more tables --- .../framework/security/ManageUsersForm.tsx | 181 +++++++++++------- interface/src/project/DashboardStatus.tsx | 151 ++++++++------- interface/src/project/types.ts | 31 +-- interface/src/types/security.ts | 1 + lib/framework/SecuritySettingsService.h | 1 + mock-api/server.js | 40 ++-- src/web/WebDataService.cpp | 11 +- src/web/WebStatusService.cpp | 79 +++++--- 8 files changed, 275 insertions(+), 220 deletions(-) diff --git a/interface/src/framework/security/ManageUsersForm.tsx b/interface/src/framework/security/ManageUsersForm.tsx index f5dbfaae2..16c30560d 100644 --- a/interface/src/framework/security/ManageUsersForm.tsx +++ b/interface/src/framework/security/ManageUsersForm.tsx @@ -1,6 +1,6 @@ import { FC, useContext, useState } from 'react'; -import { Button, IconButton, Table, TableBody, TableCell, TableFooter, TableHead, TableRow } from '@mui/material'; +import { Button, IconButton, Box } from '@mui/material'; import SaveIcon from '@mui/icons-material/Save'; import DeleteIcon from '@mui/icons-material/Delete'; import PersonAddIcon from '@mui/icons-material/PersonAdd'; @@ -9,6 +9,10 @@ import CheckIcon from '@mui/icons-material/Check'; import CloseIcon from '@mui/icons-material/Close'; import VpnKeyIcon from '@mui/icons-material/VpnKey'; +import { Table } from '@table-library/react-table-library/table'; +import { useTheme } from '@table-library/react-table-library/theme'; +import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; + import * as SecurityApi from '../../api/security'; import { SecuritySettings, User } from '../../types'; import { ButtonRow, FormLoader, MessageBox, SectionContent } from '../../components'; @@ -19,16 +23,6 @@ import { AuthenticatedContext } from '../../contexts/authentication'; import GenerateToken from './GenerateToken'; import UserForm from './UserForm'; -function compareUsers(a: User, b: User) { - if (a.username < b.username) { - return -1; - } - if (a.username > b.username) { - return 1; - } - return 0; -} - const ManageUsersForm: FC = () => { const { loadData, saving, data, setData, saveData, errorMessage } = useRest({ read: SecurityApi.readSecuritySettings, @@ -40,6 +34,45 @@ const ManageUsersForm: FC = () => { const [generatingToken, setGeneratingToken] = useState(); const authenticatedContext = useContext(AuthenticatedContext); + const table_theme = useTheme({ + BaseRow: ` + font-size: 14px; + color: white; + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + color: #90CAF9; + border-bottom: 1px solid #e0e0e0; + `, + Row: ` + &:nth-of-type(odd) { + background-color: #303030; + } + &:nth-of-type(even) { + background-color: #1e1e1e; + } + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + color: white; + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + ` + }); + const content = () => { if (!data) { return ; @@ -48,13 +81,14 @@ const ManageUsersForm: FC = () => { const noAdminConfigured = () => !data.users.find((u) => u.admin); const removeUser = (toRemove: User) => { - const users = data.users.filter((u) => u.username !== toRemove.username); + const users = data.users.filter((u) => u.id !== toRemove.id); setData({ ...data, users }); }; const createUser = () => { setCreating(true); setUser({ + id: '', username: '', password: '', admin: true @@ -72,7 +106,7 @@ const ManageUsersForm: FC = () => { const doneEditingUser = () => { if (user) { - const users = [...data.users.filter((u) => u.username !== user.username), user]; + const users = [...data.users.filter((u) => u.id !== user.id), user]; setData({ ...data, users }); setUser(undefined); } @@ -82,8 +116,8 @@ const ManageUsersForm: FC = () => { setGeneratingToken(undefined); }; - const generateToken = (username: string) => { - setGeneratingToken(username); + const generateToken = (id: string) => { + setGeneratingToken(id); }; const onSubmit = async () => { @@ -93,66 +127,71 @@ const ManageUsersForm: FC = () => { return ( <> - - - - Username - is Admin? - - - - - {data.users.sort(compareUsers).map((u) => ( - - - {u.username} - - {u.admin ? : } - - generateToken(u.username)} - > - - - removeUser(u)}> - - - editUser(u)}> - - - - - ))} - - - - - - - - - +
+ {(tableList: any) => ( + <> +
+ + USERNAME + IS ADMIN + + +
+ + {tableList.map((u: User, index: number) => ( + + {u.id} + {u.admin ? : } + + generateToken(u.id)} + > + + + removeUser(u)}> + + + editUser(u)}> + + + + + ))} + + + )}
+ {noAdminConfigured() && ( )} - - - + + + + + + + + + + + + + status !== busConnectionStatus.BUS_STATUS_OFFLINE; const busStatusHighlight = ({ status }: Status, theme: Theme) => { @@ -60,7 +56,7 @@ const busStatus = ({ status }: Status) => { case busConnectionStatus.BUS_STATUS_CONNECTED: return 'Connected'; case busConnectionStatus.BUS_STATUS_TX_ERRORS: - return 'Tx issues - try a different Tx-Mode'; + return 'Tx issues - try a different Tx Mode'; case busConnectionStatus.BUS_STATUS_OFFLINE: return 'Disconnected'; default: @@ -68,41 +64,17 @@ const busStatus = ({ status }: Status) => { } }; -const formatRow = (name: string, success: number, fail: number, quality: number) => { - if (success === 0 && fail === 0) { - return ( - - {name} - - - - - ); +const showQuality = (stat: Stat) => { + if (stat.q === 0 || stat.s + stat.f === 0) { + return; } - - return ( - - {name} - {Intl.NumberFormat().format(success)} - {Intl.NumberFormat().format(fail)} - {showQuality(quality)} - - ); -}; - -const showQuality = (quality: number) => { - if (quality === 0) { - return ; + if (stat.q === 100) { + return
{stat.q}%
; } - - if (quality === 100) { - return {quality}%; - } - - if (quality >= 95) { - return {quality}%; + if (stat.q >= 95) { + return
{stat.q}%
; } else { - return {quality}%; + return
{stat.q}%
; } }; @@ -115,6 +87,48 @@ const DashboardStatus: FC = () => { const { me } = useContext(AuthenticatedContext); + const stats_theme = tableTheme({ + BaseRow: ` + font-size: 14px; + color: white; + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + color: #90CAF9; + border-bottom: 1px solid #e0e0e0; + `, + Row: ` + &:nth-of-type(odd) { + background-color: #303030; + } + &:nth-of-type(even) { + background-color: #1e1e1e; + } + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + color: white; + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + &:nth-of-type(1) { + flex: 1; + } + ` + }); + useEffect(() => { const timer = setInterval(() => loadData(), 30000); return () => { @@ -183,27 +197,30 @@ const DashboardStatus: FC = () => { /> - - - - - - SUCCESS - FAIL - QUALITY - - - - {formatRow('EMS Telegrams Received (Rx)', data.rx_received, data.rx_fails, data.rx_quality)} - {formatRow('EMS Reads (Tx)', data.tx_reads, data.tx_read_fails, data.tx_read_quality)} - {formatRow('EMS Writes (Tx)', data.tx_writes, data.tx_write_fails, data.tx_write_quality)} - {formatRow('Temperature Sensor Reads', data.sensor_reads, data.sensor_fails, data.sensor_quality)} - {formatRow('Analog Sensor Reads', data.analog_reads, data.analog_fails, data.analog_quality)} - {formatRow('MQTT Publishes', data.mqtt_count, data.mqtt_fails, data.mqtt_quality)} - {formatRow('API Calls', data.api_calls, data.api_fails, data.api_quality)} - -
-
+ + {(tableList: any) => ( + <> +
+ + + SUCCESS + FAIL + QUALITY + +
+ + {tableList.map((stat: Stat, index: number) => ( + + {stat.id} + {Intl.NumberFormat().format(stat.s)} + {Intl.NumberFormat().format(stat.f)} + {showQuality(stat)} + + ))} + + + )} +
{renderScanDialog()} diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index ac63dee65..b41053881 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -38,36 +38,21 @@ export enum busConnectionStatus { BUS_STATUS_OFFLINE = 2 } +export interface Stat { + id: string; // name + s: number; // success + f: number; // fail + q: number; // quality +} export interface Status { status: busConnectionStatus; tx_mode: number; - rx_received: number; - tx_reads: number; - tx_writes: number; - rx_quality: number; - tx_read_quality: number; - tx_write_quality: number; - tx_read_fails: number; - tx_write_fails: number; - rx_fails: number; - sensor_fails: number; - sensor_reads: number; - sensor_quality: number; - analog_fails: number; - analog_reads: number; - analog_quality: number; - mqtt_count: number; - mqtt_fails: number; - mqtt_quality: number; - api_calls: number; - api_fails: number; - api_quality: number; + uptime: number; num_devices: number; num_sensors: number; num_analogs: number; - uptime: number; + stats: Stat[]; } - export interface Device { id: string; // id index t: string; // type diff --git a/interface/src/types/security.ts b/interface/src/types/security.ts index 90db06a1e..472248b12 100644 --- a/interface/src/types/security.ts +++ b/interface/src/types/security.ts @@ -1,4 +1,5 @@ export interface User { + id: string; // needed for Table username: string; password: string; admin: boolean; diff --git a/lib/framework/SecuritySettingsService.h b/lib/framework/SecuritySettingsService.h index cdbd8d085..51f57461e 100644 --- a/lib/framework/SecuritySettingsService.h +++ b/lib/framework/SecuritySettingsService.h @@ -43,6 +43,7 @@ class SecuritySettings { JsonArray users = root.createNestedArray("users"); for (User user : settings.users) { JsonObject userRoot = users.createNestedObject(); + userRoot["id"] = user.username; // for React Table userRoot["username"] = user.username; userRoot["password"] = user.password; userRoot["admin"] = user.admin; diff --git a/mock-api/server.js b/mock-api/server.js index 4bcfec3f7..0a8bdd56f 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -270,8 +270,8 @@ const system_status = { security_settings = { jwt_secret: 'naughty!', users: [ - { username: 'admin', password: 'admin', admin: true }, - { username: 'guest', password: 'guest', admin: false }, + { id: 'admin', username: 'admin', password: 'admin', admin: true }, + { id: 'guest', username: 'guest', password: 'guest', admin: false }, ], } const features = { @@ -417,33 +417,21 @@ const emsesp_sensordata = { } const status = { - analog_fails: 0, - analog_quality: 100, - analog_reads: 203, - api_calls: 4, - api_fails: 0, - api_quality: 100, - mqtt_count: 40243, - mqtt_fails: 0, - mqtt_quality: 100, - num_analogs: 1, - num_devices: 2, - num_sensors: 1, - rx_fails: 11, - rx_quality: 100, - rx_received: 56506, - sensor_fails: 0, - sensor_quality: 100, - sensor_reads: 15438, status: 0, tx_mode: 1, - tx_read_fails: 0, - tx_read_quality: 100, - tx_reads: 9026, - tx_write_fails: 2, - tx_write_quality: 95, - tx_writes: 33, uptime: 77186, + num_devices: 2, + num_sensors: 1, + num_analogs: 1, + stats: [ + { id: 'EMS Telegrams Received (Rx)', s: 56506, f: 11, q: 100 }, + { id: 'EMS Reads (Tx)', s: 9026, f: 0, q: 100 }, + { id: 'EMS Writes (Tx)', s: 33, f: 2, q: 95 }, + { id: 'Temperature Sensor Reads', s: 56506, f: 11, q: 100 }, + { id: 'Analog Sensor Reads', s: 0, f: 0, q: 100 }, + { id: 'MQTT Publishes', s: 12, f: 10, q: 20 }, + { id: 'API Calls', s: 0, f: 0, q: 0 }, + ], } // Dashboard data diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index d1df1596e..0d9347ce5 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -176,11 +176,12 @@ void WebDataService::device_data(AsyncWebServerRequest * request, JsonVariant & emsdevice->generate_values_web(output); #endif -#ifdef EMSESP_USE_SERIAL -#ifdef EMSESP_DEBUG - serializeJson(output, Serial); -#endif -#endif + // #ifdef EMSESP_USE_SERIAL + // #ifdef EMSESP_DEBUG + // serializeJson(output, Serial); + // #endif + // #endif + response->setLength(); request->send(response); return; diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index bb9dd3050..f4122656b 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -129,34 +129,57 @@ void WebStatusService::webStatusService(AsyncWebServerRequest * request) { auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_MEDIUM_DYN); JsonObject root = response->getRoot(); - root["status"] = EMSESP::bus_status(); // 0, 1 or 2 - root["num_devices"] = EMSESP::count_devices(); // excluding Controller - root["num_sensors"] = EMSESP::dallassensor_.no_sensors(); - root["num_analogs"] = EMSESP::analogsensor_.no_sensors(); - root["tx_mode"] = EMSESP::txservice_.tx_mode(); - root["rx_received"] = EMSESP::rxservice_.telegram_count(); - root["tx_reads"] = EMSESP::txservice_.telegram_read_count(); - root["tx_writes"] = EMSESP::txservice_.telegram_write_count(); - root["rx_quality"] = EMSESP::rxservice_.quality(); - root["tx_read_quality"] = EMSESP::txservice_.read_quality(); - root["tx_write_quality"] = EMSESP::txservice_.write_quality(); - root["rx_fails"] = EMSESP::rxservice_.telegram_error_count(); - root["tx_read_fails"] = EMSESP::txservice_.telegram_read_fail_count(); - root["tx_write_fails"] = EMSESP::txservice_.telegram_write_fail_count(); - root["sensor_fails"] = EMSESP::dallassensor_.fails(); - root["sensor_reads"] = EMSESP::dallassensor_.reads(); - root["sensor_quality"] = EMSESP::dallassensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::dallassensor_.fails()) / EMSESP::dallassensor_.reads()); - root["analog_fails"] = EMSESP::analogsensor_.fails(); - root["analog_reads"] = EMSESP::analogsensor_.reads(); - root["analog_quality"] = EMSESP::analogsensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::analogsensor_.fails()) / EMSESP::analogsensor_.reads()); - root["mqtt_fails"] = Mqtt::publish_fails(); - root["mqtt_count"] = Mqtt::publish_count(); - root["mqtt_quality"] = Mqtt::publish_count() == 0 ? 100 : 100 - (Mqtt::publish_fails() * 100) / (Mqtt::publish_count() + Mqtt::publish_fails()); - root["api_calls"] = WebAPIService::api_count(); // + WebAPIService::api_fails(); - root["api_fails"] = WebAPIService::api_fails(); - root["api_quality"] = - WebAPIService::api_count() == 0 ? 100 : 100 - (WebAPIService::api_fails() * 100) / (WebAPIService::api_count() + WebAPIService::api_fails()); - root["uptime"] = EMSbus::bus_uptime(); + root["status"] = EMSESP::bus_status(); // 0, 1 or 2 + root["tx_mode"] = EMSESP::txservice_.tx_mode(); + root["uptime"] = EMSbus::bus_uptime(); + root["num_devices"] = EMSESP::count_devices(); // excluding Controller + root["num_sensors"] = EMSESP::dallassensor_.no_sensors(); + root["num_analogs"] = EMSESP::analogsensor_.no_sensors(); + + JsonArray statsJson = root.createNestedArray("stats"); + JsonObject statJson; + + statJson = statsJson.createNestedObject(); + statJson["id"] = "EMS Telegrams Received (Rx)"; + statJson["s"] = EMSESP::rxservice_.telegram_count(); + statJson["f"] = EMSESP::rxservice_.telegram_error_count(); + statJson["q"] = EMSESP::rxservice_.quality(); + + statJson = statsJson.createNestedObject(); + statJson["id"] = "EMS Reads (Tx)"; + statJson["s"] = EMSESP::txservice_.telegram_read_count(); + statJson["f"] = EMSESP::txservice_.telegram_read_fail_count(); + statJson["q"] = EMSESP::txservice_.read_quality(); + + statJson = statsJson.createNestedObject(); + statJson["id"] = "EMS Writes (Tx)"; + statJson["s"] = EMSESP::txservice_.telegram_write_count(); + statJson["f"] = EMSESP::txservice_.telegram_write_fail_count(); + statJson["q"] = EMSESP::txservice_.write_quality(); + + statJson = statsJson.createNestedObject(); + statJson["id"] = "Temperature Sensor Reads"; + statJson["s"] = EMSESP::dallassensor_.reads(); + statJson["f"] = EMSESP::dallassensor_.fails(); + statJson["q"] = EMSESP::dallassensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::dallassensor_.fails()) / EMSESP::dallassensor_.reads()); + + statJson = statsJson.createNestedObject(); + statJson["id"] = "Analog Sensor Reads"; + statJson["s"] = EMSESP::analogsensor_.reads(); + statJson["f"] = EMSESP::analogsensor_.fails(); + statJson["q"] = EMSESP::analogsensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::analogsensor_.fails()) / EMSESP::analogsensor_.reads()); + + statJson = statsJson.createNestedObject(); + statJson["id"] = "MQTT Publishes"; + statJson["s"] = Mqtt::publish_count(); + statJson["f"] = Mqtt::publish_fails(); + statJson["q"] = Mqtt::publish_count() == 0 ? 100 : 100 - (Mqtt::publish_fails() * 100) / (Mqtt::publish_count() + Mqtt::publish_fails()); + + statJson = statsJson.createNestedObject(); + statJson["id"] = "API Calls"; + statJson["s"] = WebAPIService::api_count(); // + WebAPIService::api_fails(); + statJson["f"] = WebAPIService::api_fails(); + statJson["q"] = WebAPIService::api_count() == 0 ? 100 : 100 - (WebAPIService::api_fails() * 100) / (WebAPIService::api_count() + WebAPIService::api_fails()); response->setLength(); request->send(response); From 2f21c896a6906bbc59e7258e64ad54abed9d3ea1 Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 15 Apr 2022 18:40:35 +0200 Subject: [PATCH 228/319] fix dallas sensor checking --- interface/src/project/DashboardData.tsx | 6 +++--- interface/src/project/types.ts | 2 +- mock-api/server.js | 2 +- src/dallassensor.cpp | 8 ++++---- src/dallassensor.h | 2 +- src/test/test.cpp | 5 +++++ 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 32edb00ad..e3009ccc4 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -235,7 +235,7 @@ const DashboardData: FC = () => { iconDown: }, sortFns: { - GPIO: (array) => array.sort((a, b) => a.i - b.i), + GPIO: (array) => array.sort((a, b) => a.g - b.g), NAME: (array) => array.sort((a, b) => a.n.localeCompare(b.n)), TYPE: (array) => array.sort((a, b) => a.t - b.t), VALUE: (array) => array.sort((a, b) => a.v.toString().localeCompare(b.v.toString())) @@ -531,7 +531,7 @@ const DashboardData: FC = () => { if (sensor) { try { const response = await EMSESP.writeSensor({ - id_str: sensor.id, + id: sensor.id, name: sensor.n, offset: sensor.o }); @@ -926,7 +926,7 @@ const DashboardData: FC = () => { {tableList.map((a: Analog) => ( updateAnalog(a)}> - {a.id} + {a.g} {a.n} {AnalogTypeNames[a.t]} {a.t ? formatValue(a.v, a.u) : ''} diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index b41053881..bcf2815e3 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -84,7 +84,7 @@ export interface Analog { } export interface WriteSensor { - id_str: string; + id: string; name: string; offset: number; } diff --git a/mock-api/server.js b/mock-api/server.js index 0a8bdd56f..d188ecc83 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -972,7 +972,7 @@ rest_server.post(EMSESP_WRITE_VALUE_ENDPOINT, (req, res) => { rest_server.post(EMSESP_WRITE_SENSOR_ENDPOINT, (req, res) => { const sensor = req.body console.log('Write sensor: ' + JSON.stringify(sensor)) - objIndex = emsesp_sensordata.sensors.findIndex((obj) => obj.id == sensor.id_str) + objIndex = emsesp_sensordata.sensors.findIndex((obj) => obj.id == sensor.id) emsesp_sensordata.sensors[objIndex].n = sensor.name emsesp_sensordata.sensors[objIndex].o = sensor.offset res.sendStatus(200) diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index bb4d3f624..a66e070fd 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -503,15 +503,15 @@ DallasSensor::Sensor::Sensor(const uint8_t addr[]) : internal_id_(((uint64_t)addr[0] << 48) | ((uint64_t)addr[1] << 40) | ((uint64_t)addr[2] << 32) | ((uint64_t)addr[3] << 24) | ((uint64_t)addr[4] << 16) | ((uint64_t)addr[5] << 8) | ((uint64_t)addr[6])) { // create ID string - char id_str[20]; - snprintf(id_str, - sizeof(id_str), + char id_s[20]; + snprintf(id_s, + sizeof(id_s), "%02X-%04X-%04X-%04X", (unsigned int)(internal_id_ >> 48) & 0xFF, (unsigned int)(internal_id_ >> 32) & 0xFFFF, (unsigned int)(internal_id_ >> 16) & 0xFFFF, (unsigned int)(internal_id_)&0xFFFF); - id_ = std::string(id_str); + id_ = std::string(id_s); name_ = std::string{}; // name (alias) is empty offset_ = 0; // 0 degrees offset } diff --git a/src/dallassensor.h b/src/dallassensor.h index 009db5fa6..78bc9e29d 100644 --- a/src/dallassensor.h +++ b/src/dallassensor.h @@ -150,7 +150,7 @@ class DallasSensor { bool temperature_convert_complete(); int16_t get_temperature_c(const uint8_t addr[]); uint64_t get_id(const uint8_t addr[]); - void remove_ha_topic(const std::string & id_str); + void remove_ha_topic(const std::string & id); bool command_info(const char * value, const int8_t id, JsonObject & output); bool command_commands(const char * value, const int8_t id, JsonObject & output); diff --git a/src/test/test.cpp b/src/test/test.cpp index 52e546ce4..029636c9f 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -550,6 +550,11 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const if (command == "dallas") { shell.printfln(F("Testing adding Dallas sensor")); + emsesp::EMSESP::dallassensor_.test(); + } + + if (command == "dallas_full") { + shell.printfln(F("Testing adding and changing Dallas sensor")); Mqtt::ha_enabled(true); Mqtt::nested_format(1); // Mqtt::nested_format(0); From 275044bd78a63c2391cdc50f1312ff6b39d8da22 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 16 Apr 2022 09:04:34 +0200 Subject: [PATCH 229/319] customizations table part 1 --- interface/src/project/DashboardData.tsx | 8 +- .../src/project/SettingsCustomization.tsx | 203 +++++++++++++----- interface/src/project/types.ts | 2 +- mock-api/server.js | 174 +++++++-------- 4 files changed, 234 insertions(+), 153 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index e3009ccc4..235fb8ece 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -285,11 +285,6 @@ const DashboardData: FC = () => { } ); - const paul = () => { - console.log('paul'); - sensor_sort.fns.onToggleSort({ sortKey: 'NAME' }); - }; - const device_select = useRowSelect( { nodes: coreData.devices }, { @@ -829,8 +824,7 @@ const DashboardData: FC = () => { fullWidth style={{ fontSize: '14px', justifyContent: 'flex-start' }} endIcon={getSortIcon(sensor_sort.state, 'NAME')} - // onClick={() => sensor_sort.fns.onToggleSort({ sortKey: 'NAME' })} - onClick={() => paul()} + onClick={() => sensor_sort.fns.onToggleSort({ sortKey: 'NAME' })} > NAME diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 3eba6cbc2..88fa675e9 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -2,10 +2,6 @@ import { FC, useState, useEffect, useCallback } from 'react'; import { Button, - Table, - TableBody, - TableHead, - TableRow, Typography, Box, MenuItem, @@ -17,19 +13,22 @@ import { ToggleButtonGroup } from '@mui/material'; -import TableCell, { tableCellClasses } from '@mui/material/TableCell'; - -import { styled } from '@mui/material/styles'; +import { Table } from '@table-library/react-table-library/table'; +import { useTheme } from '@table-library/react-table-library/theme'; +import { useSort } from '@table-library/react-table-library/sort'; +import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; import { useSnackbar } from 'notistack'; import SaveIcon from '@mui/icons-material/Save'; import CancelIcon from '@mui/icons-material/Cancel'; import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; -import FavoriteBorderOutlinedIcon from '@mui/icons-material/FavoriteBorderOutlined'; +import StarIcon from '@mui/icons-material/Star'; import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; +import KeyboardArrowUpOutlinedIcon from '@mui/icons-material/KeyboardArrowUpOutlined'; +import KeyboardArrowDownOutlinedIcon from '@mui/icons-material/KeyboardArrowDownOutlined'; import { ButtonRow, FormLoader, ValidatedTextField, SectionContent } from '../components'; @@ -39,16 +38,10 @@ import { extractErrorMessage } from '../utils'; import { DeviceShort, Devices, DeviceEntity } from './types'; -const StyledTableCell = styled(TableCell)(({ theme }) => ({ - [`&.${tableCellClasses.head}`]: { - backgroundColor: '#607d8b' - } -})); - const SettingsCustomization: FC = () => { const { enqueueSnackbar } = useSnackbar(); - const [deviceEntities, setDeviceEntities] = useState(); + const [deviceEntities, setDeviceEntities] = useState([{ id: '', v: 0, s: '', m: 0, w: false }]); const [devices, setDevices] = useState(); const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); @@ -57,6 +50,86 @@ const SettingsCustomization: FC = () => { // eslint-disable-next-line const [masks, setMasks] = useState(() => ['']); + const entities_theme = useTheme({ + BaseRow: ` + font-size: 14px; + color: white; + height: 32px; + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + border-bottom: 1px solid #e0e0e0; + color: #90CAF9; + `, + Row: ` + background-color: #1e1e1e; + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + position: relative; + z-index: 1; + &:not(:last-of-type) { + margin-bottom: -1px; + } + &:not(:first-of-type) { + margin-top: -1px; + } + &:hover { + z-index: 2; + color: white; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + }, + &.tr.tr-body.row-select.row-select-single-selected, &.tr.tr-body.row-select.row-select-selected { + background-color: #3d4752; + color: white; + font-weight: normal; + z-index: 2; + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + } + `, + BaseCell: ` + border-top: 1px solid transparent; + border-right: 1px solid transparent; + border-bottom: 1px solid transparent; + &:nth-of-type(1) { + min-width: 128px; + width: 128px; + } + ` + }); + + const getSortIcon = (state: any, sortKey: any) => { + if (state.sortKey === sortKey && state.reverse) { + return ; + } + + if (state.sortKey === sortKey && !state.reverse) { + return ; + } + }; + + const entity_sort = useSort( + { nodes: deviceEntities }, + { + state: { + sortKey: 'NAME', + reverse: false + } + }, + { + sortIcon: { + iconDefault: null, + iconUp: , + iconDown: + }, + sortFns: { + NAME: (array) => array.sort((a, b) => a.id.localeCompare(b.id)) + } + } + ); + const fetchDevices = useCallback(async () => { try { setDevices((await EMSESP.readDevices()).data); @@ -119,7 +192,7 @@ const SettingsCustomization: FC = () => { Select a device and customize each of its entities using the options: - +  mark it as favorite to be listed at the top of the Dashboard @@ -205,7 +278,7 @@ const SettingsCustomization: FC = () => { const getMask = (de: DeviceEntity) => { var new_masks = []; - if ((de.m & 1) === 1 || de.n === '') { + if ((de.m & 1) === 1 || de.id === '') { new_masks.push('1'); } if ((de.m & 2) === 2) { @@ -222,47 +295,61 @@ const SettingsCustomization: FC = () => { }; return ( - - - - OPTIONS - ENTITY NAME (CODE) - VALUE - - - - {deviceEntities.map((de) => ( - - - { - setMask(de, mask); - }} - > - - - - - - - - - - - - - - - - {de.n} ({de.s}) - - {formatValue(de.v)} - - ))} - +
+ {(tableList: any) => ( + <> +
+ + OPTIONS + + + + VALUE + + +
+ + {tableList.map((de: DeviceEntity) => ( + + + { + setMask(de, mask); + }} + > + + + + + + + + + + + + + + + + {de.id} ({de.s}) + + {formatValue(de.v)} + + ))} + + + )}
); }; diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index bcf2815e3..c78745e55 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -129,7 +129,7 @@ export interface DeviceData { } export interface DeviceEntity { - n: string; // name + id: string; // name v: any; // value, in any format s: string; // shortname m: number; // mask diff --git a/mock-api/server.js b/mock-api/server.js index d188ecc83..972cd7ccc 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -576,35 +576,35 @@ const emsesp_devicedata_4 = { const emsesp_deviceentities_1 = [ { v: '(0)', - n: 'error code', + id: 'error code', s: 'errorcode', m: 0, w: false, }, { v: '14:54:39 06/06/2021', - n: 'date/time', + id: 'date/time', s: 'datetime', m: 0, w: false, }, { v: 18.2, - n: 'hc1 selected room temperature', + id: 'hc1 selected room temperature', s: 'hc1/seltemp', m: 0, w: true, }, { v: 22.6, - n: 'hc1 current room temperature', + id: 'hc1 current room temperature', s: 'hc1/curtemp', m: 0, w: false, }, { v: 'auto', - n: 'hc1 mode', + id: 'hc1 mode', s: 'hc1/mode', m: 0, w: true, @@ -612,105 +612,105 @@ const emsesp_deviceentities_1 = [ ] const emsesp_deviceentities_2 = [ - { v: false, n: 'heating active', s: 'heatingactive', m: 0 }, - { v: false, n: 'tapwater active', s: 'tapwateractive', m: 0 }, - { v: 5, n: 'selected flow temperature', s: 'selflowtemp', m: 0 }, - { v: 0, n: 'burner selected max power', s: 'selburnpow', m: 0 }, - { v: 0, n: 'heating pump modulation', s: 'heatingpumpmod', m: 0 }, - { n: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 0 }, - { n: 'outside temperature', s: 'outdoortemp', m: 0 }, - { v: 53, n: 'current flow temperature', s: 'curflowtemp', m: 0 }, - { v: 51.8, n: 'return temperature', s: 'rettemp', m: 0 }, - { n: 'mixing switch temperature', s: 'switchtemp', m: 0 }, - { v: 1.3, n: 'system pressure', s: 'syspress', m: 0 }, - { v: 54.6, n: 'actual boiler temperature', s: 'boiltemp', m: 0 }, - { n: 'exhaust temperature', s: 'exhausttemp', m: 0 }, - { v: false, n: 'gas', s: 'burngas', m: 0 }, - { v: false, n: 'gas stage 2', s: 'burngas2', m: 0 }, - { v: 0, n: 'flame current', s: 'flamecurr', m: 0 }, - { v: false, n: 'heating pump', s: 'heatingpump', m: 0 }, - { v: false, n: 'fan', s: 'fanwork', m: 0 }, - { v: false, n: 'ignition', s: 'ignwork', m: 0 }, - { v: false, n: 'oil preheating', s: 'oilpreheat', m: 0 }, - { v: true, n: 'heating activated', s: 'heatingactivated', m: 0 }, - { v: 80, n: 'heating temperature', s: 'heatingtemp', m: 0 }, - { v: 70, n: 'burner pump max power', s: 'pumpmodmax', m: 0 }, - { v: 30, n: 'burner pump min power', s: 'pumpmodmin', m: 0 }, - { v: 1, n: 'pump delay', s: 'pumpdelay', m: 0 }, - { v: 10, n: 'burner min period', s: 'burnminperiod', m: 0 }, - { v: 0, n: 'burner min power', s: 'burnminpower', m: 0 }, - { v: 50, n: 'burner max power', s: 'burnmaxpower', m: 0 }, - { v: -6, n: 'hysteresis on temperature', s: 'boilhyston', m: 0 }, - { v: 6, n: 'hysteresis off temperature', s: 'boilhystoff', m: 0 }, - { v: 0, n: 'set flow temperature', s: 'setflowtemp', m: 0 }, - { v: 0, n: 'burner set power', s: 'setburnpow', m: 0 }, - { v: 0, n: 'burner current power', s: 'curburnpow', m: 0 }, - { v: 326323, n: 'burner starts', s: 'burnstarts', m: 0 }, - { v: 553437, n: 'total burner operating time', s: 'burnworkmin', m: 0 }, - { v: 451286, n: 'total heat operating time', s: 'heatworkmin', m: 0 }, - { v: 4672175, n: 'total UBA operating time', s: 'ubauptime', m: 0 }, - { v: '1C(210) 06.06.2020 12:07 (0 min)', n: 'last error code', s: 'lastcode', m: 0 }, - { v: '0H', n: 'service code', s: 'servicecode', m: 0 }, - { v: 203, n: 'service code number', s: 'servicecodenumber', m: 0 }, - { v: 'H00', n: 'maintenance message', s: 'maintenancemessage', m: 0 }, - { v: 'manual', n: 'maintenance scheduled', s: 'maintenance', m: 0 }, - { v: 6000, n: 'time to next maintenance', s: 'maintenancetime', m: 0 }, - { v: '01.01.2012', n: 'next maintenance date', s: 'maintenancedate', m: 0 }, - { v: true, n: 'dhw turn on/off', s: 'wwtapactivated', m: 0 }, - { v: 62, n: 'dhw set temperature', s: 'wwsettemp', m: 0 }, - { v: 60, n: 'dhw selected temperature', s: 'wwseltemp', m: 0 }, - { n: 'dhw selected lower temperature', s: 'wwseltemplow', m: 2 }, - { n: 'dhw selected temperature for off', s: 'wwseltempoff', m: 2 }, - { n: 'dhw single charge temperature', s: 'wwseltempsingle', m: 2 }, - { v: 'flow', n: 'dhw type', s: 'wwtype', m: 0 }, - { v: 'hot', n: 'dhw comfort', s: 'wwcomfort', m: 0 }, - { v: 40, n: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0 }, - { v: 100, n: 'dhw max power', s: 'wwmaxpower', m: 0 }, - { v: false, n: 'dhw circulation pump available', s: 'wwcircpump', m: 0 }, - { v: '3-way valve', n: 'dhw charging type', s: 'wwchargetype', m: 0 }, - { v: -5, n: 'dhw hysteresis on temperature', s: 'wwhyston', m: 0 }, - { v: 0, n: 'dhw hysteresis off temperature', s: 'wwhystoff', m: 0 }, - { v: 70, n: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', m: 0 }, - { v: 'off', n: 'dhw circulation pump mode', s: 'wwcircmode', m: 0 }, - { v: false, n: 'dhw circulation active', s: 'wwcirc', m: 0 }, - { v: 46.4, n: 'dhw current intern temperature', s: 'wwcurtemp', m: 0 }, - { n: 'dhw current extern temperature', s: 'wwcurtemp2', m: 2 }, - { v: 0, n: 'dhw current tap water flow', s: 'wwcurflow', m: 0 }, - { v: 46.3, n: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0 }, - { n: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 2 }, - { v: true, n: 'dhw activated', s: 'wwactivated', m: 0 }, - { v: false, n: 'dhw one time charging', s: 'wwonetime', m: 0 }, - { v: false, n: 'dhw disinfecting', s: 'wwdisinfecting', m: 0 }, - { v: false, n: 'dhw charging', s: 'wwcharging', m: 0 }, - { v: false, n: 'dhw recharging', s: 'wwrecharging', m: 0 }, - { v: true, n: 'dhw temperature ok', s: 'wwtempok', m: 0 }, - { v: false, n: 'dhw active', s: 'wwactive', m: 0 }, - { v: true, n: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0 }, - { v: 0, n: 'dhw set pump power', s: 'wwsetpumppower', m: 0 }, - { n: 'dhw mixer temperature', s: 'wwmixertemp', m: 2 }, - { n: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 2 }, - { v: 288768, n: 'dhw starts', s: 'wwstarts', m: 0 }, - { v: 102151, n: 'dhw active time', s: 'wwworkm', m: 0 }, + { v: false, id: 'heating active', s: 'heatingactive', m: 0 }, + { v: false, id: 'tapwater active', s: 'tapwateractive', m: 0 }, + { v: 5, id: 'selected flow temperature', s: 'selflowtemp', m: 0 }, + { v: 0, id: 'burner selected max power', s: 'selburnpow', m: 0 }, + { v: 0, id: 'heating pump modulation', s: 'heatingpumpmod', m: 0 }, + { id: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 0 }, + { id: 'outside temperature', s: 'outdoortemp', m: 0 }, + { v: 53, id: 'current flow temperature', s: 'curflowtemp', m: 0 }, + { v: 51.8, id: 'return temperature', s: 'rettemp', m: 0 }, + { id: 'mixing switch temperature', s: 'switchtemp', m: 0 }, + { v: 1.3, id: 'system pressure', s: 'syspress', m: 0 }, + { v: 54.6, id: 'actual boiler temperature', s: 'boiltemp', m: 0 }, + { id: 'exhaust temperature', s: 'exhausttemp', m: 0 }, + { v: false, id: 'gas', s: 'burngas', m: 0 }, + { v: false, id: 'gas stage 2', s: 'burngas2', m: 0 }, + { v: 0, id: 'flame current', s: 'flamecurr', m: 0 }, + { v: false, id: 'heating pump', s: 'heatingpump', m: 0 }, + { v: false, id: 'fan', s: 'fanwork', m: 0 }, + { v: false, id: 'ignition', s: 'ignwork', m: 0 }, + { v: false, id: 'oil preheating', s: 'oilpreheat', m: 0 }, + { v: true, id: 'heating activated', s: 'heatingactivated', m: 0 }, + { v: 80, id: 'heating temperature', s: 'heatingtemp', m: 0 }, + { v: 70, id: 'burner pump max power', s: 'pumpmodmax', m: 0 }, + { v: 30, id: 'burner pump min power', s: 'pumpmodmin', m: 0 }, + { v: 1, id: 'pump delay', s: 'pumpdelay', m: 0 }, + { v: 10, id: 'burner min period', s: 'burnminperiod', m: 0 }, + { v: 0, id: 'burner min power', s: 'burnminpower', m: 0 }, + { v: 50, id: 'burner max power', s: 'burnmaxpower', m: 0 }, + { v: -6, id: 'hysteresis on temperature', s: 'boilhyston', m: 0 }, + { v: 6, id: 'hysteresis off temperature', s: 'boilhystoff', m: 0 }, + { v: 0, id: 'set flow temperature', s: 'setflowtemp', m: 0 }, + { v: 0, id: 'burner set power', s: 'setburnpow', m: 0 }, + { v: 0, id: 'burner current power', s: 'curburnpow', m: 0 }, + { v: 326323, id: 'burner starts', s: 'burnstarts', m: 0 }, + { v: 553437, id: 'total burner operating time', s: 'burnworkmin', m: 0 }, + { v: 451286, id: 'total heat operating time', s: 'heatworkmin', m: 0 }, + { v: 4672175, id: 'total UBA operating time', s: 'ubauptime', m: 0 }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', id: 'last error code', s: 'lastcode', m: 0 }, + { v: '0H', id: 'service code', s: 'servicecode', m: 0 }, + { v: 203, id: 'service code number', s: 'servicecodenumber', m: 0 }, + { v: 'H00', id: 'maintenance message', s: 'maintenancemessage', m: 0 }, + { v: 'manual', id: 'maintenance scheduled', s: 'maintenance', m: 0 }, + { v: 6000, id: 'time to next maintenance', s: 'maintenancetime', m: 0 }, + { v: '01.01.2012', id: 'next maintenance date', s: 'maintenancedate', m: 0 }, + { v: true, id: 'dhw turn on/off', s: 'wwtapactivated', m: 0 }, + { v: 62, id: 'dhw set temperature', s: 'wwsettemp', m: 0 }, + { v: 60, id: 'dhw selected temperature', s: 'wwseltemp', m: 0 }, + { id: 'dhw selected lower temperature', s: 'wwseltemplow', m: 2 }, + { id: 'dhw selected temperature for off', s: 'wwseltempoff', m: 2 }, + { id: 'dhw single charge temperature', s: 'wwseltempsingle', m: 2 }, + { v: 'flow', id: 'dhw type', s: 'wwtype', m: 0 }, + { v: 'hot', id: 'dhw comfort', s: 'wwcomfort', m: 0 }, + { v: 40, id: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0 }, + { v: 100, id: 'dhw max power', s: 'wwmaxpower', m: 0 }, + { v: false, id: 'dhw circulation pump available', s: 'wwcircpump', m: 0 }, + { v: '3-way valve', id: 'dhw charging type', s: 'wwchargetype', m: 0 }, + { v: -5, id: 'dhw hysteresis on temperature', s: 'wwhyston', m: 0 }, + { v: 0, id: 'dhw hysteresis off temperature', s: 'wwhystoff', m: 0 }, + { v: 70, id: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', m: 0 }, + { v: 'off', id: 'dhw circulation pump mode', s: 'wwcircmode', m: 0 }, + { v: false, id: 'dhw circulation active', s: 'wwcirc', m: 0 }, + { v: 46.4, id: 'dhw current intern temperature', s: 'wwcurtemp', m: 0 }, + { id: 'dhw current extern temperature', s: 'wwcurtemp2', m: 2 }, + { v: 0, id: 'dhw current tap water flow', s: 'wwcurflow', m: 0 }, + { v: 46.3, id: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0 }, + { id: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 2 }, + { v: true, id: 'dhw activated', s: 'wwactivated', m: 0 }, + { v: false, id: 'dhw one time charging', s: 'wwonetime', m: 0 }, + { v: false, id: 'dhw disinfecting', s: 'wwdisinfecting', m: 0 }, + { v: false, id: 'dhw charging', s: 'wwcharging', m: 0 }, + { v: false, id: 'dhw recharging', s: 'wwrecharging', m: 0 }, + { v: true, id: 'dhw temperature ok', s: 'wwtempok', m: 0 }, + { v: false, id: 'dhw active', s: 'wwactive', m: 0 }, + { v: true, id: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0 }, + { v: 0, id: 'dhw set pump power', s: 'wwsetpumppower', m: 0 }, + { id: 'dhw mixer temperature', s: 'wwmixertemp', m: 2 }, + { id: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 2 }, + { v: 288768, id: 'dhw starts', s: 'wwstarts', m: 0 }, + { v: 102151, id: 'dhw active time', s: 'wwworkm', m: 0 }, ] const emsesp_deviceentities_4 = [ { v: 16, - n: 'hc2 selected room temperature', + id: 'hc2 selected room temperature', s: 'hc2/seltemp', m: 0, w: true, }, { v: 18.5, - n: 'hc2 current room temperature', + id: 'hc2 current room temperature', s: 'hc2/curtemp', m: 3, w: false, }, { v: 'off', - n: 'hc2 mode', + id: 'hc2 mode', s: 'hc2/mode', m: 3, w: true, From 9d7820d15593ef3f257f7b2ad72cf30c9df8bbdd Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 16 Apr 2022 15:31:46 +0200 Subject: [PATCH 230/319] togglebutton --- interface/src/project/DashboardData.tsx | 4 +- .../src/project/SettingsCustomization.tsx | 184 +++++++++++------- mock-api/server.js | 13 +- 3 files changed, 128 insertions(+), 73 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 235fb8ece..bac7800a1 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -661,7 +661,7 @@ const DashboardData: FC = () => { TYPE DESCRIPTION ENTITIES - + @@ -767,7 +767,7 @@ const DashboardData: FC = () => { VALUE - + diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 88fa675e9..e392cd03e 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -10,6 +10,7 @@ import { DialogContent, DialogTitle, ToggleButton, + IconButton, ToggleButtonGroup } from '@mui/material'; @@ -36,7 +37,7 @@ import * as EMSESP from './api'; import { extractErrorMessage } from '../utils'; -import { DeviceShort, Devices, DeviceEntity } from './types'; +import { DeviceShort, Devices, DeviceEntity, DeviceEntityMask } from './types'; const SettingsCustomization: FC = () => { const { enqueueSnackbar } = useSnackbar(); @@ -46,16 +47,20 @@ const SettingsCustomization: FC = () => { const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); const [confirmReset, setConfirmReset] = useState(false); + const [selectedFilters, setSelectedFilters] = useState(DeviceEntityMask.DV_FAVORITE); // eslint-disable-next-line const [masks, setMasks] = useState(() => ['']); const entities_theme = useTheme({ + Table: ` + height: 100%; + `, BaseRow: ` font-size: 14px; color: white; height: 32px; - `, + `, HeaderRow: ` text-transform: uppercase; background-color: black; @@ -88,14 +93,19 @@ const SettingsCustomization: FC = () => { border-top: 1px solid #177ac9; border-bottom: 1px solid #177ac9; } - `, + `, BaseCell: ` border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; &:nth-of-type(1) { - min-width: 128px; - width: 128px; + width: 130px; + } + &:nth-of-type(2) { + flex: 1; + } + &:last-of-type { + text-align: right; } ` }); @@ -192,7 +202,7 @@ const SettingsCustomization: FC = () => { Select a device and customize each of its entities using the options: - +  mark it as favorite to be listed at the top of the Dashboard @@ -263,10 +273,15 @@ const SettingsCustomization: FC = () => { }; const renderDeviceData = () => { - if (devices?.devices.length === 0 || !deviceEntities) { + if (devices?.devices.length === 0 || deviceEntities[0].id === '') { return; } + const hasMask = (de: DeviceEntity) => { + return de.m & selectedFilters; + return (de.m & DeviceEntityMask.DV_FAVORITE) === DeviceEntityMask.DV_FAVORITE; + }; + const setMask = (de: DeviceEntity, newMask: string[]) => { var new_mask = 0; for (let entry of newMask) { @@ -295,62 +310,95 @@ const SettingsCustomization: FC = () => { }; return ( - - {(tableList: any) => ( - <> -
- - OPTIONS - - - - VALUE - - -
- - {tableList.map((de: DeviceEntity) => ( - - - { - setMask(de, mask); - }} + <> + setSelectedDevice(8)}> + + + + { + // setMask(de, mask); + }} + > + + + + + + + + + + + + + + +
hasMask(de)) }} + theme={entities_theme} + sort={entity_sort} + layout={{ custom: true, horizontalScroll: true }} + > + {(tableList: any) => ( + <> +
+ + OPTIONS + +
+ NAME + +
+ VALUE + + + + + {tableList.map((de: DeviceEntity) => ( + + + { + setMask(de, mask); + }} + > + + + + + + + + + + + + + + + + {de.id} ({de.s}) + + {formatValue(de.v)} + + ))} + + + )} + + ); }; @@ -390,12 +438,18 @@ const SettingsCustomization: FC = () => { const content = () => { return ( - <> +
Device Entities {renderDeviceList()} - {renderDeviceData()} +
+ {renderDeviceData()} +
@@ -416,7 +470,7 @@ const SettingsCustomization: FC = () => { {renderResetDialog()} - +
); }; diff --git a/mock-api/server.js b/mock-api/server.js index 972cd7ccc..bfd5a0c8e 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -698,7 +698,7 @@ const emsesp_deviceentities_4 = [ v: 16, id: 'hc2 selected room temperature', s: 'hc2/seltemp', - m: 0, + m: 8, w: true, }, { @@ -916,15 +916,15 @@ function updateMask(entity, de, dd) { objIndex = de.findIndex((obj) => obj.s == name) if (objIndex !== -1) { de[objIndex].m = new_mask - const fullname = de[objIndex].n - objIndex = dd.data.findIndex((obj) => obj.n.slice(2) == fullname) + const fullname = de[objIndex].id + objIndex = dd.data.findIndex((obj) => obj.id.slice(2) == fullname) if (objIndex !== -1) { // see if the mask has changed - const old_mask = parseInt(dd.data[objIndex].n.slice(0, 2), 16) + const old_mask = parseInt(dd.data[objIndex].id.slice(0, 2), 16) if (old_mask !== new_mask) { const mask_hex = entity.slice(0, 2) - console.log('Updating ' + dd.data[objIndex].n + ' -> ' + mask_hex + fullname) - dd.data[objIndex].n = mask_hex + fullname + console.log('Updating ' + dd.data[objIndex].id + ' -> ' + mask_hex + fullname) + dd.data[objIndex].id = mask_hex + fullname } } } else { @@ -934,6 +934,7 @@ function updateMask(entity, de, dd) { rest_server.post(EMSESP_MASKED_ENTITIES_ENDPOINT, (req, res) => { const id = req.body.id + console.log('customization id = ' + id) console.log(req.body.entity_ids) for (const entity of req.body.entity_ids) { if (id === 1) { From 615e86d177f8a121a0d0a27b49b3ea3965978f0d Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 16 Apr 2022 16:58:49 +0200 Subject: [PATCH 231/319] update --- .../src/project/SettingsCustomization.tsx | 125 ++++++++---------- 1 file changed, 52 insertions(+), 73 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index e392cd03e..805210275 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -10,8 +10,8 @@ import { DialogContent, DialogTitle, ToggleButton, - IconButton, - ToggleButtonGroup + ToggleButtonGroup, + Tooltip } from '@mui/material'; import { Table } from '@table-library/react-table-library/table'; @@ -37,7 +37,7 @@ import * as EMSESP from './api'; import { extractErrorMessage } from '../utils'; -import { DeviceShort, Devices, DeviceEntity, DeviceEntityMask } from './types'; +import { DeviceShort, Devices, DeviceEntity } from './types'; const SettingsCustomization: FC = () => { const { enqueueSnackbar } = useSnackbar(); @@ -47,7 +47,7 @@ const SettingsCustomization: FC = () => { const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); const [confirmReset, setConfirmReset] = useState(false); - const [selectedFilters, setSelectedFilters] = useState(DeviceEntityMask.DV_FAVORITE); + const [selectedFilters, setSelectedFilters] = useState(15); // eslint-disable-next-line const [masks, setMasks] = useState(() => ['']); @@ -200,23 +200,7 @@ const SettingsCustomization: FC = () => { return ( <> - Select a device and customize each of its entities using the options: - - -  mark it as favorite to be listed at the top of the Dashboard - - - -  make it read-only, only if it has write operation available - - - -  excluded it from MQTT and API outputs - - - -  hide it from the Dashboard - + Select a device and customize each of its entities using the options. { return; } - const hasMask = (de: DeviceEntity) => { - return de.m & selectedFilters; - return (de.m & DeviceEntityMask.DV_FAVORITE) === DeviceEntityMask.DV_FAVORITE; - }; - - const setMask = (de: DeviceEntity, newMask: string[]) => { + const getMaskNumber = (newMask: string[]) => { var new_mask = 0; for (let entry of newMask) { new_mask |= Number(entry); } - de.m = new_mask; - setMasks(newMask); + return new_mask; }; - const getMask = (de: DeviceEntity) => { + const getMaskString = (m: number) => { var new_masks = []; - if ((de.m & 1) === 1 || de.id === '') { + if ((m & 1) === 1) { new_masks.push('1'); } - if ((de.m & 2) === 2) { + if ((m & 2) === 2) { new_masks.push('2'); } - if ((de.m & 4) === 4 && de.w) { + if ((m & 4) === 4) { new_masks.push('4'); } - if ((de.m & 8) === 8) { + if ((m & 8) === 8) { new_masks.push('8'); } - return new_masks; }; return ( <> - setSelectedDevice(8)}> - - - - { - // setMask(de, mask); - }} - > - - - - - - - - - - - - - + + Apply filter:  + { + setSelectedFilters(getMaskNumber(mask)); + }} + > + + + + + + + + + + + + + + + + + + + + + + hasMask(de)) }} + data={{ nodes: deviceEntities.filter((de) => de.m & selectedFilters || !selectedFilters) }} theme={entities_theme} sort={entity_sort} - layout={{ custom: true, horizontalScroll: true }} + layout={{ custom: true }} > {(tableList: any) => ( <> @@ -369,9 +353,10 @@ const SettingsCustomization: FC = () => { { - setMask(de, mask); + de.m = getMaskNumber(mask); + setMasks(['']); }} > @@ -438,18 +423,12 @@ const SettingsCustomization: FC = () => { const content = () => { return ( -
+ <> Device Entities {renderDeviceList()} -
- {renderDeviceData()} -
+ {renderDeviceData()} @@ -470,7 +449,7 @@ const SettingsCustomization: FC = () => { {renderResetDialog()} -
+ ); }; From 3acb9c456e10e3d6e8a40fb507fbb8982df127d7 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 16 Apr 2022 18:16:01 +0200 Subject: [PATCH 232/319] formatting --- .../src/project/SettingsCustomization.tsx | 7 +- mock-api/server.js | 144 +++++++++--------- 2 files changed, 75 insertions(+), 76 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 805210275..905647f06 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -47,7 +47,7 @@ const SettingsCustomization: FC = () => { const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); const [confirmReset, setConfirmReset] = useState(false); - const [selectedFilters, setSelectedFilters] = useState(15); + const [selectedFilters, setSelectedFilters] = useState(0); // eslint-disable-next-line const [masks, setMasks] = useState(() => ['']); @@ -288,7 +288,7 @@ const SettingsCustomization: FC = () => { return ( <> - + Apply filter:  {
- - +
de.m & selectedFilters || !selectedFilters) }} theme={entities_theme} diff --git a/mock-api/server.js b/mock-api/server.js index bfd5a0c8e..ae20b680e 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -612,85 +612,85 @@ const emsesp_deviceentities_1 = [ ] const emsesp_deviceentities_2 = [ - { v: false, id: 'heating active', s: 'heatingactive', m: 0 }, - { v: false, id: 'tapwater active', s: 'tapwateractive', m: 0 }, - { v: 5, id: 'selected flow temperature', s: 'selflowtemp', m: 0 }, - { v: 0, id: 'burner selected max power', s: 'selburnpow', m: 0 }, - { v: 0, id: 'heating pump modulation', s: 'heatingpumpmod', m: 0 }, - { id: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 0 }, - { id: 'outside temperature', s: 'outdoortemp', m: 0 }, - { v: 53, id: 'current flow temperature', s: 'curflowtemp', m: 0 }, - { v: 51.8, id: 'return temperature', s: 'rettemp', m: 0 }, - { id: 'mixing switch temperature', s: 'switchtemp', m: 0 }, - { v: 1.3, id: 'system pressure', s: 'syspress', m: 0 }, - { v: 54.6, id: 'actual boiler temperature', s: 'boiltemp', m: 0 }, - { id: 'exhaust temperature', s: 'exhausttemp', m: 0 }, - { v: false, id: 'gas', s: 'burngas', m: 0 }, - { v: false, id: 'gas stage 2', s: 'burngas2', m: 0 }, - { v: 0, id: 'flame current', s: 'flamecurr', m: 0 }, - { v: false, id: 'heating pump', s: 'heatingpump', m: 0 }, - { v: false, id: 'fan', s: 'fanwork', m: 0 }, - { v: false, id: 'ignition', s: 'ignwork', m: 0 }, - { v: false, id: 'oil preheating', s: 'oilpreheat', m: 0 }, - { v: true, id: 'heating activated', s: 'heatingactivated', m: 0 }, - { v: 80, id: 'heating temperature', s: 'heatingtemp', m: 0 }, - { v: 70, id: 'burner pump max power', s: 'pumpmodmax', m: 0 }, - { v: 30, id: 'burner pump min power', s: 'pumpmodmin', m: 0 }, - { v: 1, id: 'pump delay', s: 'pumpdelay', m: 0 }, - { v: 10, id: 'burner min period', s: 'burnminperiod', m: 0 }, - { v: 0, id: 'burner min power', s: 'burnminpower', m: 0 }, - { v: 50, id: 'burner max power', s: 'burnmaxpower', m: 0 }, - { v: -6, id: 'hysteresis on temperature', s: 'boilhyston', m: 0 }, - { v: 6, id: 'hysteresis off temperature', s: 'boilhystoff', m: 0 }, - { v: 0, id: 'set flow temperature', s: 'setflowtemp', m: 0 }, - { v: 0, id: 'burner set power', s: 'setburnpow', m: 0 }, - { v: 0, id: 'burner current power', s: 'curburnpow', m: 0 }, - { v: 326323, id: 'burner starts', s: 'burnstarts', m: 0 }, - { v: 553437, id: 'total burner operating time', s: 'burnworkmin', m: 0 }, - { v: 451286, id: 'total heat operating time', s: 'heatworkmin', m: 0 }, - { v: 4672175, id: 'total UBA operating time', s: 'ubauptime', m: 0 }, - { v: '1C(210) 06.06.2020 12:07 (0 min)', id: 'last error code', s: 'lastcode', m: 0 }, - { v: '0H', id: 'service code', s: 'servicecode', m: 0 }, - { v: 203, id: 'service code number', s: 'servicecodenumber', m: 0 }, - { v: 'H00', id: 'maintenance message', s: 'maintenancemessage', m: 0 }, - { v: 'manual', id: 'maintenance scheduled', s: 'maintenance', m: 0 }, - { v: 6000, id: 'time to next maintenance', s: 'maintenancetime', m: 0 }, - { v: '01.01.2012', id: 'next maintenance date', s: 'maintenancedate', m: 0 }, - { v: true, id: 'dhw turn on/off', s: 'wwtapactivated', m: 0 }, - { v: 62, id: 'dhw set temperature', s: 'wwsettemp', m: 0 }, - { v: 60, id: 'dhw selected temperature', s: 'wwseltemp', m: 0 }, + { v: false, id: 'heating active', s: 'heatingactive', m: 0, w: false }, + { v: false, id: 'tapwater active', s: 'tapwateractive', m: 0, w: false }, + { v: 5, id: 'selected flow temperature', s: 'selflowtemp', m: 0, w: true }, + { v: 0, id: 'burner selected max power', s: 'selburnpow', m: 0, w: true }, + { v: 0, id: 'heating pump modulation', s: 'heatingpumpmod', m: 0, w: false }, + { id: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 0, w: false }, + { id: 'outside temperature', s: 'outdoortemp', m: 0, w: false }, + { v: 53, id: 'current flow temperature', s: 'curflowtemp', m: 0, w: false }, + { v: 51.8, id: 'return temperature', s: 'rettemp', m: 0, w: false }, + { id: 'mixing switch temperature', s: 'switchtemp', m: 0, w: false }, + { v: 1.3, id: 'system pressure', s: 'syspress', m: 0, w: false }, + { v: 54.6, id: 'actual boiler temperature', s: 'boiltemp', m: 0, w: false }, + { id: 'exhaust temperature', s: 'exhausttemp', m: 0, w: false }, + { v: false, id: 'gas', s: 'burngas', m: 0, w: false }, + { v: false, id: 'gas stage 2', s: 'burngas2', m: 0, w: false }, + { v: 0, id: 'flame current', s: 'flamecurr', m: 0, w: false }, + { v: false, id: 'heating pump', s: 'heatingpump', m: 0, w: false }, + { v: false, id: 'fan', s: 'fanwork', m: 0, w: false }, + { v: false, id: 'ignition', s: 'ignwork', m: 0, w: false }, + { v: false, id: 'oil preheating', s: 'oilpreheat', m: 0, w: false }, + { v: true, id: 'heating activated', s: 'heatingactivated', m: 0, w: false }, + { v: 80, id: 'heating temperature', s: 'heatingtemp', m: 0, w: false }, + { v: 70, id: 'burner pump max power', s: 'pumpmodmax', m: 0, w: false }, + { v: 30, id: 'burner pump min power', s: 'pumpmodmin', m: 0, w: false }, + { v: 1, id: 'pump delay', s: 'pumpdelay', m: 0, w: false }, + { v: 10, id: 'burner min period', s: 'burnminperiod', m: 0, w: false }, + { v: 0, id: 'burner min power', s: 'burnminpower', m: 0, w: false }, + { v: 50, id: 'burner max power', s: 'burnmaxpower', m: 0, w: false }, + { v: -6, id: 'hysteresis on temperature', s: 'boilhyston', m: 0, w: false }, + { v: 6, id: 'hysteresis off temperature', s: 'boilhystoff', m: 0, w: false }, + { v: 0, id: 'set flow temperature', s: 'setflowtemp', m: 0, w: true }, + { v: 0, id: 'burner set power', s: 'setburnpow', m: 0, w: false }, + { v: 0, id: 'burner current power', s: 'curburnpow', m: 0, w: false }, + { v: 326323, id: 'burner starts', s: 'burnstarts', m: 0, w: false }, + { v: 553437, id: 'total burner operating time', s: 'burnworkmin', m: 0, w: false }, + { v: 451286, id: 'total heat operating time', s: 'heatworkmin', m: 0, w: false }, + { v: 4672175, id: 'total UBA operating time', s: 'ubauptime', m: 0, w: false }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', id: 'last error code', s: 'lastcode', m: 0, w: false }, + { v: '0H', id: 'service code', s: 'servicecode', m: 0, w: false }, + { v: 203, id: 'service code number', s: 'servicecodenumber', m: 0, w: false }, + { v: 'H00', id: 'maintenance message', s: 'maintenancemessage', m: 0, w: false }, + { v: 'manual', id: 'maintenance scheduled', s: 'maintenance', m: 0, w: false }, + { v: 6000, id: 'time to next maintenance', s: 'maintenancetime', m: 0, w: false }, + { v: '01.01.2012', id: 'next maintenance date', s: 'maintenancedate', m: 0, w: false }, + { v: true, id: 'dhw turn on/off', s: 'wwtapactivated', m: 0, w: false }, + { v: 62, id: 'dhw set temperature', s: 'wwsettemp', m: 0, w: false }, + { v: 60, id: 'dhw selected temperature', s: 'wwseltemp', m: 0, w: true }, { id: 'dhw selected lower temperature', s: 'wwseltemplow', m: 2 }, { id: 'dhw selected temperature for off', s: 'wwseltempoff', m: 2 }, { id: 'dhw single charge temperature', s: 'wwseltempsingle', m: 2 }, - { v: 'flow', id: 'dhw type', s: 'wwtype', m: 0 }, - { v: 'hot', id: 'dhw comfort', s: 'wwcomfort', m: 0 }, - { v: 40, id: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0 }, - { v: 100, id: 'dhw max power', s: 'wwmaxpower', m: 0 }, - { v: false, id: 'dhw circulation pump available', s: 'wwcircpump', m: 0 }, - { v: '3-way valve', id: 'dhw charging type', s: 'wwchargetype', m: 0 }, - { v: -5, id: 'dhw hysteresis on temperature', s: 'wwhyston', m: 0 }, - { v: 0, id: 'dhw hysteresis off temperature', s: 'wwhystoff', m: 0 }, - { v: 70, id: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', m: 0 }, - { v: 'off', id: 'dhw circulation pump mode', s: 'wwcircmode', m: 0 }, - { v: false, id: 'dhw circulation active', s: 'wwcirc', m: 0 }, - { v: 46.4, id: 'dhw current intern temperature', s: 'wwcurtemp', m: 0 }, + { v: 'flow', id: 'dhw type', s: 'wwtype', m: 0, w: false }, + { v: 'hot', id: 'dhw comfort', s: 'wwcomfort', m: 0, w: false }, + { v: 40, id: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0, w: false }, + { v: 100, id: 'dhw max power', s: 'wwmaxpower', m: 0, w: false }, + { v: false, id: 'dhw circulation pump available', s: 'wwcircpump', m: 0, w: false }, + { v: '3-way valve', id: 'dhw charging type', s: 'wwchargetype', m: 0, w: false }, + { v: -5, id: 'dhw hysteresis on temperature', s: 'wwhyston', m: 0, w: false }, + { v: 0, id: 'dhw hysteresis off temperature', s: 'wwhystoff', m: 0, w: false }, + { v: 70, id: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', m: 0, w: false }, + { v: 'off', id: 'dhw circulation pump mode', s: 'wwcircmode', m: 0, w: false }, + { v: false, id: 'dhw circulation active', s: 'wwcirc', m: 0, w: false }, + { v: 46.4, id: 'dhw current intern temperature', s: 'wwcurtemp', m: 0, w: false }, { id: 'dhw current extern temperature', s: 'wwcurtemp2', m: 2 }, - { v: 0, id: 'dhw current tap water flow', s: 'wwcurflow', m: 0 }, - { v: 46.3, id: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0 }, + { v: 0, id: 'dhw current tap water flow', s: 'wwcurflow', m: 0, w: false }, + { v: 46.3, id: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0, w: false }, { id: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 2 }, - { v: true, id: 'dhw activated', s: 'wwactivated', m: 0 }, - { v: false, id: 'dhw one time charging', s: 'wwonetime', m: 0 }, - { v: false, id: 'dhw disinfecting', s: 'wwdisinfecting', m: 0 }, - { v: false, id: 'dhw charging', s: 'wwcharging', m: 0 }, - { v: false, id: 'dhw recharging', s: 'wwrecharging', m: 0 }, - { v: true, id: 'dhw temperature ok', s: 'wwtempok', m: 0 }, - { v: false, id: 'dhw active', s: 'wwactive', m: 0 }, - { v: true, id: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0 }, - { v: 0, id: 'dhw set pump power', s: 'wwsetpumppower', m: 0 }, + { v: true, id: 'dhw activated', s: 'wwactivated', m: 0, w: false }, + { v: false, id: 'dhw one time charging', s: 'wwonetime', m: 0, w: false }, + { v: false, id: 'dhw disinfecting', s: 'wwdisinfecting', m: 0, w: false }, + { v: false, id: 'dhw charging', s: 'wwcharging', m: 0, w: false }, + { v: false, id: 'dhw recharging', s: 'wwrecharging', m: 0, w: false }, + { v: true, id: 'dhw temperature ok', s: 'wwtempok', m: 0, w: false }, + { v: false, id: 'dhw active', s: 'wwactive', m: 0, w: false }, + { v: true, id: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0, w: false }, + { v: 0, id: 'dhw set pump power', s: 'wwsetpumppower', m: 0, w: true }, { id: 'dhw mixer temperature', s: 'wwmixertemp', m: 2 }, { id: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 2 }, - { v: 288768, id: 'dhw starts', s: 'wwstarts', m: 0 }, - { v: 102151, id: 'dhw active time', s: 'wwworkm', m: 0 }, + { v: 288768, id: 'dhw starts', s: 'wwstarts', m: 0, w: false }, + { v: 102151, id: 'dhw active time', s: 'wwworkm', m: 0, w: false }, ] const emsesp_deviceentities_4 = [ From 3c9cad2717c8d966cdec408d887a2878c4a206a2 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 17 Apr 2022 20:52:24 +0200 Subject: [PATCH 233/319] add set all enabled button --- interface/src/framework/ap/APSettingsForm.tsx | 1 + .../src/project/SettingsCustomization.tsx | 100 ++++++++++++------ 2 files changed, 66 insertions(+), 35 deletions(-) diff --git a/interface/src/framework/ap/APSettingsForm.tsx b/interface/src/framework/ap/APSettingsForm.tsx index f15c6b802..8080f4f0f 100644 --- a/interface/src/framework/ap/APSettingsForm.tsx +++ b/interface/src/framework/ap/APSettingsForm.tsx @@ -14,6 +14,7 @@ import { ValidatedPasswordField, ValidatedTextField } from '../../components'; + import { APProvisionMode, APSettings } from '../../types'; import { numberValue, updateValue, useRest } from '../../utils'; import * as APApi from '../../api/ap'; diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 905647f06..ad9ab5b90 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -11,7 +11,8 @@ import { DialogTitle, ToggleButton, ToggleButtonGroup, - Tooltip + Tooltip, + Grid } from '@mui/material'; import { Table } from '@table-library/react-table-library/table'; @@ -37,7 +38,7 @@ import * as EMSESP from './api'; import { extractErrorMessage } from '../utils'; -import { DeviceShort, Devices, DeviceEntity } from './types'; +import { DeviceShort, Devices, DeviceEntity, DeviceEntityMask } from './types'; const SettingsCustomization: FC = () => { const { enqueueSnackbar } = useSnackbar(); @@ -286,40 +287,69 @@ const SettingsCustomization: FC = () => { return new_masks; }; + const maskDisabled = (set: boolean) => { + setDeviceEntities( + deviceEntities + .filter((de) => de.m & selectedFilters || !selectedFilters) + .map(({ m, ...entities }) => ({ + ...entities, + m: set + ? m | (DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) + : m & ~(DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) + })) + ); + }; + return ( <> - - Apply filter:  - { - setSelectedFilters(getMaskNumber(mask)); - }} - > - - - - - - - - - - - - - - - - - - - - - - + + + + Apply filter:  + + + + { + setSelectedFilters(getMaskNumber(mask)); + }} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
de.m & selectedFilters || !selectedFilters) }} theme={entities_theme} @@ -401,7 +431,7 @@ const SettingsCustomization: FC = () => { setConfirmReset(false)}> Reset - Are you sure you want remove all customizations? EMS-ESP will then restart. + Are you sure you want remove all customizations including the settings of Temperature and Analog sensors? - + diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx index 1397f9797..4a0df9df1 100644 --- a/interface/src/project/DashboardStatus.tsx +++ b/interface/src/project/DashboardStatus.tsx @@ -91,7 +91,7 @@ const DashboardStatus: FC = () => { BaseRow: ` font-size: 14px; color: white; - `, + `, HeaderRow: ` text-transform: uppercase; background-color: black; @@ -118,7 +118,7 @@ const DashboardStatus: FC = () => { &:hover { color: white; } - `, + `, BaseCell: ` border-top: 1px solid transparent; border-right: 1px solid transparent; diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index ca7077c0c..801cf228a 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -54,9 +54,6 @@ const SettingsCustomization: FC = () => { const [masks, setMasks] = useState(() => ['']); const entities_theme = useTheme({ - Table: ` - height: 100%; - `, BaseRow: ` font-size: 14px; color: white; @@ -100,13 +97,13 @@ const SettingsCustomization: FC = () => { border-right: 1px solid transparent; border-bottom: 1px solid transparent; &:nth-of-type(1) { - width: 130px; + left: 0px; + min-width: 124px; + width: 124px; } &:nth-of-type(2) { - flex: 1; - } - &:last-of-type { - text-align: right; + min-width: 70%; + width: 70%; } ` }); @@ -302,10 +299,19 @@ const SettingsCustomization: FC = () => { return ( <> - + - - Apply filter:  + + Set filter:  @@ -354,13 +360,13 @@ const SettingsCustomization: FC = () => { data={{ nodes: deviceEntities.filter((de) => de.m & selectedFilters || !selectedFilters) }} theme={entities_theme} sort={entity_sort} - layout={{ custom: true }} + layout={{ custom: true, horizontalScroll: true }} > {(tableList: any) => ( <>
- OPTIONS + OPTIONS - VALUE + VALUE
diff --git a/mock-api/server.js b/mock-api/server.js index ae20b680e..898d644e0 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -555,19 +555,19 @@ const emsesp_devicedata_4 = { { v: 16, u: 1, - id: '00hc2 selected room temperature', + id: '08hc2 selected room temperature', c: 'hc2/seltemp', }, { v: 18.6, u: 1, - id: '00hc2 current room temperature', + id: '02hc2 current room temperature', c: '', }, { v: 'off', u: 0, - id: '00hc2 mode', + id: '02hc2 mode', c: 'hc2/mode', }, ], @@ -705,14 +705,14 @@ const emsesp_deviceentities_4 = [ v: 18.5, id: 'hc2 current room temperature', s: 'hc2/curtemp', - m: 3, + m: 2, w: false, }, { v: 'off', id: 'hc2 mode', s: 'hc2/mode', - m: 3, + m: 2, w: true, }, ] diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 9c78d6760..7a6856f53 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -460,7 +460,7 @@ bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject for (const auto & sensor : sensors_) { if (id == -1) { // show number and id JsonObject dataSensor = output.createNestedObject(sensor.name()); - dataSensor["gpio"] = sensor.gpio(); + dataSensor["gpio"] = sensor.gpio(); dataSensor["type"] = FL_(enum_sensortype)[sensor.type()]; if (sensor.type() == AnalogType::ADC) { dataSensor["uom"] = EMSdevice::uom_to_string(sensor.uom()); diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 00d019898..71e71365c 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -193,7 +193,7 @@ class Boiler : public EMSdevice { // Pool unit int8_t poolSetTemp_; -/* + /* * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat * thermostat always overwrites settings in boiler * enable settings here if no thermostat is used in system diff --git a/src/version.h b/src/version.h index 16885163f..bc33dab7b 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b12" +#define EMSESP_APP_VERSION "3.4.0b12t" diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 3a0afb88e..2634030fd 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -61,7 +61,7 @@ void WebCustomization::read(WebCustomization & settings, JsonObject & root) { JsonArray sensorsJson = root.createNestedArray("sensors"); for (const SensorCustomization & sensor : settings.sensorCustomizations) { JsonObject sensorJson = sensorsJson.createNestedObject(); - sensorJson["id"] = sensor.id; // is + sensorJson["id"] = sensor.id; // is sensorJson["name"] = sensor.name; // n sensorJson["offset"] = sensor.offset; // o } @@ -101,7 +101,7 @@ StateUpdateResult WebCustomization::update(JsonObject & root, WebCustomization & for (const JsonObject sensorJson : root["sensors"].as()) { // create each of the sensor, overwritting any previous settings auto sensor = SensorCustomization(); - sensor.id = sensorJson["id"].as(); + sensor.id = sensorJson["id"].as(); sensor.name = sensorJson["name"].as(); sensor.offset = sensorJson["offset"]; settings.sensorCustomizations.push_back(sensor); // add to list From 22595b0f24517786e611f81b064a6c3105c25042 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 18 Apr 2022 12:54:44 +0200 Subject: [PATCH 236/319] show resize column header bars, disable default sorting --- interface/src/project/DashboardData.tsx | 39 +++++++------------ .../src/project/SettingsCustomization.tsx | 18 +++++---- src/version.h | 2 +- 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index ca072071d..a4e32ae00 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -42,6 +42,7 @@ import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; import KeyboardArrowUpOutlinedIcon from '@mui/icons-material/KeyboardArrowUpOutlined'; import KeyboardArrowDownOutlinedIcon from '@mui/icons-material/KeyboardArrowDownOutlined'; +import UnfoldMoreOutlinedIcon from '@mui/icons-material/UnfoldMoreOutlined'; import StarIcon from '@mui/icons-material/Star'; import DeviceIcon from './DeviceIcon'; @@ -208,6 +209,9 @@ const DashboardData: FC = () => { `, HeaderCell: ` padding-left: 0px; + &:not(:last-of-type) { + border-right: 1px solid #565656; + } ` }); @@ -215,23 +219,18 @@ const DashboardData: FC = () => { if (state.sortKey === sortKey && state.reverse) { return ; } - if (state.sortKey === sortKey && !state.reverse) { return ; } + return ; }; const analog_sort = useSort( { nodes: sensorData.analogs }, - { - state: { - sortKey: 'GPIO', - reverse: false - } - }, + {}, { sortIcon: { - iconDefault: null, + iconDefault: , iconUp: , iconDown: }, @@ -246,15 +245,10 @@ const DashboardData: FC = () => { const sensor_sort = useSort( { nodes: sensorData.sensors }, - { - state: { - sortKey: 'NAME', - reverse: false - } - }, + {}, { sortIcon: { - iconDefault: null, + iconDefault: , iconUp: , iconDown: }, @@ -267,15 +261,10 @@ const DashboardData: FC = () => { const dv_sort = useSort( { nodes: deviceData.data }, - { - state: { - sortKey: 'NAME', - reverse: false - } - }, + {}, { sortIcon: { - iconDefault: null, + iconDefault: , iconUp: , iconDown: }, @@ -759,7 +748,7 @@ const DashboardData: FC = () => { ENTITY NAME
- + - + - + -
de.m & selectedFilters || !selectedFilters) }} + data={{ + nodes: deviceEntities.filter( + (de) => (de.m & selectedFilters || !selectedFilters) && de.id.toLowerCase().includes(search.toLowerCase()) + ) + }} theme={entities_theme} sort={entity_sort} layout={{ custom: true, horizontalScroll: true }} diff --git a/src/version.h b/src/version.h index 7814cfaf4..a7efafb90 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b12t2" +#define EMSESP_APP_VERSION "3.4.0b12t3" From 56860da4af001de4a71c87ed8e98e4e85c6a2c1d Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 20 Apr 2022 18:06:26 -0400 Subject: [PATCH 239/319] remove TODO on sorting --- src/devices/thermostat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index ec265050d..f2dc222a4 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -346,7 +346,7 @@ std::shared_ptr Thermostat::heating_circuit(std::sha heating_circuits_.push_back(new_hc); // sort based on hc number so there's a nice order when displaying - // TODO temporarily commented out the HC sorting until I'm 100% sure the return object still references the newly created object + // NOTE temporarily commented out the HC sorting until I'm 100% sure the return object still references the newly created object // not sure if new_hc and heating_circuits_.back() will still reference the new HC after its sorted - to check! // std::sort(heating_circuits_.begin(), heating_circuits_.end()); From 726b4fcc0b4e5dbed78705654fe3b2108688c703 Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 20 Apr 2022 18:06:35 -0400 Subject: [PATCH 240/319] more updates to tables --- interface/package-lock.json | 14 +-- interface/package.json | 2 +- interface/src/project/DashboardData.tsx | 45 +++---- interface/src/project/DashboardStatus.tsx | 2 +- .../src/project/SettingsCustomization.tsx | 115 +++++++++++------- src/version.h | 2 +- 6 files changed, 99 insertions(+), 81 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 6fded4ef9..33d9c64ef 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -21,7 +21,7 @@ "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", "axios": "^0.26.1", - "http-proxy-middleware": "^2.0.4", + "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "notistack": "^2.0.4", @@ -8879,9 +8879,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -23917,9 +23917,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", diff --git a/interface/package.json b/interface/package.json index 103e24276..131a7195a 100644 --- a/interface/package.json +++ b/interface/package.json @@ -17,7 +17,7 @@ "@types/react-router-dom": "^5.3.3", "async-validator": "^4.0.7", "axios": "^0.26.1", - "http-proxy-middleware": "^2.0.4", + "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "notistack": "^2.0.4", diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index a4e32ae00..ccd5e6209 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -102,7 +102,9 @@ const DashboardData: FC = () => { HeaderRow: ` text-transform: uppercase; background-color: black; + color: #90CAF9; border-bottom: 1px solid #e0e0e0; + font-weight: 500; `, Row: ` background-color: #1e1e1e; @@ -171,6 +173,7 @@ const DashboardData: FC = () => { background-color: black; color: #90CAF9; border-bottom: 1px solid #e0e0e0; + font-weight: 500; `, Row: ` &:nth-of-type(odd) { @@ -237,8 +240,7 @@ const DashboardData: FC = () => { sortFns: { GPIO: (array) => array.sort((a, b) => a.g - b.g), NAME: (array) => array.sort((a, b) => a.n.localeCompare(b.n)), - TYPE: (array) => array.sort((a, b) => a.t - b.t), - VALUE: (array) => array.sort((a, b) => a.v.toString().localeCompare(b.v.toString())) + TYPE: (array) => array.sort((a, b) => a.t - b.t) } } ); @@ -269,8 +271,7 @@ const DashboardData: FC = () => { iconDown: }, sortFns: { - NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))), - VALUE: (array) => array.sort((a, b) => a.v.toString().localeCompare(b.v.toString())) + NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))) } } ); @@ -337,8 +338,7 @@ const DashboardData: FC = () => { ); }; - const refreshData = () => { - const selectedDevice = device_select.state.id; + const refreshDataIndex = (selectedDevice: string) => { if (selectedDevice === 'sensor') { fetchSensorData(); return; @@ -352,6 +352,10 @@ const DashboardData: FC = () => { } }; + const refreshData = () => { + refreshDataIndex(device_select.state.id); + }; + const fetchCoreData = useCallback(async () => { try { setCoreData((await EMSESP.readCoreData()).data); @@ -641,7 +645,6 @@ const DashboardData: FC = () => { const renderCoreData = () => ( {coreData.devices.length === 0 && } -
{(tableList: any) => ( <> @@ -658,7 +661,9 @@ const DashboardData: FC = () => { {tableList.map((device: Device, index: number) => ( + {/* refreshDataIndex(device.id)}> */} + {/* */} {device.t} {device.n} @@ -673,7 +678,9 @@ const DashboardData: FC = () => { {(coreData.active_sensors > 0 || coreData.analog_enabled) && ( + {/* refreshDataIndex('sensor')}> */} + {/* */} Sensors Attached EMS-ESP Sensors @@ -722,7 +729,7 @@ const DashboardData: FC = () => { setOnlyFav(!onlyFav)} />} - label={favorites only} + label={show only favorites} />
{ ENTITY NAME - - - + VALUE @@ -895,16 +893,7 @@ const DashboardData: FC = () => { TYPE - - - + VALUE diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx index 4a0df9df1..1e9d7113f 100644 --- a/interface/src/project/DashboardStatus.tsx +++ b/interface/src/project/DashboardStatus.tsx @@ -209,7 +209,7 @@ const DashboardStatus: FC = () => { - {tableList.map((stat: Stat, index: number) => ( + {tableList.map((stat: Stat) => ( {stat.id} {Intl.NumberFormat().format(stat.s)} diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index b64e08e58..e22e2aa07 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -34,6 +34,7 @@ import KeyboardArrowUpOutlinedIcon from '@mui/icons-material/KeyboardArrowUpOutl import KeyboardArrowDownOutlinedIcon from '@mui/icons-material/KeyboardArrowDownOutlined'; import UnfoldMoreOutlinedIcon from '@mui/icons-material/UnfoldMoreOutlined'; import SearchIcon from '@mui/icons-material/Search'; +import FilterListIcon from '@mui/icons-material/FilterList'; import { ButtonRow, FormLoader, ValidatedTextField, SectionContent } from '../components'; @@ -68,6 +69,7 @@ const SettingsCustomization: FC = () => { background-color: black; border-bottom: 1px solid #e0e0e0; color: #90CAF9; + font-weight: 500; `, Row: ` background-color: #1e1e1e; @@ -97,6 +99,7 @@ const SettingsCustomization: FC = () => { } `, BaseCell: ` + padding-left: 8px; border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; @@ -104,6 +107,8 @@ const SettingsCustomization: FC = () => { left: 0px; min-width: 124px; width: 124px; + padding-left: 0px; + } &:nth-of-type(2) { min-width: 70%; @@ -111,10 +116,13 @@ const SettingsCustomization: FC = () => { } `, HeaderCell: ` - padding-left: 0px; - &:nth-of-type(2) { - border-right: 1px solid #565656; - } + padding-left: 0px; + &:nth-of-type(1) { + padding-left: 24px; + } + &:nth-of-type(2) { + border-right: 1px solid #565656; + } ` }); @@ -288,34 +296,53 @@ const SettingsCustomization: FC = () => { const maskDisabled = (set: boolean) => { setDeviceEntities( - deviceEntities - .filter((de) => de.m & selectedFilters || !selectedFilters) - .map(({ m, ...entities }) => ({ - ...entities, - m: set - ? m | (DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) - : m & ~(DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) - })) + deviceEntities.map(function (de) { + if ((de.m & selectedFilters || !selectedFilters) && de.id.toLowerCase().includes(search.toLowerCase())) { + return { + ...de, + m: set + ? de.m | (DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) + : de.m & ~(DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) + }; + } else { + return de; + } + }) ); }; + const shown_data = deviceEntities.filter( + (de) => (de.m & selectedFilters || !selectedFilters) && de.id.toLowerCase().includes(search.toLowerCase()) + ); + return ( <> - + - - Filter:  + + #: + + + {shown_data.length}/{deviceEntities.length} + + + + : + + + { + setSearch(event.target.value); + }} + /> + + + : + { + - - - { - setSearch(event.target.value); - }} - /> - + + : - -
(de.m & selectedFilters || !selectedFilters) && de.id.toLowerCase().includes(search.toLowerCase()) - ) - }} + data={{ nodes: shown_data }} theme={entities_theme} sort={entity_sort} layout={{ custom: true, horizontalScroll: true }} @@ -414,7 +443,7 @@ const SettingsCustomization: FC = () => { - + diff --git a/src/version.h b/src/version.h index a7efafb90..2c5e4afad 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b12t3" +#define EMSESP_APP_VERSION "3.4.0b12t4" From 9ff497914e8c44d8aef70bb3b588d53cd927f1c7 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 24 Apr 2022 14:20:16 -0400 Subject: [PATCH 241/319] fix to arduino 3.5.0 --- platformio.ini | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/platformio.ini b/platformio.ini index 1effc65e3..2b4a1b130 100644 --- a/platformio.ini +++ b/platformio.ini @@ -61,10 +61,7 @@ extra_scripts = pre:scripts/build_interface.py scripts/rename_fw.py board = esp32dev -platform = espressif32 -; platform_packages = -; toolchain-xtensa32@~2.80400.0 -; framework-arduinoespressif32@https://github.com/espressif/arduino-esp32.git +platform = espressif32@3.5.0 board_build.partitions = esp32_partition_app1984k_spiffs64k.csv build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} From c0c33d80c7380c358f9dc904bf06a7c4111c7f64 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 24 Apr 2022 14:20:30 -0400 Subject: [PATCH 242/319] fix typo in sorting --- interface/src/project/DashboardData.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index ccd5e6209..7f59fb344 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -255,8 +255,8 @@ const DashboardData: FC = () => { iconDown: }, sortFns: { - NAME: (array) => array.sort((a, b) => a.id.localeCompare(b.id)), - TEMPERATURE: (array) => array.sort((a, b) => a.id.localeCompare(b.id)) + NAME: (array) => array.sort((a, b) => a.n.localeCompare(b.n)), + TEMPERATURE: (array) => array.sort((a, b) => a.t - b.t) } } ); From b2a885bf3f4c0126aa411d57fab0d6cc046c01e7 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 24 Apr 2022 14:20:49 -0400 Subject: [PATCH 243/319] hide web also deselects favourite --- .../src/project/SettingsCustomization.tsx | 204 +++++++++--------- 1 file changed, 106 insertions(+), 98 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index e22e2aa07..bb1a031bd 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -120,8 +120,8 @@ const SettingsCustomization: FC = () => { &:nth-of-type(1) { padding-left: 24px; } - &:nth-of-type(2) { - border-right: 1px solid #565656; + &:nth-of-type(3) { + border-left: 1px solid #565656; } ` }); @@ -151,6 +151,11 @@ const SettingsCustomization: FC = () => { } ); + const sort_name = () => { + console.log(entity_sort); + entity_sort.fns.onToggleSort({ sortKey: 'NAME' }); + }; + const fetchDevices = useCallback(async () => { try { setDevices((await EMSESP.readDevices()).data); @@ -187,55 +192,75 @@ const SettingsCustomization: FC = () => { return value; } - const renderDeviceList = () => { - if (!devices) { - return ; + const getMaskNumber = (newMask: string[]) => { + var new_mask = 0; + for (let entry of newMask) { + new_mask |= Number(entry); } + return new_mask; + }; - function compareDevices(a: DeviceShort, b: DeviceShort) { - if (a.s < b.s) { - return -1; - } - if (a.s > b.s) { - return 1; - } - return 0; + const getMaskString = (m: number) => { + var new_masks = []; + if ((m & 1) === 1) { + new_masks.push('1'); } + if ((m & 2) === 2) { + new_masks.push('2'); + } + if ((m & 4) === 4) { + new_masks.push('4'); + } + if ((m & 8) === 8) { + new_masks.push('8'); + } + return new_masks; + }; - const changeSelectedDevice = (event: React.ChangeEvent) => { - const selected_device = parseInt(event.target.value, 10); - setSelectedDevice(selected_device); - fetchDeviceEntities(selected_device); - }; - - return ( - <> - - Select a device and customize each of its entities using the options. - - - - Select a device... - - {devices.devices.sort(compareDevices).map((device: DeviceShort, index) => ( - - {device.s} - - ))} - - + const maskDisabled = (set: boolean) => { + setDeviceEntities( + deviceEntities.map(function (de) { + if ((de.m & selectedFilters || !selectedFilters) && de.id.toLowerCase().includes(search.toLowerCase())) { + return { + ...de, + m: set + ? de.m | (DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) + : de.m & ~(DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) + }; + } else { + return de; + } + }) ); }; + function compareDevices(a: DeviceShort, b: DeviceShort) { + if (a.s < b.s) { + return -1; + } + if (a.s > b.s) { + return 1; + } + return 0; + } + + const changeSelectedDevice = (event: React.ChangeEvent) => { + const selected_device = parseInt(event.target.value, 10); + setSelectedDevice(selected_device); + fetchDeviceEntities(selected_device); + }; + + const resetCustomization = async () => { + try { + await EMSESP.resetCustomizations(); + enqueueSnackbar('All customizations have been removed. Restarting...', { variant: 'info' }); + } catch (error: any) { + enqueueSnackbar(extractErrorMessage(error, 'Problem resetting customizations'), { variant: 'error' }); + } finally { + setConfirmReset(false); + } + }; + const saveCustomization = async () => { if (deviceEntities && selectedDevice) { const masked_entities = deviceEntities @@ -264,53 +289,44 @@ const SettingsCustomization: FC = () => { } }; + const renderDeviceList = () => { + if (!devices) { + return ; + } + + return ( + <> + + Select a device and customize each of its entities using the options. + + + + Select a device... + + {devices.devices.sort(compareDevices).map((device: DeviceShort, index) => ( + + {device.s} + + ))} + + + ); + }; + const renderDeviceData = () => { if (devices?.devices.length === 0 || deviceEntities[0].id === '') { return; } - const getMaskNumber = (newMask: string[]) => { - var new_mask = 0; - for (let entry of newMask) { - new_mask |= Number(entry); - } - return new_mask; - }; - - const getMaskString = (m: number) => { - var new_masks = []; - if ((m & 1) === 1) { - new_masks.push('1'); - } - if ((m & 2) === 2) { - new_masks.push('2'); - } - if ((m & 4) === 4) { - new_masks.push('4'); - } - if ((m & 8) === 8) { - new_masks.push('8'); - } - return new_masks; - }; - - const maskDisabled = (set: boolean) => { - setDeviceEntities( - deviceEntities.map(function (de) { - if ((de.m & selectedFilters || !selectedFilters) && de.id.toLowerCase().includes(search.toLowerCase())) { - return { - ...de, - m: set - ? de.m | (DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) - : de.m & ~(DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE) - }; - } else { - return de; - } - }) - ); - }; - const shown_data = deviceEntities.filter( (de) => (de.m & selectedFilters || !selectedFilters) && de.id.toLowerCase().includes(search.toLowerCase()) ); @@ -418,7 +434,7 @@ const SettingsCustomization: FC = () => { fullWidth style={{ fontSize: '14px', justifyContent: 'flex-start' }} endIcon={getSortIcon(entity_sort.state, 'NAME')} - onClick={() => entity_sort.fns.onToggleSort({ sortKey: 'NAME' })} + onClick={() => sort_name()} > NAME @@ -437,6 +453,9 @@ const SettingsCustomization: FC = () => { value={getMaskString(de.m)} onChange={(event, mask) => { de.m = getMaskNumber(mask); + if (de.m & DeviceEntityMask.DV_WEB_EXCLUDE) { + de.m = de.m & ~DeviceEntityMask.DV_FAVORITE; + } setMasks(['']); }} > @@ -468,17 +487,6 @@ const SettingsCustomization: FC = () => { ); }; - const resetCustomization = async () => { - try { - await EMSESP.resetCustomizations(); - enqueueSnackbar('All customizations have been removed. Restarting...', { variant: 'info' }); - } catch (error: any) { - enqueueSnackbar(extractErrorMessage(error, 'Problem resetting customizations'), { variant: 'error' }); - } finally { - setConfirmReset(false); - } - }; - const renderResetDialog = () => ( setConfirmReset(false)}> Reset From 271b36c60280b3e59e731ac48f62d261610940da Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 24 Apr 2022 19:18:02 -0400 Subject: [PATCH 244/319] update packages --- interface/package-lock.json | 42 ++++++++++++++++++------------------- interface/package.json | 6 +++--- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 33d9c64ef..22b7b9914 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -13,13 +13,13 @@ "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.6.2", "@mui/material": "^5.6.2", - "@table-library/react-table-library": "^3.0.0", + "@table-library/react-table-library": "^3.1.0", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.25", + "@types/node": "^17.0.26", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", - "async-validator": "^4.0.7", + "async-validator": "^4.0.8", "axios": "^0.26.1", "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", @@ -3549,9 +3549,9 @@ } }, "node_modules/@table-library/react-table-library": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-3.0.0.tgz", - "integrity": "sha512-XkFS6+M1oWfno9raVjLWzcP/wSUwm50xzBozHMORRMO4NZ484TBr+f+tTcgyl5eJnEJxSNAkEClv+iB9t0QR+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-3.1.0.tgz", + "integrity": "sha512-YCWmLPdElk/4+VPSxDcgQXlJx+jxYH2xJwr8NXm9e1AEy17K8mtrjzD5SQXDOiVT8vSOzD21eEldfIaI/kooHA==", "dependencies": { "clsx": "1.1.1", "react-virtualized-auto-sizer": "1.0.6", @@ -3763,9 +3763,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", - "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==" + "version": "17.0.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.26.tgz", + "integrity": "sha512-z/FG/6DUO7pnze3AE3TBGIjGGKkvCcGcWINe1C7cADY8hKLJPDYpzsNE37uExQ4md5RFtTCvg+M8Mu1Enyeg2A==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -4670,9 +4670,9 @@ } }, "node_modules/async-validator": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", - "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.8.tgz", + "integrity": "sha512-vx1kyOCuSJqB5IVatlybUkV/e22sdx+V0XohCWbBfbbzbiLFt6fHxfWg6UEBhFw0gVgZtaSLTJtugmP4rdGQAQ==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -19933,9 +19933,9 @@ } }, "@table-library/react-table-library": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-3.0.0.tgz", - "integrity": "sha512-XkFS6+M1oWfno9raVjLWzcP/wSUwm50xzBozHMORRMO4NZ484TBr+f+tTcgyl5eJnEJxSNAkEClv+iB9t0QR+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-3.1.0.tgz", + "integrity": "sha512-YCWmLPdElk/4+VPSxDcgQXlJx+jxYH2xJwr8NXm9e1AEy17K8mtrjzD5SQXDOiVT8vSOzD21eEldfIaI/kooHA==", "requires": { "clsx": "1.1.1", "react-virtualized-auto-sizer": "1.0.6", @@ -20136,9 +20136,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", - "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==" + "version": "17.0.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.26.tgz", + "integrity": "sha512-z/FG/6DUO7pnze3AE3TBGIjGGKkvCcGcWINe1C7cADY8hKLJPDYpzsNE37uExQ4md5RFtTCvg+M8Mu1Enyeg2A==" }, "@types/parse-json": { "version": "4.0.0", @@ -20838,9 +20838,9 @@ } }, "async-validator": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", - "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.8.tgz", + "integrity": "sha512-vx1kyOCuSJqB5IVatlybUkV/e22sdx+V0XohCWbBfbbzbiLFt6fHxfWg6UEBhFw0gVgZtaSLTJtugmP4rdGQAQ==" }, "asynckit": { "version": "0.4.0", diff --git a/interface/package.json b/interface/package.json index 131a7195a..b79479f39 100644 --- a/interface/package.json +++ b/interface/package.json @@ -9,13 +9,13 @@ "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.6.2", "@mui/material": "^5.6.2", - "@table-library/react-table-library": "^3.0.0", + "@table-library/react-table-library": "^3.1.0", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.25", + "@types/node": "^17.0.26", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", - "async-validator": "^4.0.7", + "async-validator": "^4.0.8", "axios": "^0.26.1", "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", From c80d5c6bbf2b21fb88af0a5d17f955c4a49055a0 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 24 Apr 2022 19:18:19 -0400 Subject: [PATCH 245/319] fix sort when click on icon and 3-way sort cycle --- interface/src/project/DashboardData.tsx | 3 ++- interface/src/project/SettingsCustomization.tsx | 10 +++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 7f59fb344..ca8781858 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -24,7 +24,7 @@ import { useSnackbar } from 'notistack'; import { Table } from '@table-library/react-table-library/table'; import { useTheme } from '@table-library/react-table-library/theme'; -import { useSort } from '@table-library/react-table-library/sort'; +import { useSort, SortToggleType } from '@table-library/react-table-library/sort'; import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; import { useRowSelect } from '@table-library/react-table-library/select'; @@ -270,6 +270,7 @@ const DashboardData: FC = () => { iconUp: , iconDown: }, + sortToggleType: SortToggleType.AlternateWithReset, sortFns: { NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))) } diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index bb1a031bd..c8c020ddf 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -18,7 +18,7 @@ import { import { Table } from '@table-library/react-table-library/table'; import { useTheme } from '@table-library/react-table-library/theme'; -import { useSort } from '@table-library/react-table-library/sort'; +import { useSort, SortToggleType } from '@table-library/react-table-library/sort'; import { Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; import { useSnackbar } from 'notistack'; @@ -145,17 +145,13 @@ const SettingsCustomization: FC = () => { iconUp: , iconDown: }, + sortToggleType: SortToggleType.AlternateWithReset, sortFns: { NAME: (array) => array.sort((a, b) => a.id.localeCompare(b.id)) } } ); - const sort_name = () => { - console.log(entity_sort); - entity_sort.fns.onToggleSort({ sortKey: 'NAME' }); - }; - const fetchDevices = useCallback(async () => { try { setDevices((await EMSESP.readDevices()).data); @@ -434,7 +430,7 @@ const SettingsCustomization: FC = () => { fullWidth style={{ fontSize: '14px', justifyContent: 'flex-start' }} endIcon={getSortIcon(entity_sort.state, 'NAME')} - onClick={() => sort_name()} + onClick={() => entity_sort.fns.onToggleSort({ sortKey: 'NAME' })} > NAME From b688f6f7d08320d7bcf0f5c3a81bbcce42745646 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 24 Apr 2022 19:21:44 -0400 Subject: [PATCH 246/319] b13 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 2c5e4afad..5d3f3a8fe 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b12t4" +#define EMSESP_APP_VERSION "3.4.0b13" From 343d0a7baa785699ae167ca57e3487567c662e3e Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 24 Apr 2022 19:28:40 -0400 Subject: [PATCH 247/319] fix arduino core to 3.5.0 for ci jobs --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 2b4a1b130..8d27594fe 100644 --- a/platformio.ini +++ b/platformio.ini @@ -51,7 +51,7 @@ check_flags = [env:ci] extra_scripts = scripts/rename_fw.py board = esp32dev -platform = espressif32 +platform = espressif32@3.5.0 board_build.partitions = esp32_partition_app1984k_spiffs64k.csv build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} From eafec3045dc12eee91721606c7e2c1602bfa311a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 25 Apr 2022 14:36:21 +0200 Subject: [PATCH 248/319] hp full names lower case (see #450) --- src/locale_EN.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/locale_EN.h b/src/locale_EN.h index 36b0ce7ba..677a3e104 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -489,23 +489,23 @@ MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, F("auxelecheatnrgconsheating"), F("aux MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("auxiliary electrical heater energy consumption dhw")) MAKE_PSTR_LIST(auxElecHeatNrgConsPool, F("auxelecheatnrgconspool"), F("auxiliary electrical heater energy consumption pool")) -MAKE_PSTR_LIST(hpPower, F("hppower"), F("Compressor power output")) -MAKE_PSTR_LIST(hpCompOn, F("hpcompon"), F("HP Compressor")) -MAKE_PSTR_LIST(hpHeatingOn, F("hpheatingon"), F("HP Heating")) -MAKE_PSTR_LIST(hpCoolingOn, F("hpcoolingon"), F("HP Cooling")) -MAKE_PSTR_LIST(hpWwOn, F("hpwwon"), F("HP dhw")) -MAKE_PSTR_LIST(hpPoolOn, F("hppoolon"), F("HP Pool")) -MAKE_PSTR_LIST(hpBrinePumpSpd, F("hpbrinepumpspd"), F("Brine Pump Speed")) -MAKE_PSTR_LIST(hpCompSpd, F("hpcompspd"), F("Compressor Speed")) -MAKE_PSTR_LIST(hpCircSpd, F("hpcircspd"), F("Circulation pump Speed")) -MAKE_PSTR_LIST(hpBrineIn, F("hpbrinein"), F("Brine in/Evaporator")) -MAKE_PSTR_LIST(hpBrineOut, F("hpbrineout"), F("Brine out/Condenser")) -MAKE_PSTR_LIST(hpSuctionGas, F("hpsuctiongas"), F("Suction gas")) -MAKE_PSTR_LIST(hpHotGas, F("hphotgas"), F("Hot gas/Compressed")) -MAKE_PSTR_LIST(hpSwitchValve, F("hpswitchvalve"), F("Switch Valve")) -MAKE_PSTR_LIST(hpActivity, F("hpactivity"), F("Compressor Activity")) -MAKE_PSTR_LIST(hpTc0, F("hptc0"), F("Heat carrier return (TC0)")) -MAKE_PSTR_LIST(hpTc1, F("hptc1"), F("Heat carrier forward (TC1)")) +MAKE_PSTR_LIST(hpPower, F("hppower"), F("compressor power output")) +MAKE_PSTR_LIST(hpCompOn, F("hpcompon"), F("hp compressor")) +MAKE_PSTR_LIST(hpHeatingOn, F("hpheatingon"), F("hp heating")) +MAKE_PSTR_LIST(hpCoolingOn, F("hpcoolingon"), F("hp cooling")) +MAKE_PSTR_LIST(hpWwOn, F("hpwwon"), F("hp dhw")) +MAKE_PSTR_LIST(hpPoolOn, F("hppoolon"), F("hp pool")) +MAKE_PSTR_LIST(hpBrinePumpSpd, F("hpbrinepumpspd"), F("brine pump speed")) +MAKE_PSTR_LIST(hpCompSpd, F("hpcompspd"), F("compressor speed")) +MAKE_PSTR_LIST(hpCircSpd, F("hpcircspd"), F("circulation pump speed")) +MAKE_PSTR_LIST(hpBrineIn, F("hpbrinein"), F("brine in/evaporator")) +MAKE_PSTR_LIST(hpBrineOut, F("hpbrineout"), F("brine out/condenser")) +MAKE_PSTR_LIST(hpSuctionGas, F("hpsuctiongas"), F("suction gas")) +MAKE_PSTR_LIST(hpHotGas, F("hphotgas"), F("hot gas/compressed")) +MAKE_PSTR_LIST(hpSwitchValve, F("hpswitchvalve"), F("switch valve")) +MAKE_PSTR_LIST(hpActivity, F("hpactivity"), F("compressor activity")) +MAKE_PSTR_LIST(hpTc0, F("hptc0"), F("heat carrier return (TC0)")) +MAKE_PSTR_LIST(hpTc1, F("hptc1"), F("heat carrier forward (TC1)")) MAKE_PSTR_LIST(hpTc3, F("hptc3"), F("condenser temperature (TC3)")) MAKE_PSTR_LIST(hpTr3, F("hptr3"), F("refrigerant temperature liquid side (condenser output) (TR3)")) MAKE_PSTR_LIST(hpTr4, F("hptr4"), F("evaporator inlet temperature (TR4)")) From 00abae10ac3304855cfc91285531ab0a5a35b0fc Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 25 Apr 2022 14:37:15 +0200 Subject: [PATCH 249/319] network security names fixed --- .../src/framework/network/WiFiNetworkSelector.tsx | 11 ++++++----- interface/src/types/network.ts | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/interface/src/framework/network/WiFiNetworkSelector.tsx b/interface/src/framework/network/WiFiNetworkSelector.tsx index 7a1c0bec5..960289ef6 100644 --- a/interface/src/framework/network/WiFiNetworkSelector.tsx +++ b/interface/src/framework/network/WiFiNetworkSelector.tsx @@ -22,14 +22,15 @@ export const isNetworkOpen = ({ encryption_type }: WiFiNetwork) => export const networkSecurityMode = ({ encryption_type }: WiFiNetwork) => { switch (encryption_type) { case WiFiEncryptionType.WIFI_AUTH_WEP: - case WiFiEncryptionType.WIFI_AUTH_WEP_PSK: return 'WEP'; - case WiFiEncryptionType.WIFI_AUTH_WEP2_PSK: - return 'WEP2'; + case WiFiEncryptionType.WIFI_AUTH_WPA_PSK: + return 'WPA'; + case WiFiEncryptionType.WIFI_AUTH_WPA2_PSK: + return 'WPA2'; case WiFiEncryptionType.WIFI_AUTH_WPA_WPA2_PSK: - return 'WPA/WEP2'; + return 'WPA/WPA2'; case WiFiEncryptionType.WIFI_AUTH_WPA2_ENTERPRISE: - return 'WEP2 Enterprise'; + return 'WPA2 Enterprise'; case WiFiEncryptionType.WIFI_AUTH_OPEN: return 'None'; default: diff --git a/interface/src/types/network.ts b/interface/src/types/network.ts index cb12e57a0..538020903 100644 --- a/interface/src/types/network.ts +++ b/interface/src/types/network.ts @@ -12,8 +12,8 @@ export enum NetworkConnectionStatus { export enum WiFiEncryptionType { WIFI_AUTH_OPEN = 0, WIFI_AUTH_WEP = 1, - WIFI_AUTH_WEP_PSK = 2, - WIFI_AUTH_WEP2_PSK = 3, + WIFI_AUTH_WPA_PSK = 2, + WIFI_AUTH_WPA2_PSK = 3, WIFI_AUTH_WPA_WPA2_PSK = 4, WIFI_AUTH_WPA2_ENTERPRISE = 5 } From 4bba52a09e31ba3b8fff9c77297aadc6d0e675d3 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 25 Apr 2022 14:38:12 +0200 Subject: [PATCH 250/319] native boolean values in commands, fix #476 --- src/command.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/command.cpp b/src/command.cpp index 43d3d24b6..98d5b63b2 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -152,6 +152,8 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec } else if (data.is()) { char data_str[10]; return_code = Command::call(device_type, command_p, Helpers::render_value(data_str, data.as(), 2), is_admin, id_n, output); + } else if (data.is()) { + return_code = Command::call(device_type, command_p, data.as() ? "1" : "0", is_admin, id_n, output); } else if (data.isNull()) { return_code = Command::call(device_type, command_p, "", is_admin, id_n, output); // empty, will do a query instead } else { From a721826821dfcd8a650eb26a7e34e71eb7bf42ee Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 13:00:48 +0200 Subject: [PATCH 251/319] fix Updating table component in the WebUI to support sorting & filtering #470 --- interface/src/project/DashboardStatus.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx index 1e9d7113f..c04005e6e 100644 --- a/interface/src/project/DashboardStatus.tsx +++ b/interface/src/project/DashboardStatus.tsx @@ -91,6 +91,7 @@ const DashboardStatus: FC = () => { BaseRow: ` font-size: 14px; color: white; + height: 32px; `, HeaderRow: ` text-transform: uppercase; @@ -126,6 +127,18 @@ const DashboardStatus: FC = () => { &:nth-of-type(1) { flex: 1; } + &:nth-of-type(2) { + text-align: right; + min-width: 64px; + } + &:nth-of-type(3) { + text-align: right; + min-width: 64px; + } + &:last-of-type { + text-align: right; + min-width: 96px; + } ` }); @@ -141,7 +154,7 @@ const DashboardStatus: FC = () => { try { await EMSESP.scanDevices(); enqueueSnackbar('Scanning for devices...', { variant: 'info' }); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem initiating scan'), { variant: 'error' }); } finally { setConfirmScan(false); From 71305135931488af8dc9c013896eb721b64e8fc5 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 13:12:05 +0200 Subject: [PATCH 252/319] update packages --- interface/package-lock.json | 177 ++++++++------- interface/package.json | 14 +- mock-api/package-lock.json | 426 ++++++++++++++++++++++++------------ mock-api/package.json | 4 +- 4 files changed, 395 insertions(+), 226 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 22b7b9914..c529cfef0 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -12,15 +12,15 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.2", + "@mui/material": "^5.6.3", "@table-library/react-table-library": "^3.1.0", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.26", + "@types/node": "^17.0.30", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", - "async-validator": "^4.0.8", - "axios": "^0.26.1", + "async-validator": "^4.1.1", + "axios": "^0.27.2", "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -29,15 +29,15 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.5", + "react-dropzone": "^13.0.0", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", "sockette": "^2.0.6", - "typescript": "^4.6.3" + "typescript": "^4.6.4" }, "devDependencies": { - "nodemon": "^2.0.15", + "nodemon": "^2.0.16", "npm-run-all": "^4.1.5" } }, @@ -2856,9 +2856,9 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.77", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.77.tgz", - "integrity": "sha512-Zqm3qlczGViD3lJSYo8ZnQLHJ3PwGYftbDfVuh2Rq5OD88F7H6oDILlqknzty59NDkeSVO2qlymYmHOY1nLodg==", + "version": "5.0.0-alpha.78", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.78.tgz", + "integrity": "sha512-5L+GNe2M9/tFjQpjK2r837+kzRg/l6D5R9SQbG1wmSWejw5Ei8P+KXIgS/NLNi9g7dUT8bnCyzz9AZKQX1Jsfg==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", @@ -2913,13 +2913,13 @@ } }, "node_modules/@mui/material": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.2.tgz", - "integrity": "sha512-bwMvroBrMgUTwUh/BcjhtcJwEw9uH4chV3+ZSj6RckOJtMj8U4yEeD7S4NgHE8Ioj5eObKFzHpih/cTD1sDRpg==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.3.tgz", + "integrity": "sha512-2VovFsbCEhic29NYoBF7zFrpH2sEOlKXXDhGjzxmWiI9OnC3SX63hapWunjaVsiRINVnjuMHuW1MOs4UtV8Gfg==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.77", - "@mui/system": "^5.6.2", + "@mui/base": "5.0.0-alpha.78", + "@mui/system": "^5.6.3", "@mui/types": "^7.1.3", "@mui/utils": "^5.6.1", "@types/react-transition-group": "^4.4.4", @@ -3013,9 +3013,9 @@ } }, "node_modules/@mui/system": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.2.tgz", - "integrity": "sha512-Wg9TRbvavSwEYk6UdpnoDx+CqJfaAN7AzlmwEx7DtGmx0snFVBST8FVb1Ev1vXosxEnq6/fe7ZDRobFVewvEPQ==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.3.tgz", + "integrity": "sha512-4SRi52a4ttZ2S4EHEDE8arVNuKqyQLTYUTF80WAZ0tQwnG20qwlBtzcrywCGItmVAMl7RUaYopyWOx3yVPvrmQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.6.2", @@ -3763,9 +3763,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.26.tgz", - "integrity": "sha512-z/FG/6DUO7pnze3AE3TBGIjGGKkvCcGcWINe1C7cADY8hKLJPDYpzsNE37uExQ4md5RFtTCvg+M8Mu1Enyeg2A==" + "version": "17.0.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.30.tgz", + "integrity": "sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -4670,9 +4670,9 @@ } }, "node_modules/async-validator": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.8.tgz", - "integrity": "sha512-vx1kyOCuSJqB5IVatlybUkV/e22sdx+V0XohCWbBfbbzbiLFt6fHxfWg6UEBhFw0gVgZtaSLTJtugmP4rdGQAQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.1.1.tgz", + "integrity": "sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -4736,11 +4736,25 @@ } }, "node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "dependencies": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, "node_modules/axobject-query": { @@ -7962,9 +7976,9 @@ } }, "node_modules/file-selector": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", - "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.5.0.tgz", + "integrity": "sha512-s8KNnmIDTBoD0p9uJ9uD0XY38SCeBOtj0UMXyQSLg1Ypfrfj8+dAvwsLjYQkQ2GjhVtp2HrnF5cJzMhBjfD8HA==", "dependencies": { "tslib": "^2.0.3" }, @@ -12026,9 +12040,9 @@ "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" }, "node_modules/nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz", + "integrity": "sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -14423,12 +14437,12 @@ } }, "node_modules/react-dropzone": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.5.tgz", - "integrity": "sha512-zUjZigD0VJ91CSm9T1h7ErxFReBLaa9sjS2dUL0+inb0RROZpSJTNDHPY1rrBES5V2NXhF8v0kghmaHc81BMFg==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-13.0.0.tgz", + "integrity": "sha512-BwzHZlmwC2wFKtGbuWw6A+D+uUaJgUGuheALoVFwTNztwV+7NLzdUrHHUkF9mRkI9u5pJDivH3wo+BgSyYVoTQ==", "dependencies": { "attr-accept": "^2.2.2", - "file-selector": "^0.4.0", + "file-selector": "^0.5.0", "prop-types": "^15.8.1" }, "engines": { @@ -16354,9 +16368,9 @@ } }, "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19555,9 +19569,9 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.77", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.77.tgz", - "integrity": "sha512-Zqm3qlczGViD3lJSYo8ZnQLHJ3PwGYftbDfVuh2Rq5OD88F7H6oDILlqknzty59NDkeSVO2qlymYmHOY1nLodg==", + "version": "5.0.0-alpha.78", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.78.tgz", + "integrity": "sha512-5L+GNe2M9/tFjQpjK2r837+kzRg/l6D5R9SQbG1wmSWejw5Ei8P+KXIgS/NLNi9g7dUT8bnCyzz9AZKQX1Jsfg==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", @@ -19578,13 +19592,13 @@ } }, "@mui/material": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.2.tgz", - "integrity": "sha512-bwMvroBrMgUTwUh/BcjhtcJwEw9uH4chV3+ZSj6RckOJtMj8U4yEeD7S4NgHE8Ioj5eObKFzHpih/cTD1sDRpg==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.3.tgz", + "integrity": "sha512-2VovFsbCEhic29NYoBF7zFrpH2sEOlKXXDhGjzxmWiI9OnC3SX63hapWunjaVsiRINVnjuMHuW1MOs4UtV8Gfg==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.77", - "@mui/system": "^5.6.2", + "@mui/base": "5.0.0-alpha.78", + "@mui/system": "^5.6.3", "@mui/types": "^7.1.3", "@mui/utils": "^5.6.1", "@types/react-transition-group": "^4.4.4", @@ -19617,9 +19631,9 @@ } }, "@mui/system": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.2.tgz", - "integrity": "sha512-Wg9TRbvavSwEYk6UdpnoDx+CqJfaAN7AzlmwEx7DtGmx0snFVBST8FVb1Ev1vXosxEnq6/fe7ZDRobFVewvEPQ==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.3.tgz", + "integrity": "sha512-4SRi52a4ttZ2S4EHEDE8arVNuKqyQLTYUTF80WAZ0tQwnG20qwlBtzcrywCGItmVAMl7RUaYopyWOx3yVPvrmQ==", "requires": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.6.2", @@ -20136,9 +20150,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.26.tgz", - "integrity": "sha512-z/FG/6DUO7pnze3AE3TBGIjGGKkvCcGcWINe1C7cADY8hKLJPDYpzsNE37uExQ4md5RFtTCvg+M8Mu1Enyeg2A==" + "version": "17.0.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.30.tgz", + "integrity": "sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw==" }, "@types/parse-json": { "version": "4.0.0", @@ -20838,9 +20852,9 @@ } }, "async-validator": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.8.tgz", - "integrity": "sha512-vx1kyOCuSJqB5IVatlybUkV/e22sdx+V0XohCWbBfbbzbiLFt6fHxfWg6UEBhFw0gVgZtaSLTJtugmP4rdGQAQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.1.1.tgz", + "integrity": "sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==" }, "asynckit": { "version": "0.4.0", @@ -20876,11 +20890,24 @@ "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==" }, "axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "requires": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "axobject-query": { @@ -23253,9 +23280,9 @@ } }, "file-selector": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz", - "integrity": "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.5.0.tgz", + "integrity": "sha512-s8KNnmIDTBoD0p9uJ9uD0XY38SCeBOtj0UMXyQSLg1Ypfrfj8+dAvwsLjYQkQ2GjhVtp2HrnF5cJzMhBjfD8HA==", "requires": { "tslib": "^2.0.3" } @@ -26186,9 +26213,9 @@ "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" }, "nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz", + "integrity": "sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==", "dev": true, "requires": { "chokidar": "^3.5.2", @@ -27766,12 +27793,12 @@ } }, "react-dropzone": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.5.tgz", - "integrity": "sha512-zUjZigD0VJ91CSm9T1h7ErxFReBLaa9sjS2dUL0+inb0RROZpSJTNDHPY1rrBES5V2NXhF8v0kghmaHc81BMFg==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-13.0.0.tgz", + "integrity": "sha512-BwzHZlmwC2wFKtGbuWw6A+D+uUaJgUGuheALoVFwTNztwV+7NLzdUrHHUkF9mRkI9u5pJDivH3wo+BgSyYVoTQ==", "requires": { "attr-accept": "^2.2.2", - "file-selector": "^0.4.0", + "file-selector": "^0.5.0", "prop-types": "^15.8.1" } }, @@ -29213,9 +29240,9 @@ } }, "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==" }, "unbox-primitive": { "version": "1.0.1", diff --git a/interface/package.json b/interface/package.json index b79479f39..27134b288 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,15 +8,15 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.2", + "@mui/material": "^5.6.3", "@table-library/react-table-library": "^3.1.0", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.26", + "@types/node": "^17.0.30", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", - "async-validator": "^4.0.8", - "axios": "^0.26.1", + "async-validator": "^4.1.1", + "axios": "^0.27.2", "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -25,12 +25,12 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^12.0.5", + "react-dropzone": "^13.0.0", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", "sockette": "^2.0.6", - "typescript": "^4.6.3" + "typescript": "^4.6.4" }, "scripts": { "start": "react-app-rewired start", @@ -97,7 +97,7 @@ ] }, "devDependencies": { - "nodemon": "^2.0.15", + "nodemon": "^2.0.16", "npm-run-all": "^4.1.5" } } diff --git a/mock-api/package-lock.json b/mock-api/package-lock.json index b9c537f6f..b0a9c3d66 100644 --- a/mock-api/package-lock.json +++ b/mock-api/package-lock.json @@ -11,9 +11,9 @@ "dependencies": { "@msgpack/msgpack": "^2.7.2", "compression": "^1.7.4", - "express": "^4.17.3", + "express": "^4.18.1", "express-sse": "^0.5.3", - "nodemon": "^2.0.15", + "nodemon": "^2.0.16", "ws": "^8.5.0" } }, @@ -122,23 +122,26 @@ } }, "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/boxen": { @@ -229,6 +232,18 @@ "node": ">=8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/camelcase": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", @@ -430,9 +445,9 @@ } }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -483,17 +498,21 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/dot-prop": { "version": "5.3.0", @@ -559,37 +578,38 @@ } }, "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -634,16 +654,16 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -679,6 +699,24 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -741,6 +779,17 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -749,6 +798,17 @@ "node": ">=4" } }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -763,18 +823,18 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/iconv-lite": { @@ -1093,9 +1153,9 @@ } }, "node_modules/nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz", + "integrity": "sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==", "hasInstallScript": true, "dependencies": { "chokidar": "^3.5.2", @@ -1163,10 +1223,18 @@ "node": ">=8" } }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -1290,9 +1358,12 @@ } }, "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" }, @@ -1309,12 +1380,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -1420,23 +1491,23 @@ } }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -1448,14 +1519,14 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -1466,17 +1537,30 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/string-width": { @@ -1839,20 +1923,22 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" } }, "boxen": { @@ -1921,6 +2007,15 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "camelcase": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", @@ -2064,9 +2159,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", @@ -2105,14 +2200,14 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "dot-prop": { "version": "5.3.0", @@ -2166,37 +2261,38 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -2223,16 +2319,16 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" } }, @@ -2252,6 +2348,21 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -2299,11 +2410,24 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -2315,14 +2439,14 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" } }, @@ -2548,9 +2672,9 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz", + "integrity": "sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==", "requires": { "chokidar": "^3.5.2", "debug": "^3.2.7", @@ -2597,10 +2721,15 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -2693,9 +2822,12 @@ } }, "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } }, "range-parser": { "version": "1.2.1", @@ -2703,12 +2835,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -2794,23 +2926,23 @@ } }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "ms": { @@ -2821,14 +2953,14 @@ } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "setprototypeof": { @@ -2836,15 +2968,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "string-width": { "version": "4.2.3", diff --git a/mock-api/package.json b/mock-api/package.json index e0613c14a..b963eb4a8 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -13,9 +13,9 @@ "dependencies": { "@msgpack/msgpack": "^2.7.2", "compression": "^1.7.4", - "express": "^4.17.3", + "express": "^4.18.1", "express-sse": "^0.5.3", - "nodemon": "^2.0.15", + "nodemon": "^2.0.16", "ws": "^8.5.0" } } From 0143e89e27aa49364a2ac675cebe2f12f1a587df Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 13:12:30 +0200 Subject: [PATCH 253/319] table formatting --- interface/src/project/DashboardData.tsx | 16 ++++++++-------- .../src/project/SettingsCustomization.tsx | 19 ++++++------------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index ca8781858..d13f1d0dd 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -207,7 +207,6 @@ const DashboardData: FC = () => { border-bottom: 1px solid transparent; &:last-of-type { text-align: right; - min-width: 64px; } `, HeaderCell: ` @@ -360,7 +359,7 @@ const DashboardData: FC = () => { const fetchCoreData = useCallback(async () => { try { setCoreData((await EMSESP.readCoreData()).data); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Failed to fetch core data'), { variant: 'error' }); } }, [enqueueSnackbar]); @@ -381,7 +380,7 @@ const DashboardData: FC = () => { const unique_id = parseInt(id); try { setDeviceData((await EMSESP.readDeviceData({ id: unique_id })).data); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem fetching device data'), { variant: 'error' }); } }; @@ -389,7 +388,7 @@ const DashboardData: FC = () => { const fetchSensorData = async () => { try { setSensorData((await EMSESP.readSensorData()).data); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem fetching sensor data'), { variant: 'error' }); } }; @@ -442,7 +441,7 @@ const DashboardData: FC = () => { enqueueSnackbar('Write command sent', { variant: 'success' }); } setDeviceValue(undefined); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem writing value'), { variant: 'error' }); } finally { refreshData(); @@ -533,7 +532,7 @@ const DashboardData: FC = () => { enqueueSnackbar('Sensor updated', { variant: 'success' }); } setSensor(undefined); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem updating sensor'), { variant: 'error' }); } finally { setSensor(undefined); @@ -741,6 +740,7 @@ const DashboardData: FC = () => { }} theme={data_theme} sort={dv_sort} + // layout={{ custom: true }} > {(tableList: any) => ( <> @@ -940,7 +940,7 @@ const DashboardData: FC = () => { } else { enqueueSnackbar('Analog sensor removed', { variant: 'success' }); } - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem updating analog sensor'), { variant: 'error' }); } finally { setAnalog(undefined); @@ -968,7 +968,7 @@ const DashboardData: FC = () => { } else { enqueueSnackbar('Analog sensor updated', { variant: 'success' }); } - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem updating analog'), { variant: 'error' }); } finally { setAnalog(undefined); diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index c8c020ddf..acc3296e9 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -108,7 +108,6 @@ const SettingsCustomization: FC = () => { min-width: 124px; width: 124px; padding-left: 0px; - } &:nth-of-type(2) { min-width: 70%; @@ -155,7 +154,7 @@ const SettingsCustomization: FC = () => { const fetchDevices = useCallback(async () => { try { setDevices((await EMSESP.readDevices()).data); - } catch (error: any) { + } catch (error: unknown) { setErrorMessage(extractErrorMessage(error, 'Failed to fetch device list')); } }, []); @@ -168,7 +167,7 @@ const SettingsCustomization: FC = () => { try { const data = (await EMSESP.readDeviceEntities({ id: unique_id })).data; setInitialMask(data); - } catch (error: any) { + } catch (error: unknown) { setErrorMessage(extractErrorMessage(error, 'Problem fetching device entities')); } }; @@ -250,7 +249,7 @@ const SettingsCustomization: FC = () => { try { await EMSESP.resetCustomizations(); enqueueSnackbar('All customizations have been removed. Restarting...', { variant: 'info' }); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem resetting customizations'), { variant: 'error' }); } finally { setConfirmReset(false); @@ -278,7 +277,7 @@ const SettingsCustomization: FC = () => { } else { enqueueSnackbar('Customization save failed', { variant: 'error' }); } - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem sending entity list'), { variant: 'error' }); } setInitialMask(deviceEntities); @@ -414,17 +413,12 @@ const SettingsCustomization: FC = () => { -
+
{(tableList: any) => ( <>
- OPTIONS + OPTIONS VALUE -
From 6b315d52a8b7543ce35bbf21754160ba7774e040 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 13:12:40 +0200 Subject: [PATCH 254/319] update axioserror --- interface/src/SignIn.tsx | 10 +++++++--- .../src/components/upload/SingleUpload.tsx | 12 +++++++++--- .../src/components/upload/useFileUpload.ts | 2 +- .../authentication/Authentication.tsx | 6 +++--- .../src/contexts/features/FeaturesLoader.tsx | 2 +- .../framework/network/WiFiNetworkScanner.tsx | 19 ++++++++++++++----- interface/src/framework/ntp/NTPStatusForm.tsx | 2 +- .../src/framework/security/GenerateToken.tsx | 2 +- .../framework/system/FirmwareFileUpload.tsx | 1 - .../system/FirmwareRestartMonitor.tsx | 2 +- interface/src/framework/system/SystemLog.tsx | 4 ++-- .../src/framework/system/SystemStatusForm.tsx | 4 ++-- interface/src/project/HelpInformation.tsx | 2 +- interface/src/project/SettingsApplication.tsx | 4 ++-- interface/src/utils/endpoints.ts | 10 ++++++++-- interface/src/utils/useRest.ts | 4 ++-- 16 files changed, 55 insertions(+), 31 deletions(-) diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx index 602c44588..b5e4139b1 100644 --- a/interface/src/SignIn.tsx +++ b/interface/src/SignIn.tsx @@ -9,6 +9,8 @@ import * as AuthenticationApi from './api/authentication'; import { PROJECT_NAME } from './api/env'; import { AuthenticationContext } from './contexts/authentication'; +import { AxiosError } from 'axios'; + import { extractErrorMessage, onEnterCallback, updateValue } from './utils'; import { SignInRequest } from './types'; import { ValidatedTextField } from './components'; @@ -42,9 +44,11 @@ const SignIn: FC = () => { try { const { data: loginResponse } = await AuthenticationApi.signIn(signInRequest); authenticationContext.signIn(loginResponse.access_token); - } catch (error: any) { - if (error.response?.status === 401) { - enqueueSnackbar('Invalid login details', { variant: 'warning' }); + } catch (error: unknown) { + if (error instanceof AxiosError) { + if (error.response?.status === 401) { + enqueueSnackbar('Invalid login details', { variant: 'warning' }); + } } else { enqueueSnackbar(extractErrorMessage(error, 'Unexpected error, please try again'), { variant: 'error' }); } diff --git a/interface/src/components/upload/SingleUpload.tsx b/interface/src/components/upload/SingleUpload.tsx index d58cc890d..f1cb6fb18 100644 --- a/interface/src/components/upload/SingleUpload.tsx +++ b/interface/src/components/upload/SingleUpload.tsx @@ -24,13 +24,19 @@ const getBorderColor = (theme: Theme, props: DropzoneState) => { export interface SingleUploadProps { onDrop: (acceptedFiles: File[]) => void; onCancel: () => void; - accept?: string | string[]; uploading: boolean; progress?: ProgressEvent; } -const SingleUpload: FC = ({ onDrop, onCancel, accept, uploading, progress }) => { - const dropzoneState = useDropzone({ onDrop, accept, disabled: uploading, multiple: false }); +const SingleUpload: FC = ({ onDrop, onCancel, uploading, progress }) => { + const dropzoneState = useDropzone({ + onDrop, + accept: { + 'application/octet-stream': ['.bin'] + }, + disabled: uploading, + multiple: false + }); const { getRootProps, getInputProps } = dropzoneState; const theme = useTheme(); diff --git a/interface/src/components/upload/useFileUpload.ts b/interface/src/components/upload/useFileUpload.ts index d7d476900..b7529020f 100644 --- a/interface/src/components/upload/useFileUpload.ts +++ b/interface/src/components/upload/useFileUpload.ts @@ -43,7 +43,7 @@ const useFileUpload = ({ upload }: MediaUploadOptions) => { }); resetUploadingStates(); enqueueSnackbar('Upload successful', { variant: 'success' }); - } catch (error: any) { + } catch (error: unknown) { if (axios.isCancel(error)) { enqueueSnackbar('Upload aborted', { variant: 'warning' }); } else { diff --git a/interface/src/contexts/authentication/Authentication.tsx b/interface/src/contexts/authentication/Authentication.tsx index 93f09b77f..9577fbee4 100644 --- a/interface/src/contexts/authentication/Authentication.tsx +++ b/interface/src/contexts/authentication/Authentication.tsx @@ -23,9 +23,9 @@ const Authentication: FC = ({ children }) => { const decodedMe = AuthenticationApi.decodeMeJWT(accessToken); setMe(decodedMe); enqueueSnackbar(`Logged in as ${decodedMe.username}`, { variant: 'success' }); - } catch (error: any) { + } catch (error: unknown) { setMe(undefined); - throw new Error('Failed to parse JWT ' + error.message); + throw new Error('Failed to parse JWT'); } }; @@ -49,7 +49,7 @@ const Authentication: FC = ({ children }) => { await AuthenticationApi.verifyAuthorization(); setMe(AuthenticationApi.decodeMeJWT(accessToken)); setInitialized(true); - } catch (error: any) { + } catch (error: unknown) { setMe(undefined); setInitialized(true); } diff --git a/interface/src/contexts/features/FeaturesLoader.tsx b/interface/src/contexts/features/FeaturesLoader.tsx index e02c3411c..8f412717c 100644 --- a/interface/src/contexts/features/FeaturesLoader.tsx +++ b/interface/src/contexts/features/FeaturesLoader.tsx @@ -16,7 +16,7 @@ const FeaturesLoader: FC = (props) => { try { const response = await FeaturesApi.readFeatures(); setFeatures(response.data); - } catch (error: any) { + } catch (error: unknown) { setErrorMessage(extractErrorMessage(error, 'Failed to fetch application details.')); } }, []); diff --git a/interface/src/framework/network/WiFiNetworkScanner.tsx b/interface/src/framework/network/WiFiNetworkScanner.tsx index 9f3798f5f..169bc6951 100644 --- a/interface/src/framework/network/WiFiNetworkScanner.tsx +++ b/interface/src/framework/network/WiFiNetworkScanner.tsx @@ -1,13 +1,14 @@ import { useEffect, FC, useState, useCallback, useRef } from 'react'; import { useSnackbar } from 'notistack'; +import { AxiosError } from 'axios'; + import { Button } from '@mui/material'; import PermScanWifiIcon from '@mui/icons-material/PermScanWifi'; import * as NetworkApi from '../../api/network'; import { WiFiNetwork, WiFiNetworkList } from '../../types'; import { ButtonRow, FormLoader, SectionContent } from '../../components'; -import { extractErrorMessage } from '../../utils'; import WiFiNetworkSelector from './WiFiNetworkSelector'; @@ -52,8 +53,12 @@ const WiFiNetworkScanner: FC = () => { newNetworkList.networks.sort(compareNetworks); setNetworkList(newNetworkList); } - } catch (error: any) { - finishedWithError(extractErrorMessage(error, 'Problem listing WiFi networks')); + } catch (error: unknown) { + if (error instanceof AxiosError) { + finishedWithError('Problem listing WiFi networks ' + error.response?.data.message); + } else { + finishedWithError('Problem listing WiFi networks'); + } } }, [finishedWithError]); @@ -64,8 +69,12 @@ const WiFiNetworkScanner: FC = () => { try { await NetworkApi.scanNetworks(); setTimeout(pollNetworkList, POLLING_FREQUENCY); - } catch (error: any) { - finishedWithError(extractErrorMessage(error, 'Problem scanning for WiFi networks')); + } catch (error: unknown) { + if (error instanceof AxiosError) { + finishedWithError('Problem scanning for WiFi networks ' + error.response?.data.message); + } else { + finishedWithError('Problem scanning for WiFi networks'); + } } }, [finishedWithError, pollNetworkList]); diff --git a/interface/src/framework/ntp/NTPStatusForm.tsx b/interface/src/framework/ntp/NTPStatusForm.tsx index 2e0f03957..51182af5f 100644 --- a/interface/src/framework/ntp/NTPStatusForm.tsx +++ b/interface/src/framework/ntp/NTPStatusForm.tsx @@ -86,7 +86,7 @@ const NTPStatusForm: FC = () => { enqueueSnackbar('Time set', { variant: 'success' }); setSettingTime(false); loadData(); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem updating time'), { variant: 'error' }); } finally { setProcessing(false); diff --git a/interface/src/framework/security/GenerateToken.tsx b/interface/src/framework/security/GenerateToken.tsx index e834b9d26..75296c946 100644 --- a/interface/src/framework/security/GenerateToken.tsx +++ b/interface/src/framework/security/GenerateToken.tsx @@ -33,7 +33,7 @@ const GenerateToken: FC = ({ username, onClose }) => { const getToken = useCallback(async () => { try { setToken((await SecurityApi.generateToken(username)).data); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem generating token'), { variant: 'error' }); } }, [username, enqueueSnackbar]); diff --git a/interface/src/framework/system/FirmwareFileUpload.tsx b/interface/src/framework/system/FirmwareFileUpload.tsx index 8e5a056f3..a0b212fdf 100644 --- a/interface/src/framework/system/FirmwareFileUpload.tsx +++ b/interface/src/framework/system/FirmwareFileUpload.tsx @@ -21,7 +21,6 @@ const FirmwareFileUpload: FC = ({ uploadFirmware }) => { /> )} { try { await SystemApi.readSystemStatus(POLL_TIMEOUT); document.location.href = '/firmwareUpdated'; - } catch (error: any) { + } catch (error: unknown) { if (new Date().getTime() < timeoutAt.current) { setTimeoutId(setTimeout(poll.current, POLL_INTERVAL)); } else { diff --git a/interface/src/framework/system/SystemLog.tsx b/interface/src/framework/system/SystemLog.tsx index 7878691f8..9d5413aa6 100644 --- a/interface/src/framework/system/SystemLog.tsx +++ b/interface/src/framework/system/SystemLog.tsx @@ -106,7 +106,7 @@ const SystemLog: FC = () => { if (response.status !== 200) { enqueueSnackbar('Problem applying log settings', { variant: 'error' }); } - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem applying log settings'), { variant: 'error' }); } } @@ -158,7 +158,7 @@ const SystemLog: FC = () => { const fetchLog = useCallback(async () => { try { setLogEntries((await SystemApi.readLogEntries()).data); - } catch (error: any) { + } catch (error: unknown) { setErrorMessage(extractErrorMessage(error, 'Failed to fetch log')); } }, []); diff --git a/interface/src/framework/system/SystemStatusForm.tsx b/interface/src/framework/system/SystemStatusForm.tsx index 092ca03ba..62c333fce 100644 --- a/interface/src/framework/system/SystemStatusForm.tsx +++ b/interface/src/framework/system/SystemStatusForm.tsx @@ -81,7 +81,7 @@ const SystemStatusForm: FC = () => { try { await SystemApi.restart(); enqueueSnackbar('EMS-ESP is restarting...', { variant: 'info' }); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem restarting device'), { variant: 'error' }); } finally { setConfirmRestart(false); @@ -179,7 +179,7 @@ const SystemStatusForm: FC = () => { try { await SystemApi.factoryReset(); enqueueSnackbar('Device has been factory reset and will now restart', { variant: 'info' }); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem factory resetting the device'), { variant: 'error' }); } finally { setConfirmFactoryReset(false); diff --git a/interface/src/project/HelpInformation.tsx b/interface/src/project/HelpInformation.tsx index 9790071e9..803f30b83 100644 --- a/interface/src/project/HelpInformation.tsx +++ b/interface/src/project/HelpInformation.tsx @@ -48,7 +48,7 @@ const HelpInformation: FC = () => { document.body.removeChild(a); enqueueSnackbar('File downloaded', { variant: 'info' }); } - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem with downloading'), { variant: 'error' }); } }; diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx index 2213634ac..0ea86722b 100644 --- a/interface/src/project/SettingsApplication.tsx +++ b/interface/src/project/SettingsApplication.tsx @@ -64,7 +64,7 @@ const SettingsApplication: FC = () => { eth_clock_mode: response.data.eth_clock_mode }); } - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem fetching board profile'), { variant: 'error' }); } finally { setProcessingBoard(false); @@ -103,7 +103,7 @@ const SettingsApplication: FC = () => { try { await EMSESP.restart(); enqueueSnackbar('EMS-ESP is restarting...', { variant: 'info' }); - } catch (error: any) { + } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem restarting device'), { variant: 'error' }); } }; diff --git a/interface/src/utils/endpoints.ts b/interface/src/utils/endpoints.ts index 86265b0a5..24d88fe1e 100644 --- a/interface/src/utils/endpoints.ts +++ b/interface/src/utils/endpoints.ts @@ -1,4 +1,10 @@ import { AxiosError } from 'axios'; -export const extractErrorMessage = (error: AxiosError, defaultMessage: string) => - (error.response && error.response.data ? error.response.data.message : error.message) || defaultMessage; +export const extractErrorMessage = (error: unknown, defaultMessage: string) => { + if (error instanceof AxiosError) { + return error.response && error.response.data && error?.response?.data?.message; + } else if (error instanceof Error) { + return error.message; + } + return defaultMessage; +}; diff --git a/interface/src/utils/useRest.ts b/interface/src/utils/useRest.ts index ca948d0ec..e889e4521 100644 --- a/interface/src/utils/useRest.ts +++ b/interface/src/utils/useRest.ts @@ -22,7 +22,7 @@ export const useRest = ({ read, update }: RestRequestOptions) => { setErrorMessage(undefined); try { setData((await read()).data); - } catch (error: any) { + } catch (error: unknown) { const message = extractErrorMessage(error, 'Problem loading data'); enqueueSnackbar(message, { variant: 'error' }); setErrorMessage(message); @@ -45,7 +45,7 @@ export const useRest = ({ read, update }: RestRequestOptions) => { } else { enqueueSnackbar('Settings saved', { variant: 'success' }); } - } catch (error: any) { + } catch (error: unknown) { const message = extractErrorMessage(error, 'Problem saving data'); enqueueSnackbar(message, { variant: 'error' }); setErrorMessage(message); From 6241999d2f3c67d8597cc5ea27ba61b14669ce2a Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 15:38:58 +0200 Subject: [PATCH 255/319] more formatting --- interface/src/project/DashboardData.tsx | 18 ++++++++++++------ .../src/project/SettingsCustomization.tsx | 14 ++++++++++---- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index d13f1d0dd..ca52cb24a 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -197,23 +197,29 @@ const DashboardData: FC = () => { border-top: 1px solid #177ac9; border-bottom: 1px solid #177ac9; color: white; - cursor: 'pointer', } `, BaseCell: ` - padding-left: 8px; + cursor: pointer; border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; + padding-left: 16px; + width: 124px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; &:last-of-type { text-align: right; } `, HeaderCell: ` - padding-left: 0px; - &:not(:last-of-type) { - border-right: 1px solid #565656; - } + &:nth-of-type(1) { + padding-left: 8px; + } + &:not(:last-of-type) { + border-right: 1px solid #565656; + } ` }); diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index acc3296e9..fd0703a6f 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -63,6 +63,7 @@ const SettingsCustomization: FC = () => { font-size: 14px; color: white; height: 32px; + min-height: 32px; `, HeaderRow: ` text-transform: uppercase; @@ -103,6 +104,9 @@ const SettingsCustomization: FC = () => { border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; &:nth-of-type(1) { left: 0px; min-width: 124px; @@ -115,12 +119,14 @@ const SettingsCustomization: FC = () => { } `, HeaderCell: ` - padding-left: 0px; &:nth-of-type(1) { padding-left: 24px; } - &:nth-of-type(3) { - border-left: 1px solid #565656; + &:nth-of-type(2) { + padding-left: 0px; + } + &:not(:last-of-type) { + border-right: 1px solid #565656; } ` }); @@ -429,7 +435,7 @@ const SettingsCustomization: FC = () => { NAME - VALUE + VALUE From 2c490e414804f05ba5d3bc46fe1636e19d0abfa0 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 15:43:36 +0200 Subject: [PATCH 256/319] possible fix for #476 --- lib/async-mqtt-client/src/AsyncMqttClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/async-mqtt-client/src/AsyncMqttClient.cpp b/lib/async-mqtt-client/src/AsyncMqttClient.cpp index 98f0e5f29..7c0f269e9 100644 --- a/lib/async-mqtt-client/src/AsyncMqttClient.cpp +++ b/lib/async-mqtt-client/src/AsyncMqttClient.cpp @@ -426,7 +426,7 @@ void AsyncMqttClient::_handleQueue() { (void)realSent; _client.send(); _lastClientActivity = millis(); - _lastPingRequestTime = 0; + // _lastPingRequestTime = 0; // https://github.com/marvinroger/async-mqtt-client/issues/281#issuecomment-1112897839 #if ASYNC_TCP_SSL_ENABLED log_i("snd #%u: (tls: %u) %u/%u", _head->packetType(), realSent, _sent, _head->size()); #else From 7fe2b843e65baa566b15ac062b91269a490c40ac Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 15:54:07 +0200 Subject: [PATCH 257/319] b14 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 5d3f3a8fe..4b88090e3 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b13" +#define EMSESP_APP_VERSION "3.4.0b14" From c1a71afd7761bf631a7df439d8c576781aab0328 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 15:54:49 +0200 Subject: [PATCH 258/319] update ArduinoJson to 6.19.4 --- lib/ArduinoJson/CHANGELOG.md | 8 ++++++++ lib/ArduinoJson/README.md | 4 ++-- .../src/ArduinoJson/Array/ElementProxy.hpp | 4 ++++ .../src/ArduinoJson/Document/JsonDocument.hpp | 17 +++++++---------- .../src/ArduinoJson/Object/MemberProxy.hpp | 4 ++++ .../src/ArduinoJson/Variant/VariantCompare.hpp | 6 +++--- lib/ArduinoJson/src/ArduinoJson/version.hpp | 4 ++-- 7 files changed, 30 insertions(+), 17 deletions(-) diff --git a/lib/ArduinoJson/CHANGELOG.md b/lib/ArduinoJson/CHANGELOG.md index 6a2e8a8d7..78cd12ac3 100644 --- a/lib/ArduinoJson/CHANGELOG.md +++ b/lib/ArduinoJson/CHANGELOG.md @@ -1,6 +1,14 @@ ArduinoJson: change log ======================= +v6.19.4 (2022-04-05) +------- + +* Add `ElementProxy::memoryUsage()` +* Add `MemberProxy::memoryUsage()` (issue #1730) +* Add implicit conversion from `JsonDocument` to `JsonVariant` +* Fix comparisons operators with `const JsonDocument&` + v6.19.3 (2022-03-08) ------- diff --git a/lib/ArduinoJson/README.md b/lib/ArduinoJson/README.md index a4c95cb97..ddf35475a 100644 --- a/lib/ArduinoJson/README.md +++ b/lib/ArduinoJson/README.md @@ -7,8 +7,8 @@ [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/arduinojson.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson) [![LGTM Grade](https://img.shields.io/lgtm/grade/cpp/github/bblanchon/ArduinoJson?label=quality&logo=lgtm)](https://lgtm.com/projects/g/bblanchon/ArduinoJson/) [![Coveralls branch](https://img.shields.io/coveralls/github/bblanchon/ArduinoJson/6.x?logo=coveralls)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x) -[![Arduino Library Manager](https://img.shields.io/static/v1?label=Arduino&message=v6.19.3&logo=arduino&logoColor=white&color=blue)](https://www.ardu-badge.com/ArduinoJson/6.19.3) -[![PlatformIO Registry](https://badges.registry.platformio.org/packages/bblanchon/library/ArduinoJson.svg?version=6.19.3)](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.19.3) +[![Arduino Library Manager](https://img.shields.io/static/v1?label=Arduino&message=v6.19.4&logo=arduino&logoColor=white&color=blue)](https://www.ardu-badge.com/ArduinoJson/6.19.4) +[![PlatformIO Registry](https://badges.registry.platformio.org/packages/bblanchon/library/ArduinoJson.svg?version=6.19.4)](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.19.4) [![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat&logo=github)](https://github.com/bblanchon/ArduinoJson/stargazers) [![GitHub Sponsors](https://img.shields.io/github/sponsors/bblanchon?logo=github)](https://github.com/sponsors/bblanchon) diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp index d54de4947..821cfba3c 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp @@ -118,6 +118,10 @@ class ElementProxy : public VariantOperators >, return getUpstreamElement().size(); } + FORCE_INLINE size_t memoryUsage() const { + return getUpstreamElement().memoryUsage(); + } + template VariantRef getMember(TNestedKey* key) const { return getUpstreamElement().getMember(key); diff --git a/lib/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp b/lib/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp index 90e22e798..274cce714 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp @@ -14,7 +14,8 @@ namespace ARDUINOJSON_NAMESPACE { -class JsonDocument : public Visitable { +class JsonDocument : public Visitable, + public VariantOperators { public: template typename TVisitor::result_type accept(TVisitor& visitor) const { @@ -295,16 +296,12 @@ class JsonDocument : public Visitable { _data.remove(adaptString(key)); } + FORCE_INLINE operator VariantRef() { + return getVariant(); + } + FORCE_INLINE operator VariantConstRef() const { - return VariantConstRef(&_data); - } - - bool operator==(VariantConstRef rhs) const { - return getVariant() == rhs; - } - - bool operator!=(VariantConstRef rhs) const { - return getVariant() != rhs; + return getVariant(); } protected: diff --git a/lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp b/lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp index e8fff4def..9a1bc83fd 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp @@ -94,6 +94,10 @@ class MemberProxy : public VariantOperators >, return getUpstreamMember().size(); } + FORCE_INLINE size_t memoryUsage() const { + return getUpstreamMember().memoryUsage(); + } + FORCE_INLINE void remove(size_t index) const { getUpstreamMember().remove(index); } diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp index a71f3e0d0..2f636156b 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp @@ -131,9 +131,9 @@ struct RawComparer : ComparerBase { template struct Comparer::value>::type> : ComparerBase { - T rhs; + const T *rhs; // TODO: should be a VariantConstRef - explicit Comparer(T value) : rhs(value) {} + explicit Comparer(const T &value) : rhs(&value) {} CompareResult visitArray(const CollectionData &lhs) { ArrayComparer comparer(lhs); @@ -183,7 +183,7 @@ struct Comparer::value>::type> private: template CompareResult accept(TComparer &comparer) { - CompareResult reversedResult = rhs.accept(comparer); + CompareResult reversedResult = rhs->accept(comparer); switch (reversedResult) { case COMPARE_RESULT_GREATER: return COMPARE_RESULT_LESS; diff --git a/lib/ArduinoJson/src/ArduinoJson/version.hpp b/lib/ArduinoJson/src/ArduinoJson/version.hpp index d6a23d4c8..d2de577d5 100644 --- a/lib/ArduinoJson/src/ArduinoJson/version.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/version.hpp @@ -4,7 +4,7 @@ #pragma once -#define ARDUINOJSON_VERSION "6.19.3" +#define ARDUINOJSON_VERSION "6.19.4" #define ARDUINOJSON_VERSION_MAJOR 6 #define ARDUINOJSON_VERSION_MINOR 19 -#define ARDUINOJSON_VERSION_REVISION 3 +#define ARDUINOJSON_VERSION_REVISION 4 From da2c81818e0cd72afcee982141774f4b2a4dcbb5 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 16:02:48 +0200 Subject: [PATCH 259/319] table formatting --- interface/src/project/DashboardStatus.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx index c04005e6e..347e89163 100644 --- a/interface/src/project/DashboardStatus.tsx +++ b/interface/src/project/DashboardStatus.tsx @@ -124,20 +124,28 @@ const DashboardStatus: FC = () => { border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; &:nth-of-type(1) { + padding-left: 8px; flex: 1; } &:nth-of-type(2) { + min-width: 15%; + width: 15%; text-align: right; - min-width: 64px; } &:nth-of-type(3) { + min-width: 15%; + width: 15%; text-align: right; - min-width: 64px; } &:last-of-type { + min-width: 15%; + width: 15%; text-align: right; - min-width: 96px; + padding-right: 8px; } ` }); From 3ff75db00a8dbd12e879a74ce6beb9abcbfab70e Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 16:35:45 +0200 Subject: [PATCH 260/319] add more minor formatting --- interface/src/project/DashboardData.tsx | 39 ++++++++++++++++++++----- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index ca52cb24a..e657af94b 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -138,6 +138,7 @@ const DashboardData: FC = () => { border-right: 1px solid transparent; border-bottom: 1px solid transparent; &:nth-of-type(1) { + padding-left: 8px; min-width: 42px; width: 42px; div { @@ -200,11 +201,17 @@ const DashboardData: FC = () => { } `, BaseCell: ` + padding-left: 16px; cursor: pointer; border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; - padding-left: 16px; + &:nth-of-type(1) { + padding-left: 16px; + } + &:nth-of-type(4) { + padding-left: 16px; + } width: 124px; white-space: nowrap; overflow: hidden; @@ -214,12 +221,16 @@ const DashboardData: FC = () => { } `, HeaderCell: ` - &:nth-of-type(1) { padding-left: 8px; - } - &:not(:last-of-type) { - border-right: 1px solid #565656; - } + &:nth-of-type(1) { + padding-left: 8px; + } + &:nth-of-type(4) { + padding-left: 16px; + } + &:not(:last-of-type) { + border-right: 1px solid #565656; + } ` }); @@ -242,6 +253,7 @@ const DashboardData: FC = () => { iconUp: , iconDown: }, + sortToggleType: SortToggleType.AlternateWithReset, sortFns: { GPIO: (array) => array.sort((a, b) => a.g - b.g), NAME: (array) => array.sort((a, b) => a.n.localeCompare(b.n)), @@ -259,6 +271,7 @@ const DashboardData: FC = () => { iconUp: , iconDown: }, + sortToggleType: SortToggleType.AlternateWithReset, sortFns: { NAME: (array) => array.sort((a, b) => a.n.localeCompare(b.n)), TEMPERATURE: (array) => array.sort((a, b) => a.t - b.t) @@ -277,7 +290,8 @@ const DashboardData: FC = () => { }, sortToggleType: SortToggleType.AlternateWithReset, sortFns: { - NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))) + NAME: (array) => array.sort((a, b) => a.id.slice(2).localeCompare(b.id.slice(2))), + VALUE: (array) => array.sort((a, b) => a.v.toString().localeCompare(b.v.toString())) } } ); @@ -762,7 +776,16 @@ const DashboardData: FC = () => { ENTITY NAME - VALUE + + + From 08135baae6aa2015ea4a8e5193eccf380624afb3 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 1 May 2022 17:53:41 +0200 Subject: [PATCH 261/319] update dropzone --- interface/package-lock.json | 16 ++++++++-------- interface/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index c529cfef0..6b6cb4442 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -29,7 +29,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^13.0.0", + "react-dropzone": "^14.0.1", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", @@ -14437,9 +14437,9 @@ } }, "node_modules/react-dropzone": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-13.0.0.tgz", - "integrity": "sha512-BwzHZlmwC2wFKtGbuWw6A+D+uUaJgUGuheALoVFwTNztwV+7NLzdUrHHUkF9mRkI9u5pJDivH3wo+BgSyYVoTQ==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.0.1.tgz", + "integrity": "sha512-FyRWrlMmM2+8TkM0aPdRwdZJ5HX3+4O1vWtHecJMFB36N89Bub1sIrk8HyOrjb9hwm1HXGRZ4Q+PW4G/MDFg1Q==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.5.0", @@ -14449,7 +14449,7 @@ "node": ">= 10.13" }, "peerDependencies": { - "react": ">= 16.8" + "react": ">= 16.8 || 18.0.0" } }, "node_modules/react-error-overlay": { @@ -27793,9 +27793,9 @@ } }, "react-dropzone": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-13.0.0.tgz", - "integrity": "sha512-BwzHZlmwC2wFKtGbuWw6A+D+uUaJgUGuheALoVFwTNztwV+7NLzdUrHHUkF9mRkI9u5pJDivH3wo+BgSyYVoTQ==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.0.1.tgz", + "integrity": "sha512-FyRWrlMmM2+8TkM0aPdRwdZJ5HX3+4O1vWtHecJMFB36N89Bub1sIrk8HyOrjb9hwm1HXGRZ4Q+PW4G/MDFg1Q==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.5.0", diff --git a/interface/package.json b/interface/package.json index 27134b288..775829526 100644 --- a/interface/package.json +++ b/interface/package.json @@ -25,7 +25,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^13.0.0", + "react-dropzone": "^14.0.1", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", From 191e47eb14c65bfd4b6f173f4e99b54de0ccf8ac Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 22:58:50 +0200 Subject: [PATCH 262/319] rename value to stop static code analysis complaining --- src/helpers.cpp | 164 ++++++++++++++++++++++++------------------------ src/helpers.h | 26 ++++---- 2 files changed, 96 insertions(+), 94 deletions(-) diff --git a/src/helpers.cpp b/src/helpers.cpp index 09c8792ee..8059b9164 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -464,91 +464,142 @@ uint32_t Helpers::abs(const int32_t i) { } // for booleans, use isBool true (EMS_VALUE_BOOL) -bool Helpers::hasValue(const uint8_t & v, const uint8_t isBool) { +bool Helpers::hasValue(const uint8_t & value, const uint8_t isBool) { if (isBool == EMS_VALUE_BOOL) { - return (v != EMS_VALUE_BOOL_NOTSET); + return (value != EMS_VALUE_BOOL_NOTSET); } - return (v != EMS_VALUE_UINT_NOTSET); + return (value != EMS_VALUE_UINT_NOTSET); } -bool Helpers::hasValue(const int8_t & v) { - return (v != EMS_VALUE_INT_NOTSET); +bool Helpers::hasValue(const int8_t & value) { + return (value != EMS_VALUE_INT_NOTSET); } -bool Helpers::hasValue(const char * v) { - if ((v == nullptr) || (strlen(v) == 0)) { +bool Helpers::hasValue(const char * value) { + if ((value == nullptr) || (strlen(value) == 0)) { return false; } - return (v[0] != '\0'); + return (value[0] != '\0'); } // for short these are typically 0x8300, 0x7D00 and sometimes 0x8000 -bool Helpers::hasValue(const int16_t & v) { - return (abs(v) < EMS_VALUE_USHORT_NOTSET); +bool Helpers::hasValue(const int16_t & value) { + return (abs(value) < EMS_VALUE_USHORT_NOTSET); } -bool Helpers::hasValue(const uint16_t & v) { - return (v < EMS_VALUE_USHORT_NOTSET); +bool Helpers::hasValue(const uint16_t & value) { + return (value < EMS_VALUE_USHORT_NOTSET); } -bool Helpers::hasValue(const uint32_t & v) { - return (v != EMS_VALUE_ULONG_NOTSET); +bool Helpers::hasValue(const uint32_t & value) { + return (value != EMS_VALUE_ULONG_NOTSET); } // checks if we can convert a char string to an int value -bool Helpers::value2number(const char * v, int & value, const int min, const int max) { - if ((v == nullptr) || (strlen(v) == 0)) { - value = 0; +bool Helpers::value2number(const char * value, int & value_i, const int min, const int max) { + if ((value == nullptr) || (strlen(value) == 0)) { + value_i = 0; return false; } - value = atoi(v); - if (value >= min && value <= max) { + value_i = atoi(value); + if (value_i >= min && value_i <= max) { return true; } return false; } // checks if we can convert a char string to a float value -bool Helpers::value2float(const char * v, float & value) { - value = 0; - if ((v == nullptr) || (strlen(v) == 0)) { +bool Helpers::value2float(const char * value, float & value_f) { + value_f = 0; + if ((value == nullptr) || (strlen(value) == 0)) { return false; } - if (v[0] == '-' || v[0] == '.' || (v[0] >= '0' && v[0] <= '9')) { - value = atof(v); + if (value[0] == '-' || value[0] == '.' || (value[0] >= '0' && value[0] <= '9')) { + value_f = atof(value); return true; } - if (v[0] == '+' && (v[1] == '.' || (v[1] >= '0' && v[1] <= '9'))) { - value = atof(v + 1); + if (value[0] == '+' && (value[1] == '.' || (value[1] >= '0' && value[1] <= '9'))) { + value_f = atof(value + 1); return true; } return false; } -bool Helpers::value2temperature(const char * v, float & value, bool relative) { - if (value2float(v, value)) { +bool Helpers::value2temperature(const char * value, float & value_f, bool relative) { + if (value2float(value, value_f)) { if (EMSESP::system_.fahrenheit()) { - value = relative ? (value / 1.8) : (value - 32) / 1.8; + value_f = relative ? (value_f / 1.8) : (value_f - 32) / 1.8; } return true; } return false; } -bool Helpers::value2temperature(const char * v, int & value, const bool relative, const int min, const int max) { - if (value2number(v, value, min, max)) { +bool Helpers::value2temperature(const char * value, int & value_i, const bool relative, const int min, const int max) { + if (value2number(value, value_i, min, max)) { if (EMSESP::system_.fahrenheit()) { - value = relative ? (value / 1.8) : (value - 32) / 1.8; + value_i = relative ? (value_i / 1.8) : (value_i - 32) / 1.8; } return true; } return false; } +// checks if we can convert a char string to a lowercase string +bool Helpers::value2string(const char * value, std::string & value_s) { + if ((value == nullptr) || (strlen(value) == 0)) { + value_s = std::string{}; + return false; + } + + value_s = toLower(value); + return true; +} + +// checks to see if a string (usually a command or payload cmd) looks like a boolean +// on, off, true, false, 1, 0 +bool Helpers::value2bool(const char * value, bool & value_b) { + if ((value == nullptr) || (strlen(value) == 0)) { + return false; + } + + std::string bool_str = toLower(value); // convert to lower case + + if ((bool_str == read_flash_string(F_(on))) || (bool_str == "1") || (bool_str == "true")) { + value_b = true; + return true; // is a bool + } + + if ((bool_str == read_flash_string(F_(off))) || (bool_str == "0") || (bool_str == "false")) { + value_b = false; + return true; // is a bool + } + + return false; // not a bool +} + +// checks to see if a string is member of a vector and return the index, also allow true/false for on/off +bool Helpers::value2enum(const char * value, uint8_t & value_ui, const __FlashStringHelper * const * strs) { + if ((value == nullptr) || (strlen(value) == 0)) { + return false; + } + std::string str = toLower(value); + + for (value_ui = 0; strs[value_ui]; value_ui++) { + std::string str1 = toLower(read_flash_string(strs[value_ui])); + if ((str1 != "") + && ((str1 == read_flash_string(F_(off)) && str == "false") || (str1 == read_flash_string(F_(on)) && str == "true") || (str == str1) + || (value[0] == ('0' + value_ui) && value[1] == '\0'))) { + return true; + } + } + return false; +} + // https://stackoverflow.com/questions/313970/how-to-convert-stdstring-to-lower-case std::string Helpers::toLower(std::string const & s) { std::string lc = s; @@ -562,55 +613,6 @@ std::string Helpers::toUpper(std::string const & s) { return lc; } -// checks if we can convert a char string to a lowercase string -bool Helpers::value2string(const char * v, std::string & value) { - if ((v == nullptr) || (strlen(v) == 0)) { - value = std::string{}; - return false; - } - value = toLower(v); - return true; -} - -// checks to see if a string (usually a command or payload cmd) looks like a boolean -// on, off, true, false, 1, 0 -bool Helpers::value2bool(const char * v, bool & value) { - if ((v == nullptr) || (strlen(v) == 0)) { - return false; - } - - std::string bool_str = toLower(v); // convert to lower case - - if ((bool_str == read_flash_string(F_(on))) || (bool_str == "1") || (bool_str == "true")) { - value = true; - return true; // is a bool - } - - if ((bool_str == read_flash_string(F_(off))) || (bool_str == "0") || (bool_str == "false")) { - value = false; - return true; // is a bool - } - - return false; // not a bool -} - -// checks to see if a string is member of a vector and return the index, also allow true/false for on/off -bool Helpers::value2enum(const char * v, uint8_t & value, const __FlashStringHelper * const * strs) { - if ((v == nullptr) || (strlen(v) == 0)) { - return false; - } - std::string str = toLower(v); - for (value = 0; strs[value]; value++) { - std::string str1 = toLower(read_flash_string(strs[value])); - if ((str1 != "") - && ((str1 == read_flash_string(F_(off)) && str == "false") || (str1 == read_flash_string(F_(on)) && str == "true") || (str == str1) - || (v[0] == ('0' + value) && v[1] == '\0'))) { - return true; - } - } - return false; -} - // replace char in char string void Helpers::replace_char(char * str, char find, char replace) { int i = 0; diff --git a/src/helpers.h b/src/helpers.h index 7068954fe..7ee8d9200 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -57,20 +57,20 @@ class Helpers { static std::string toUpper(std::string const & s); static void replace_char(char * str, char find, char replace); - static bool hasValue(const uint8_t & v, const uint8_t isBool = 0); - static bool hasValue(const int8_t & v); - static bool hasValue(const int16_t & v); - static bool hasValue(const uint16_t & v); - static bool hasValue(const uint32_t & v); - static bool hasValue(const char * v); + static bool hasValue(const uint8_t & value, const uint8_t isBool = 0); + static bool hasValue(const int8_t & value); + static bool hasValue(const int16_t & value); + static bool hasValue(const uint16_t & value); + static bool hasValue(const uint32_t & value); + static bool hasValue(const char * value); - static bool value2number(const char * v, int & value, const int min = -2147483648, const int max = 2147483647); - static bool value2float(const char * v, float & value); - static bool value2bool(const char * v, bool & value); - static bool value2string(const char * v, std::string & value); - static bool value2enum(const char * v, uint8_t & value, const __FlashStringHelper * const * strs); - static bool value2temperature(const char * v, float & value, bool relative = false); - static bool value2temperature(const char * v, int & value, const bool relative = false, const int min = -2147483648, const int max = 2147483647); + static bool value2number(const char * value, int & value_i, const int min = -2147483648, const int max = 2147483647); + static bool value2float(const char * value, float & value_f); + static bool value2bool(const char * value, bool & value_b); + static bool value2string(const char * value, std::string & value_s); + static bool value2enum(const char * value, uint8_t & value_ui, const __FlashStringHelper * const * strs); + static bool value2temperature(const char * value, float & value_f, bool relative = false); + static bool value2temperature(const char * value, int & value_i, const bool relative = false, const int min = -2147483648, const int max = 2147483647); #ifdef EMSESP_STANDALONE static char * ultostr(char * ptr, uint32_t value, const uint8_t base); From 270b81fafd964b87a4457c309b4f54f54af05fff Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 22:59:17 +0200 Subject: [PATCH 263/319] static code analysis warning fixes --- src/emsdevice.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index fe52772a7..3e9c728ab 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -25,7 +25,7 @@ namespace emsesp { // this includes commands since they can also be entities and visible in the web UI uint8_t EMSdevice::count_entities() { uint8_t count = 0; - for (auto & dv : devicevalues_) { + for (const auto & dv : devicevalues_) { if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.hasValue()) { count++; } @@ -338,15 +338,17 @@ char * EMSdevice::show_telegram_handlers(char * result, const size_t len, const strlcat(result, Helpers::hextoa(tf.telegram_type_id_, true).c_str(), len); } } + if (handlers == Handlers::ALL || handlers == Handlers::IGNORED) { i = 0; - for (auto handlers : handlers_ignored_) { + for (auto h : handlers_ignored_) { if (i++ > 0) { strlcat(result, " ", len); } - strlcat(result, Helpers::hextoa(handlers).c_str(), len); + strlcat(result, Helpers::hextoa(h).c_str(), len); } } + return result; } @@ -667,7 +669,7 @@ void EMSdevice::generate_values_web(JsonObject & output) { // handle Booleans (true, false), use strings, no native true/false) if (dv.type == DeviceValueType::BOOL) { - bool value_b = (bool)*(uint8_t *)(dv.value_p); + auto value_b = (bool)*(uint8_t *)(dv.value_p); if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { obj["v"] = value_b ? 1 : 0; } else { @@ -786,7 +788,7 @@ void EMSdevice::generate_values_web_all(JsonArray & output) { if (dv.hasValue()) { // handle Booleans (true, false), use strings, no native true/false) if (dv.type == DeviceValueType::BOOL) { - bool value_b = (bool)*(uint8_t *)(dv.value_p); + auto value_b = (bool)*(uint8_t *)(dv.value_p); if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { obj["v"] = value_b ? 1 : 0; } else { @@ -890,17 +892,17 @@ void EMSdevice::mask_entity(const std::string & entity_id) { // populate a string vector with entities that have masks set void EMSdevice::getMaskedEntities(std::vector & entity_ids) { - for (auto & dv : devicevalues_) { + for (const auto & dv : devicevalues_) { std::string entity_name = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); uint8_t mask = dv.state >> 4; + if (mask) { entity_ids.push_back(Helpers::hextoa(mask, false) + entity_name); } } } - // builds json for a specific device value / entity // cmd is the endpoint or name of the device entity // returns false if failed, otherwise true @@ -995,7 +997,7 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 case DeviceValueType::BOOL: if (Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { - bool value_b = (bool)*(uint8_t *)(dv.value_p); + auto value_b = (bool)*(uint8_t *)(dv.value_p); if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { json[value] = value_b; } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { @@ -1128,7 +1130,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // handle Booleans if (dv.type == DeviceValueType::BOOL && Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { // see how to render the value depending on the setting - bool value_b = (bool)*(uint8_t *)(dv.value_p); + auto value_b = (bool)*(uint8_t *)(dv.value_p); if (Mqtt::ha_enabled() && (output_target == OUTPUT_TARGET::MQTT)) { char s[7]; json[name] = Helpers::render_boolean(s, value_b); // for HA always render as string From 5e9e995e4bb41e7c833ab951e0704e53936e077e Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 1 May 2022 22:59:35 +0200 Subject: [PATCH 264/319] added shower trigger and coldshot times - #436 --- CHANGELOG_LATEST.md | 5 +- interface/src/project/SettingsApplication.tsx | 40 ++++++++-- interface/src/project/types.ts | 6 +- interface/src/project/validators.ts | 4 + lib_standalone/ESP8266React.h | 68 ++++++++-------- mock-api/server.js | 4 +- src/default_settings.h | 8 ++ src/shower.cpp | 10 ++- src/shower.h | 10 +-- src/system.cpp | 4 + src/version.h | 2 +- src/web/WebDataService.cpp | 3 +- src/web/WebSettingsService.cpp | 78 ++++++++++--------- src/web/WebSettingsService.h | 2 + 14 files changed, 155 insertions(+), 89 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index bd71d324d..2a610339d 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -35,6 +35,8 @@ - Read time from IVT-controller [#439](https://github.com/emsesp/EMS-ESP32/issues/439) - Hybrid Heatpump product-id 168 [#459](https://github.com/emsesp/EMS-ESP32/issues/459), thermostat settings - Junkers ISM2 and IPM in warm water mode [#437](https://github.com/emsesp/EMS-ESP32/issues/437) +- Added Shower Alert trigger time and cold shot time [#436](https://github.com/emsesp/EMS-ESP32/issues/436) +- Improved Table layout in Web UI (searching, filtering, sorting, exporting to CSV) ### Fixed @@ -53,6 +55,7 @@ - Burner selected max power can have a value higher than 100% [#314](https://github.com/emsesp/EMS-ESP32/issues/314) - some missing fahrenheit calculations - limited number of exclusions [#339](https://github.com/emsesp/EMS-ESP32/issues/339) +- MQTT sometimes would not reconnect after a WiFi outage ### Changed @@ -63,7 +66,7 @@ - Show Sensors quality in WebUI - Controller not shown in WebUI dashboard - renamed "Home Assistant Integration" to "MQTT Discovery" in MQTT Settings [#290](https://github.com/emsesp/EMS-ESP32/issues/290) -- Show ems tx reads and writes separatly +- Show ems tx reads and writes separately - Show ems device handlers separated for received, fetched and pending handlers. - Wired renamed to Ethernet - removed system/pin command, new commands in analogsensors diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx index 0ea86722b..353f1faf0 100644 --- a/interface/src/project/SettingsApplication.tsx +++ b/interface/src/project/SettingsApplication.tsx @@ -343,11 +343,6 @@ const SettingsApplication: FC = () => { label="Convert temperature values to Fahrenheit" disabled={saving} /> - } - label="Underclock CPU speed" - disabled={saving} - /> } label="Bypass Access Token authorization on API calls" @@ -358,6 +353,11 @@ const SettingsApplication: FC = () => { label="Enable Read only mode (blocks all outgoing EMS Tx write commands)" disabled={saving} /> + } + label="Underclock CPU speed" + disabled={saving} + /> } @@ -367,8 +367,36 @@ const SettingsApplication: FC = () => { } label="Enable Shower Alert" - disabled={saving} + disabled={!data.shower_timer} /> + {data.shower_alert && ( + <> + + + + + + + + )} Formatting Options diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index c78745e55..0d4d048b6 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -9,6 +9,8 @@ export interface Settings { master_thermostat: number; shower_timer: boolean; shower_alert: boolean; + shower_alert_coldshot: number; + shower_alert_trigger: number; rx_gpio: number; tx_gpio: number; telnet_enabled: boolean; @@ -41,8 +43,8 @@ export enum busConnectionStatus { export interface Stat { id: string; // name s: number; // success - f: number; // fail - q: number; // quality + f: number; // fail + q: number; // quality } export interface Status { status: busConnectionStatus; diff --git a/interface/src/project/validators.ts b/interface/src/project/validators.ts index 88742d3e4..a626489d2 100644 --- a/interface/src/project/validators.ts +++ b/interface/src/project/validators.ts @@ -40,5 +40,9 @@ export const createSettingsValidator = (settings: Settings) => { required: true, message: 'Mark interval is required' }, { type: 'number', min: 0, max: 10, message: 'Port must be between 0 and 10' } ] + }), + ...(settings.shower_alert && { + shower_alert_trigger: [{ type: 'number', min: 1, max: 20, message: 'Time must be between 1 and 20 minutes' }], + shower_alert_coldshot: [{ type: 'number', min: 1, max: 10, message: 'Time must be between 1 and 10 seconds' }] }) }); diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index 600a1c74a..4b31d671c 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -19,39 +19,41 @@ class DummySettings { public: - uint8_t tx_mode = 1; - uint8_t ems_bus_id = 0x0B; - bool syslog_enabled = false; - int8_t syslog_level = 3; // uuid::log::Level - uint32_t syslog_mark_interval = 0; - String syslog_host = "192.168.1.4"; - uint16_t syslog_port = 514; - uint8_t master_thermostat = 0; - bool shower_timer = true; - bool shower_alert = false; - bool hide_led = false; - bool notoken_api = false; - bool readonly_mode = false; - uint8_t bool_format = 1; // using "on" and "off" - uint8_t enum_format = 1; - bool nosleep = false; - bool fahrenheit = false; - bool bandwidth20 = false; - bool telnet_enabled = false; - String board_profile = "CUSTOM"; - bool trace_raw = false; - bool analog_enabled = true; // analog is enabled - int8_t weblog_level = 1; - uint8_t weblog_buffer = 50; - bool weblog_compact = true; - uint8_t rx_gpio = 0; - uint8_t tx_gpio = 0; - uint8_t dallas_gpio = 16; // to ensure its enabled - bool dallas_parasite = false; - uint8_t led_gpio = 0; - bool low_clock = false; - uint8_t pbutton_gpio = false; - uint8_t solar_maxflow = 30; + uint8_t tx_mode = 1; + uint8_t ems_bus_id = 0x0B; + bool syslog_enabled = false; + int8_t syslog_level = 3; // uuid::log::Level + uint32_t syslog_mark_interval = 0; + String syslog_host = "192.168.1.4"; + uint16_t syslog_port = 514; + uint8_t master_thermostat = 0; + bool shower_timer = true; + bool shower_alert = false; + uint8_t shower_alert_coldshot = 10; + uint8_t shower_alert_trigger = 7; + bool hide_led = false; + bool notoken_api = false; + bool readonly_mode = false; + uint8_t bool_format = 1; // using "on" and "off" + uint8_t enum_format = 1; + bool nosleep = false; + bool fahrenheit = false; + bool bandwidth20 = false; + bool telnet_enabled = false; + String board_profile = "CUSTOM"; + bool trace_raw = false; + bool analog_enabled = true; // analog is enabled + int8_t weblog_level = 1; + uint8_t weblog_buffer = 50; + bool weblog_compact = true; + uint8_t rx_gpio = 0; + uint8_t tx_gpio = 0; + uint8_t dallas_gpio = 16; // to ensure its enabled + bool dallas_parasite = false; + uint8_t led_gpio = 0; + bool low_clock = false; + uint8_t pbutton_gpio = false; + uint8_t solar_maxflow = 30; // MQTT uint16_t publish_time = 10; diff --git a/mock-api/server.js b/mock-api/server.js index 898d644e0..9f3666962 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -316,7 +316,9 @@ settings = { syslog_port: 514, master_thermostat: 0, shower_timer: true, - shower_alert: false, + shower_alert: true, + shower_alert_trigger: 7, + shower_alert_coldshot: 10, rx_gpio: 23, tx_gpio: 5, phy_type: 0, diff --git a/src/default_settings.h b/src/default_settings.h index b70fef920..134ff4dc8 100644 --- a/src/default_settings.h +++ b/src/default_settings.h @@ -64,6 +64,14 @@ #define EMSESP_DEFAULT_SHOWER_ALERT false #endif +#ifndef EMSESP_DEFAULT_SHOWER_ALERT_TRIGGER +#define EMSESP_DEFAULT_SHOWER_ALERT_TRIGGER 7 +#endif + +#ifndef EMSESP_DEFAULT_SHOWER_ALERT_COLDSHOT +#define EMSESP_DEFAULT_SHOWER_ALERT_COLDSHOT 10 +#endif + #ifndef EMSESP_DEFAULT_HIDE_LED #define EMSESP_DEFAULT_HIDE_LED false #endif diff --git a/src/shower.cpp b/src/shower.cpp index f9c8a2e8e..8f024dfa4 100644 --- a/src/shower.cpp +++ b/src/shower.cpp @@ -24,8 +24,10 @@ uuid::log::Logger Shower::logger_{F_(shower), uuid::log::Facility::CONSOLE}; void Shower::start() { EMSESP::webSettingsService.read([&](WebSettings & settings) { - shower_timer_ = settings.shower_timer; - shower_alert_ = settings.shower_alert; + shower_timer_ = settings.shower_timer; + shower_alert_ = settings.shower_alert; + shower_alert_trigger_ = settings.shower_alert_trigger * 60000; // convert from minutes + shower_alert_coldshot_ = settings.shower_alert_coldshot * 1000; // convert from seconds }); set_shower_state(false, true); // turns shower to off and creates HA topic if not already done @@ -59,7 +61,7 @@ void Shower::loop() { LOG_DEBUG(F("[Shower] hot water still running, starting shower timer")); } // check if the shower has been on too long - else if ((time_now - timer_start_) > SHOWER_MAX_DURATION) { + else if ((time_now - timer_start_) > shower_alert_trigger_) { shower_alert_start(); } } @@ -95,7 +97,7 @@ void Shower::loop() { // at this point we're in the shower cold shot (doing_cold_shot_ == true) // keep repeating until the time is up - if ((time_now - alert_timer_start_) > SHOWER_COLDSHOT_DURATION) { + if ((time_now - alert_timer_start_) > shower_alert_coldshot_) { shower_alert_stop(); } } diff --git a/src/shower.h b/src/shower.h index dc9dafda4..809a18031 100644 --- a/src/shower.h +++ b/src/shower.h @@ -49,11 +49,9 @@ class Shower { private: static uuid::log::Logger logger_; - static constexpr uint32_t SHOWER_PAUSE_TIME = 15000; // in ms. 15 seconds, max time if water is switched off & on during a shower - static constexpr uint32_t SHOWER_MIN_DURATION = 120000; // in ms. 2 minutes, before recognizing its a shower - static constexpr uint32_t SHOWER_OFFSET_TIME = 5000; // in ms. 5 seconds grace time, to calibrate actual time under the shower - static constexpr uint32_t SHOWER_COLDSHOT_DURATION = 10000; // 10 seconds for cold water before turning back hot water - static constexpr uint32_t SHOWER_MAX_DURATION = 420000; // in ms. 7 minutes, before trigger a shot of cold water + static constexpr uint32_t SHOWER_PAUSE_TIME = 15000; // in ms. 15 seconds, max time if water is switched off & on during a shower + static constexpr uint32_t SHOWER_MIN_DURATION = 120000; // in ms. 2 minutes, before recognizing its a shower + static constexpr uint32_t SHOWER_OFFSET_TIME = 5000; // in ms. 5 seconds grace time, to calibrate actual time under the shower void publish_shower_data() const; void shower_alert_start(); @@ -61,6 +59,8 @@ class Shower { bool shower_timer_; // true if we want to report back on shower times bool shower_alert_; // true if we want the alert of cold water + uint32_t shower_alert_trigger_; // default 7 minutes, before trigger a shot of cold water + uint32_t shower_alert_coldshot_; // default 10 seconds for cold water before turning back hot water bool ha_configdone_ = false; // for HA MQTT Discovery bool shower_state_; uint32_t timer_start_; // ms diff --git a/src/system.cpp b/src/system.cpp index 4eaa88ec0..8c3620941 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -998,6 +998,10 @@ bool System::command_settings(const char * value, const int8_t id, JsonObject & node["shower_timer"] = settings.shower_timer; node["shower_alert"] = settings.shower_alert; + if (settings.shower_alert) { + node["shower_alert_coldshot"] = settings.shower_alert_coldshot / 1000; // seconds + node["shower_alert_trigger"] = settings.shower_alert_trigger / 60000; // minutes + } node["rx_gpio"] = settings.rx_gpio; node["tx_gpio"] = settings.tx_gpio; diff --git a/src/version.h b/src/version.h index 4b88090e3..60abd800d 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b14" +#define EMSESP_APP_VERSION "3.4.0b15" diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 0d9347ce5..c32bed325 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -137,8 +137,9 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) { for (const auto & sensor : EMSESP::analogsensor_.sensors()) { // don't send if it's marked for removal if (sensor.type() != AnalogSensor::AnalogType::MARK_DELETED) { + count++; JsonObject obj = analogs.createNestedObject(); - obj["id"] = Helpers::smallitoa(buffer, ++count); // needed for sorting table + obj["id"] = Helpers::smallitoa(buffer, count); // needed for sorting table obj["g"] = sensor.gpio(); obj["n"] = sensor.name(); obj["u"] = sensor.uom(); diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index a5d9ef98d..dca3ab72f 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -37,41 +37,43 @@ WebSettingsService::WebSettingsService(AsyncWebServer * server, FS * fs, Securit } void WebSettings::read(WebSettings & settings, JsonObject & root) { - root["tx_mode"] = settings.tx_mode; - root["ems_bus_id"] = settings.ems_bus_id; - root["syslog_enabled"] = settings.syslog_enabled; - root["syslog_level"] = settings.syslog_level; - root["trace_raw"] = settings.trace_raw; - root["syslog_mark_interval"] = settings.syslog_mark_interval; - root["syslog_host"] = settings.syslog_host; - root["syslog_port"] = settings.syslog_port; - root["master_thermostat"] = settings.master_thermostat; - root["shower_timer"] = settings.shower_timer; - root["shower_alert"] = settings.shower_alert; - root["rx_gpio"] = settings.rx_gpio; - root["tx_gpio"] = settings.tx_gpio; - root["dallas_gpio"] = settings.dallas_gpio; - root["dallas_parasite"] = settings.dallas_parasite; - root["led_gpio"] = settings.led_gpio; - root["hide_led"] = settings.hide_led; - root["low_clock"] = settings.low_clock; - root["telnet_enabled"] = settings.telnet_enabled; - root["notoken_api"] = settings.notoken_api; - root["readonly_mode"] = settings.readonly_mode; - root["analog_enabled"] = settings.analog_enabled; - root["pbutton_gpio"] = settings.pbutton_gpio; - root["solar_maxflow"] = settings.solar_maxflow; - root["board_profile"] = settings.board_profile; - root["fahrenheit"] = settings.fahrenheit; - root["bool_format"] = settings.bool_format; - root["enum_format"] = settings.enum_format; - root["weblog_level"] = settings.weblog_level; - root["weblog_buffer"] = settings.weblog_buffer; - root["weblog_compact"] = settings.weblog_compact; - root["phy_type"] = settings.phy_type; - root["eth_power"] = settings.eth_power; - root["eth_phy_addr"] = settings.eth_phy_addr; - root["eth_clock_mode"] = settings.eth_clock_mode; + root["tx_mode"] = settings.tx_mode; + root["ems_bus_id"] = settings.ems_bus_id; + root["syslog_enabled"] = settings.syslog_enabled; + root["syslog_level"] = settings.syslog_level; + root["trace_raw"] = settings.trace_raw; + root["syslog_mark_interval"] = settings.syslog_mark_interval; + root["syslog_host"] = settings.syslog_host; + root["syslog_port"] = settings.syslog_port; + root["master_thermostat"] = settings.master_thermostat; + root["shower_timer"] = settings.shower_timer; + root["shower_alert"] = settings.shower_alert; + root["shower_alert_coldshot"] = settings.shower_alert_coldshot; + root["shower_alert_trigger"] = settings.shower_alert_trigger; + root["rx_gpio"] = settings.rx_gpio; + root["tx_gpio"] = settings.tx_gpio; + root["dallas_gpio"] = settings.dallas_gpio; + root["dallas_parasite"] = settings.dallas_parasite; + root["led_gpio"] = settings.led_gpio; + root["hide_led"] = settings.hide_led; + root["low_clock"] = settings.low_clock; + root["telnet_enabled"] = settings.telnet_enabled; + root["notoken_api"] = settings.notoken_api; + root["readonly_mode"] = settings.readonly_mode; + root["analog_enabled"] = settings.analog_enabled; + root["pbutton_gpio"] = settings.pbutton_gpio; + root["solar_maxflow"] = settings.solar_maxflow; + root["board_profile"] = settings.board_profile; + root["fahrenheit"] = settings.fahrenheit; + root["bool_format"] = settings.bool_format; + root["enum_format"] = settings.enum_format; + root["weblog_level"] = settings.weblog_level; + root["weblog_buffer"] = settings.weblog_buffer; + root["weblog_compact"] = settings.weblog_compact; + root["phy_type"] = settings.phy_type; + root["eth_power"] = settings.eth_power; + root["eth_phy_addr"] = settings.eth_phy_addr; + root["eth_clock_mode"] = settings.eth_clock_mode; } // call on initialization and also when settings are updated via web or console @@ -152,6 +154,12 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) prev = settings.shower_alert; settings.shower_alert = root["shower_alert"] | EMSESP_DEFAULT_SHOWER_ALERT; check_flag(prev, settings.shower_alert, ChangeFlags::SHOWER); + prev = settings.shower_alert_trigger; + settings.shower_alert_trigger = root["shower_alert_trigger"] | EMSESP_DEFAULT_SHOWER_ALERT_TRIGGER; + check_flag(prev, settings.shower_alert_trigger, ChangeFlags::SHOWER); + prev = settings.shower_alert_coldshot; + settings.shower_alert_coldshot = root["shower_alert_coldshot"] | EMSESP_DEFAULT_SHOWER_ALERT_COLDSHOT; + check_flag(prev, settings.shower_alert_coldshot, ChangeFlags::SHOWER); // led prev = settings.led_gpio; diff --git a/src/web/WebSettingsService.h b/src/web/WebSettingsService.h index 5ff6ef1c9..16bf3aa60 100644 --- a/src/web/WebSettingsService.h +++ b/src/web/WebSettingsService.h @@ -34,6 +34,8 @@ class WebSettings { uint8_t master_thermostat; bool shower_timer; bool shower_alert; + uint8_t shower_alert_trigger; + uint8_t shower_alert_coldshot; bool syslog_enabled; int8_t syslog_level; // uuid::log::Level uint32_t syslog_mark_interval; From 5438d7bbd931abdbc36ab506700e374f20e54b5c Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 2 May 2022 13:08:31 +0200 Subject: [PATCH 265/319] API extract individual attributes - #462 --- CHANGELOG_LATEST.md | 1 + src/command.cpp | 19 ++++++++----------- src/emsdevice.cpp | 38 +++++++++++++++++++++++++++++++++++--- src/test/test.cpp | 13 ++++++++++++- src/test/test.h | 4 ++-- src/version.h | 2 +- src/web/WebAPIService.cpp | 9 +++++++++ 7 files changed, 68 insertions(+), 18 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 2a610339d..b665af1e2 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -37,6 +37,7 @@ - Junkers ISM2 and IPM in warm water mode [#437](https://github.com/emsesp/EMS-ESP32/issues/437) - Added Shower Alert trigger time and cold shot time [#436](https://github.com/emsesp/EMS-ESP32/issues/436) - Improved Table layout in Web UI (searching, filtering, sorting, exporting to CSV) +- API fetch individual attributes from an entity [#462](https://github.com/emsesp/EMS-ESP32/issues/462) ### Fixed diff --git a/src/command.cpp b/src/command.cpp index 98d5b63b2..d8c7b8406 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -86,7 +86,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec return message(CommandRet::ERROR, "unknown device", output); } - // the next value on the path should be the command + // the next value on the path should be the command or entity name const char * command_p = nullptr; if (num_paths == 2) { command_p = p.paths()[1].c_str(); @@ -104,7 +104,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec } } - // some commands may be prefixed with hc. or wwc. so extract these if they exist + // some commands may be prefixed with hc. wwc. or hc/ or wwc/ so extract these if they exist // parse_command_string returns the extracted command command_p = parse_command_string(command_p, id_n); if (command_p == nullptr) { @@ -189,7 +189,7 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { } // make a copy of the string command for parsing - char command_s[100]; + char command_s[30]; strlcpy(command_s, command, sizeof(command_s)); // look for a delimeter and split the string @@ -202,7 +202,7 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { p = command_s; // reset and look for _ breakp = strchr(p, '_'); if (!breakp) { - return command; + return command; // no delimeter found, return the whole string } } } @@ -214,10 +214,8 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { } else if (!strncmp(command, "wwc", 3) && start_pos == 5) { id = command[start_pos - 2] - '0' + 8; // wwc1 has id 9 } else { -#if defined(EMSESP_DEBUG) - LOG_DEBUG(F("[DEBUG] Command parse error, unknown hc/wwc in %s"), command_s); -#endif - return nullptr; + id = 0; // special case for extracting the attributes + return command; } return (command + start_pos); @@ -244,13 +242,12 @@ uint8_t Command::call(const uint8_t device_type, const char * cmd, const char * // see if there is a command registered auto cf = find_command(device_type, cmd); - // check if its a call to and end-point to a device, i.e. has no value + // check if its a call to and end-point to a device // except for system commands as this is a special device without any queryable entities (device values) - // exclude SYSTEM if ((device_type > EMSdevice::DeviceType::SYSTEM) && (!value || !strlen(value))) { if (!cf || !cf->cmdfunction_json_) { #if defined(EMSESP_DEBUG) - LOG_DEBUG(F("[DEBUG] Calling %s command '%s' to retrieve values"), dname.c_str(), cmd); + LOG_DEBUG(F("[DEBUG] Calling %s command '%s' to retrieve attributes"), dname.c_str(), cmd); #endif return EMSESP::get_device_value_info(output, cmd, id, device_type) ? CommandRet::OK : CommandRet::ERROR; // entity = cmd } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 3e9c728ab..b3e5897f6 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -915,13 +915,26 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 tag = DeviceValueTAG::TAG_HC1 + id - 1; } else if (id >= 9 && id <= 19) { tag = DeviceValueTAG::TAG_WWC1 + id - 9; - } else if (id != -1) { - return false; // error + } + + // make a copy of the string command for parsing + char command_s[30]; + strlcpy(command_s, cmd, sizeof(command_s)); + char * attribute_s = command_s; + + // if id=0 then we have a specific attribute to fetch instead of the complete record + if (id == 0) { + char * p = command_s; + char * breakp = strchr(p, '/'); + if (breakp) { + *breakp = '\0'; + attribute_s = breakp + 1; + } } // search device value with this tag for (auto & dv : devicevalues_) { - if (strcmp(cmd, Helpers::toLower(read_flash_string(dv.short_name)).c_str()) == 0 && (tag <= 0 || tag == dv.tag)) { + if (strcmp(command_s, Helpers::toLower(read_flash_string(dv.short_name)).c_str()) == 0 && (tag <= 0 || tag == dv.tag)) { int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; @@ -1060,6 +1073,25 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 json[value] = "not set"; } + // if id is 0 then we're filtering on an attribute, go find it + if (id == 0) { +#if defined(EMSESP_DEBUG) + EMSESP::logger().debug(F("[DEBUG] Attribute '%s'"), attribute_s); +#endif + if (json.containsKey(attribute_s)) { + JsonVariant data = json[attribute_s]; + output.clear(); + output["api_data"] = data; + return true; + } else { + char error[100]; + snprintf(error, sizeof(error), "cannot find attribute %s in entity %s", attribute_s, command_s); + output.clear(); + output["message"] = error; + return false; + } + } + return true; } } diff --git a/src/test/test.cpp b/src/test/test.cpp index 029636c9f..66f70989f 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -660,9 +660,20 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const DynamicJsonDocument doc(2000); JsonVariant json; request.method(HTTP_GET); + + request.url("/api/boiler/values"); + EMSESP::webAPIService.webAPIService_get(&request); request.url("/api/boiler/wwcirc"); EMSESP::webAPIService.webAPIService_get(&request); - request.url("/api/boiler/values"); + request.url("/api/boiler/wwcirc/fullname"); + EMSESP::webAPIService.webAPIService_get(&request); + request.url("/api/boiler/selburnpow/value"); + EMSESP::webAPIService.webAPIService_get(&request); + request.url("/api/boiler/wwchargetype/writeable"); + EMSESP::webAPIService.webAPIService_get(&request); + request.url("/api/boiler/flamecurr/value"); + EMSESP::webAPIService.webAPIService_get(&request); + request.url("/api/boiler/flamecurr/bad"); EMSESP::webAPIService.webAPIService_get(&request); #endif } diff --git a/src/test/test.h b/src/test/test.h index 65021652e..be3bf9cb1 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -31,7 +31,7 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "mixer" // #define EMSESP_DEBUG_DEFAULT "web" // #define EMSESP_DEBUG_DEFAULT "mqtt" -#define EMSESP_DEBUG_DEFAULT "general" +// #define EMSESP_DEBUG_DEFAULT "general" // #define EMSESP_DEBUG_DEFAULT "boiler" // #define EMSESP_DEBUG_DEFAULT "mqtt2" // #define EMSESP_DEBUG_DEFAULT "mqtt_nested" @@ -48,7 +48,7 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "2thermostats" // #define EMSESP_DEBUG_DEFAULT "dallas" // #define EMSESP_DEBUG_DEFAULT "analog" -// #define EMSESP_DEBUG_DEFAULT "api_values" +#define EMSESP_DEBUG_DEFAULT "api_values" // #define EMSESP_DEBUG_DEFAULT "mqtt_post" class Test { diff --git a/src/version.h b/src/version.h index 60abd800d..b411d73c8 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b15" +#define EMSESP_APP_VERSION "3.4.0b16" diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index 3ade88792..be8966a1e 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -120,6 +120,15 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) { } } + // if we're returning single values, just sent as plain text + // https://github.com/emsesp/EMS-ESP32/issues/462#issuecomment-1093877210 + if (output.containsKey("api_data")) { + JsonVariant data = output["api_data"]; + request->send(200, "text/plain", data.as()); + api_count_++; + return; + } + // send the json that came back from the command call // FAIL, OK, NOT_FOUND, ERROR, NOT_ALLOWED = 400 (bad request), 200 (OK), 400 (not found), 400 (bad request), 401 (unauthorized) int ret_codes[5] = {400, 200, 400, 400, 401}; From 883c81320b4442c35a989615af074a3dc2a057f8 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 2 May 2022 15:11:42 +0200 Subject: [PATCH 266/319] package updates --- interface/package-lock.json | 74 ++++++++++++++++++------------------- interface/package.json | 6 +-- mock-api/package-lock.json | 14 +++---- mock-api/package.json | 2 +- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 6b6cb4442..080159463 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -12,10 +12,10 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.3", + "@mui/material": "^5.6.4", "@table-library/react-table-library": "^3.1.0", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.30", + "@types/node": "^17.0.31", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -29,7 +29,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^14.0.1", + "react-dropzone": "^14.1.1", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", @@ -2856,9 +2856,9 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.78", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.78.tgz", - "integrity": "sha512-5L+GNe2M9/tFjQpjK2r837+kzRg/l6D5R9SQbG1wmSWejw5Ei8P+KXIgS/NLNi9g7dUT8bnCyzz9AZKQX1Jsfg==", + "version": "5.0.0-alpha.79", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.79.tgz", + "integrity": "sha512-/lZLF027BkiEjM8MIYoeS/FEhTKf+41ePU9SOijMGrCin1Y0Igucw+IHa1fF8HXD7wDbFKqHuso3J1jMG8wyNw==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", @@ -2913,13 +2913,13 @@ } }, "node_modules/@mui/material": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.3.tgz", - "integrity": "sha512-2VovFsbCEhic29NYoBF7zFrpH2sEOlKXXDhGjzxmWiI9OnC3SX63hapWunjaVsiRINVnjuMHuW1MOs4UtV8Gfg==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.4.tgz", + "integrity": "sha512-7TD+u/SExZK2a55w6reX56oPk37gKr/M/XGt156X+m0d9LhzOsW864nkErIX/H8oSkX/6kCimxu1FDsO+gjiVw==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.78", - "@mui/system": "^5.6.3", + "@mui/base": "5.0.0-alpha.79", + "@mui/system": "^5.6.4", "@mui/types": "^7.1.3", "@mui/utils": "^5.6.1", "@types/react-transition-group": "^4.4.4", @@ -3013,9 +3013,9 @@ } }, "node_modules/@mui/system": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.3.tgz", - "integrity": "sha512-4SRi52a4ttZ2S4EHEDE8arVNuKqyQLTYUTF80WAZ0tQwnG20qwlBtzcrywCGItmVAMl7RUaYopyWOx3yVPvrmQ==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.4.tgz", + "integrity": "sha512-7rsWED1wMFMePySJobsBerFZNu7ga580QSi3Zd6sJR8nVj12qD3yIdfvxA70/PxJ/805KbIT0GX7edKI+hpyhA==", "dependencies": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.6.2", @@ -3763,9 +3763,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.30.tgz", - "integrity": "sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw==" + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz", + "integrity": "sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -14437,9 +14437,9 @@ } }, "node_modules/react-dropzone": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.0.1.tgz", - "integrity": "sha512-FyRWrlMmM2+8TkM0aPdRwdZJ5HX3+4O1vWtHecJMFB36N89Bub1sIrk8HyOrjb9hwm1HXGRZ4Q+PW4G/MDFg1Q==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.1.1.tgz", + "integrity": "sha512-JYavQrxU66hBHwDAXCMoHNvhMonKDA0VQ8ouJi8Ouxgz9lmtA4OGVBXgOTCq4vCbwTTDT9synvNUCIpT6zWWow==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.5.0", @@ -19569,9 +19569,9 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.78", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.78.tgz", - "integrity": "sha512-5L+GNe2M9/tFjQpjK2r837+kzRg/l6D5R9SQbG1wmSWejw5Ei8P+KXIgS/NLNi9g7dUT8bnCyzz9AZKQX1Jsfg==", + "version": "5.0.0-alpha.79", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.79.tgz", + "integrity": "sha512-/lZLF027BkiEjM8MIYoeS/FEhTKf+41ePU9SOijMGrCin1Y0Igucw+IHa1fF8HXD7wDbFKqHuso3J1jMG8wyNw==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", @@ -19592,13 +19592,13 @@ } }, "@mui/material": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.3.tgz", - "integrity": "sha512-2VovFsbCEhic29NYoBF7zFrpH2sEOlKXXDhGjzxmWiI9OnC3SX63hapWunjaVsiRINVnjuMHuW1MOs4UtV8Gfg==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.4.tgz", + "integrity": "sha512-7TD+u/SExZK2a55w6reX56oPk37gKr/M/XGt156X+m0d9LhzOsW864nkErIX/H8oSkX/6kCimxu1FDsO+gjiVw==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.78", - "@mui/system": "^5.6.3", + "@mui/base": "5.0.0-alpha.79", + "@mui/system": "^5.6.4", "@mui/types": "^7.1.3", "@mui/utils": "^5.6.1", "@types/react-transition-group": "^4.4.4", @@ -19631,9 +19631,9 @@ } }, "@mui/system": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.3.tgz", - "integrity": "sha512-4SRi52a4ttZ2S4EHEDE8arVNuKqyQLTYUTF80WAZ0tQwnG20qwlBtzcrywCGItmVAMl7RUaYopyWOx3yVPvrmQ==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.4.tgz", + "integrity": "sha512-7rsWED1wMFMePySJobsBerFZNu7ga580QSi3Zd6sJR8nVj12qD3yIdfvxA70/PxJ/805KbIT0GX7edKI+hpyhA==", "requires": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.6.2", @@ -20150,9 +20150,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.30.tgz", - "integrity": "sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw==" + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz", + "integrity": "sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q==" }, "@types/parse-json": { "version": "4.0.0", @@ -27793,9 +27793,9 @@ } }, "react-dropzone": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.0.1.tgz", - "integrity": "sha512-FyRWrlMmM2+8TkM0aPdRwdZJ5HX3+4O1vWtHecJMFB36N89Bub1sIrk8HyOrjb9hwm1HXGRZ4Q+PW4G/MDFg1Q==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.1.1.tgz", + "integrity": "sha512-JYavQrxU66hBHwDAXCMoHNvhMonKDA0VQ8ouJi8Ouxgz9lmtA4OGVBXgOTCq4vCbwTTDT9synvNUCIpT6zWWow==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.5.0", diff --git a/interface/package.json b/interface/package.json index 775829526..bc5abb306 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,10 +8,10 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.3", + "@mui/material": "^5.6.4", "@table-library/react-table-library": "^3.1.0", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.30", + "@types/node": "^17.0.31", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -25,7 +25,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^14.0.1", + "react-dropzone": "^14.1.1", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", diff --git a/mock-api/package-lock.json b/mock-api/package-lock.json index b0a9c3d66..e7dd05f0a 100644 --- a/mock-api/package-lock.json +++ b/mock-api/package-lock.json @@ -14,7 +14,7 @@ "express": "^4.18.1", "express-sse": "^0.5.3", "nodemon": "^2.0.16", - "ws": "^8.5.0" + "ws": "^8.6.0" } }, "node_modules/@msgpack/msgpack": { @@ -1811,9 +1811,9 @@ } }, "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", + "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", "engines": { "node": ">=10.0.0" }, @@ -3169,9 +3169,9 @@ } }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", + "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", "requires": {} }, "xdg-basedir": { diff --git a/mock-api/package.json b/mock-api/package.json index b963eb4a8..bdc44b1c3 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -16,6 +16,6 @@ "express": "^4.18.1", "express-sse": "^0.5.3", "nodemon": "^2.0.16", - "ws": "^8.5.0" + "ws": "^8.6.0" } } From 7172ed303e4aa99435092bfa1722a540e6477293 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 2 May 2022 15:11:57 +0200 Subject: [PATCH 267/319] make table headers consistent --- interface/src/framework/security/ManageUsersForm.tsx | 2 ++ interface/src/project/DashboardStatus.tsx | 1 + 2 files changed, 3 insertions(+) diff --git a/interface/src/framework/security/ManageUsersForm.tsx b/interface/src/framework/security/ManageUsersForm.tsx index 0dd1868d2..de533423f 100644 --- a/interface/src/framework/security/ManageUsersForm.tsx +++ b/interface/src/framework/security/ManageUsersForm.tsx @@ -38,11 +38,13 @@ const ManageUsersForm: FC = () => { BaseRow: ` font-size: 14px; color: white; + padding-left: 8px; `, HeaderRow: ` text-transform: uppercase; background-color: black; color: #90CAF9; + font-weight: 500; border-bottom: 1px solid #e0e0e0; `, Row: ` diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx index 347e89163..d97f9e0e8 100644 --- a/interface/src/project/DashboardStatus.tsx +++ b/interface/src/project/DashboardStatus.tsx @@ -97,6 +97,7 @@ const DashboardStatus: FC = () => { text-transform: uppercase; background-color: black; color: #90CAF9; + font-weight: 500; border-bottom: 1px solid #e0e0e0; `, Row: ` From 8e65e31ed6d5f7111e0be2bb2f148a5281118b69 Mon Sep 17 00:00:00 2001 From: Proddy Date: Tue, 3 May 2022 19:50:07 +0200 Subject: [PATCH 268/319] table formatting --- interface/package-lock.json | 48 +++++----- interface/package.json | 2 +- interface/src/project/DashboardData.tsx | 94 +++++++++++++------ .../src/project/SettingsCustomization.tsx | 28 +++--- 4 files changed, 107 insertions(+), 65 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 080159463..d40e263ce 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -29,7 +29,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^14.1.1", + "react-dropzone": "^14.2.0", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", @@ -7976,14 +7976,14 @@ } }, "node_modules/file-selector": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.5.0.tgz", - "integrity": "sha512-s8KNnmIDTBoD0p9uJ9uD0XY38SCeBOtj0UMXyQSLg1Ypfrfj8+dAvwsLjYQkQ2GjhVtp2HrnF5cJzMhBjfD8HA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", "dependencies": { - "tslib": "^2.0.3" + "tslib": "^2.4.0" }, "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/filelist": { @@ -14437,12 +14437,12 @@ } }, "node_modules/react-dropzone": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.1.1.tgz", - "integrity": "sha512-JYavQrxU66hBHwDAXCMoHNvhMonKDA0VQ8ouJi8Ouxgz9lmtA4OGVBXgOTCq4vCbwTTDT9synvNUCIpT6zWWow==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.0.tgz", + "integrity": "sha512-D7AXPtRba8rd7DBOejh3W2v1Uax6i7XKPYPuMr13XFPfnDcPHHvlEfp3raVpdj3XMHlRfYuf2H5+m8p7mlgKdQ==", "dependencies": { "attr-accept": "^2.2.2", - "file-selector": "^0.5.0", + "file-selector": "^0.6.0", "prop-types": "^15.8.1" }, "engines": { @@ -16294,9 +16294,9 @@ } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -23280,11 +23280,11 @@ } }, "file-selector": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.5.0.tgz", - "integrity": "sha512-s8KNnmIDTBoD0p9uJ9uD0XY38SCeBOtj0UMXyQSLg1Ypfrfj8+dAvwsLjYQkQ2GjhVtp2HrnF5cJzMhBjfD8HA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", "requires": { - "tslib": "^2.0.3" + "tslib": "^2.4.0" } }, "filelist": { @@ -27793,12 +27793,12 @@ } }, "react-dropzone": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.1.1.tgz", - "integrity": "sha512-JYavQrxU66hBHwDAXCMoHNvhMonKDA0VQ8ouJi8Ouxgz9lmtA4OGVBXgOTCq4vCbwTTDT9synvNUCIpT6zWWow==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.0.tgz", + "integrity": "sha512-D7AXPtRba8rd7DBOejh3W2v1Uax6i7XKPYPuMr13XFPfnDcPHHvlEfp3raVpdj3XMHlRfYuf2H5+m8p7mlgKdQ==", "requires": { "attr-accept": "^2.2.2", - "file-selector": "^0.5.0", + "file-selector": "^0.6.0", "prop-types": "^15.8.1" } }, @@ -29185,9 +29185,9 @@ } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "tsutils": { "version": "3.21.0", diff --git a/interface/package.json b/interface/package.json index bc5abb306..837318bef 100644 --- a/interface/package.json +++ b/interface/package.json @@ -25,7 +25,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^14.1.1", + "react-dropzone": "^14.2.0", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index e657af94b..f768c924c 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -206,34 +206,63 @@ const DashboardData: FC = () => { border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; + &:not(.stiff) > div { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } &:nth-of-type(1) { - padding-left: 16px; + width: 260px; + min-width: 260px; } - &:nth-of-type(4) { - padding-left: 16px; - } - width: 124px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - &:last-of-type { + &:nth-of-type(2) { + flex: 1; text-align: right; } + &:last-of-type { + padding-left: 0px; + text-align: center; + width: 32px; + min-width: 32px; + max-width: 32px; + } `, HeaderCell: ` - padding-left: 8px; - &:nth-of-type(1) { - padding-left: 8px; - } - &:nth-of-type(4) { - padding-left: 16px; - } &:not(:last-of-type) { - border-right: 1px solid #565656; + padding-left: 8px; + border-left: 1px solid #565656; + } + &:first-of-type { + border-left: 0px; } ` }); + const temperature_theme = useTheme([data_theme]); + + const analog_theme = useTheme([ + data_theme, + { + BaseCell: ` + &:nth-of-type(1) { + width: 100px; + min-width: 100px; + } + &:nth-of-type(2) { + text-align: left; + } + &:nth-of-type(3) { + width: 100px; + min-width: 100px; + } + &:nth-of-type(4) { + text-align: right; + flex: 1; + } + ` + } + ]); + const getSortIcon = (state: any, sortKey: any) => { if (state.sortKey === sortKey && state.reverse) { return ; @@ -746,12 +775,15 @@ const DashboardData: FC = () => { {deviceData.label} - setOnlyFav(!onlyFav)} />} - label={show only favorites} + label={ + + only show favorites  + + + } /> -
{ }} theme={data_theme} sort={dv_sort} - // layout={{ custom: true }} + layout={{ custom: true }} > {(tableList: any) => ( <> @@ -776,10 +808,10 @@ const DashboardData: FC = () => { ENTITY NAME - +
+
{(tableList: any) => ( <>
@@ -848,10 +884,10 @@ const DashboardData: FC = () => { NAME - +
+
{(tableList: any) => ( <>
@@ -923,7 +959,7 @@ const DashboardData: FC = () => { TYPE - VALUE + VALUE
diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index fd0703a6f..05dca4571 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -100,22 +100,28 @@ const SettingsCustomization: FC = () => { } `, BaseCell: ` - padding-left: 8px; border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + &:not(.stiff) > div { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } &:nth-of-type(1) { - left: 0px; - min-width: 124px; - width: 124px; - padding-left: 0px; + width: 120px; + min-width: 120px; + max-width: 120px; } &:nth-of-type(2) { - min-width: 70%; - width: 70%; + padding-left: 8px; + flex: 1; + } + &:nth-of-type(3) { + padding-right: 8px; + text-align: right; + width: 120px; + min-width: 120px; } `, HeaderCell: ` @@ -435,7 +441,7 @@ const SettingsCustomization: FC = () => { NAME - VALUE + VALUE From 501726c6ad2fa55b27360409b632f4850201a4e4 Mon Sep 17 00:00:00 2001 From: Proddy Date: Tue, 3 May 2022 22:20:55 +0200 Subject: [PATCH 269/319] remove comments, render nicer on mobiles --- interface/src/CustomTheme.tsx | 20 ++------------- interface/src/components/MessageBox.tsx | 1 - .../src/components/layout/LayoutAppBar.tsx | 1 - .../src/components/layout/LayoutDrawer.tsx | 2 +- interface/src/project/DashboardData.tsx | 25 +++++++++++-------- interface/src/project/DashboardStatus.tsx | 18 ++++++------- 6 files changed, 26 insertions(+), 41 deletions(-) diff --git a/interface/src/CustomTheme.tsx b/interface/src/CustomTheme.tsx index 6e04783c2..d83ffeece 100644 --- a/interface/src/CustomTheme.tsx +++ b/interface/src/CustomTheme.tsx @@ -11,28 +11,12 @@ const theme = responsiveFontSizes( }, palette: { mode: 'dark', - // background: { - // default: grey[900], // #212121 - // // paper: grey[800] - // }, - // primary: { - // main: '#33bfff' - // }, secondary: { - main: blue[500] // in buttons + main: blue[500] }, info: { - main: blueGrey[500] // used in icons + main: blueGrey[500] } - // warning: { - // main: orange[500] - // }, - // error: { - // main: red[200] - // }, - // success: { - // main: green[700] - // } } }) ); diff --git a/interface/src/components/MessageBox.tsx b/interface/src/components/MessageBox.tsx index 624f072ef..a530d8f26 100644 --- a/interface/src/components/MessageBox.tsx +++ b/interface/src/components/MessageBox.tsx @@ -32,7 +32,6 @@ const MessageBox: FC = ({ level, message, sx, children, ...rest const theme = useTheme(); const Icon = LEVEL_ICONS[level]; const backgroundColor = LEVEL_BACKGROUNDS[level](theme); - // const color = theme.palette.getContrastText(backgroundColor); const color = 'white'; return ( diff --git a/interface/src/components/layout/LayoutAppBar.tsx b/interface/src/components/layout/LayoutAppBar.tsx index 604774250..74e06fdfd 100644 --- a/interface/src/components/layout/LayoutAppBar.tsx +++ b/interface/src/components/layout/LayoutAppBar.tsx @@ -25,7 +25,6 @@ const LayoutAppBar: FC = ({ title, onToggleDrawer }) => { ml: { md: `${DRAWER_WIDTH}px` }, boxShadow: 'none', backgroundColor: '#2e586a' - // color: "#2196f3", }} > diff --git a/interface/src/components/layout/LayoutDrawer.tsx b/interface/src/components/layout/LayoutDrawer.tsx index d1a6987af..da61c62f4 100644 --- a/interface/src/components/layout/LayoutDrawer.tsx +++ b/interface/src/components/layout/LayoutDrawer.tsx @@ -47,7 +47,7 @@ const LayoutDrawer: FC = ({ mobileOpen, onClose }) => { open={mobileOpen} onClose={onClose} ModalProps={{ - keepMounted: true // Better open performance on mobile. + keepMounted: true }} sx={{ display: { xs: 'block', md: 'none' }, diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index f768c924c..827120708 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -137,6 +137,11 @@ const DashboardData: FC = () => { border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; + &:not(.stiff) > div { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } &:nth-of-type(1) { padding-left: 8px; min-width: 42px; @@ -146,8 +151,8 @@ const DashboardData: FC = () => { } } &:nth-of-type(2) { - min-width: 120px; - width: 120px; + min-width: 100px; + width: 100px; } &:nth-of-type(3) { flex: 1; @@ -157,8 +162,11 @@ const DashboardData: FC = () => { max-width: 100px; } &:last-of-type { - text-align: right; - min-width: 64px; + padding-left: 0px; + text-align: center; + width: 32px; + min-width: 32px; + max-width: 32px; } ` }); @@ -213,7 +221,6 @@ const DashboardData: FC = () => { } &:nth-of-type(1) { width: 260px; - min-width: 260px; } &:nth-of-type(2) { flex: 1; @@ -700,8 +707,8 @@ const DashboardData: FC = () => {
- TYPE - DESCRIPTION + TYPE + DESCRIPTION ENTITIES @@ -710,9 +717,7 @@ const DashboardData: FC = () => { {tableList.map((device: Device, index: number) => ( - {/* refreshDataIndex(device.id)}> */} - {/* */} {device.t} {device.n} @@ -727,9 +732,7 @@ const DashboardData: FC = () => { {(coreData.active_sensors > 0 || coreData.analog_enabled) && ( - {/* refreshDataIndex('sensor')}> */} - {/* */} Sensors Attached EMS-ESP Sensors diff --git a/interface/src/project/DashboardStatus.tsx b/interface/src/project/DashboardStatus.tsx index d97f9e0e8..1c0c4b26c 100644 --- a/interface/src/project/DashboardStatus.tsx +++ b/interface/src/project/DashboardStatus.tsx @@ -99,6 +99,7 @@ const DashboardStatus: FC = () => { color: #90CAF9; font-weight: 500; border-bottom: 1px solid #e0e0e0; + padding-left: 8px; `, Row: ` &:nth-of-type(odd) { @@ -125,26 +126,25 @@ const DashboardStatus: FC = () => { border-top: 1px solid transparent; border-right: 1px solid transparent; border-bottom: 1px solid transparent; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + &:not(.stiff) > div { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } &:nth-of-type(1) { padding-left: 8px; flex: 1; } &:nth-of-type(2) { - min-width: 15%; - width: 15%; + width: 70px; text-align: right; } &:nth-of-type(3) { - min-width: 15%; - width: 15%; + width: 40px; text-align: right; } &:last-of-type { - min-width: 15%; - width: 15%; + width: 75px; text-align: right; padding-right: 8px; } From e00da5a721f206f3abcfb12fa0797d5bebd4cf83 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 4 May 2022 14:14:17 +0200 Subject: [PATCH 270/319] add option to switch mDNS off/on --- CHANGELOG_LATEST.md | 1 + .../framework/network/NetworkSettingsForm.tsx | 8 ++++- interface/src/types/network.ts | 1 + lib/framework/NetworkSettingsService.h | 3 ++ src/web/WebStatusService.cpp | 32 ++++++++++++------- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index b665af1e2..104ef1b19 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -38,6 +38,7 @@ - Added Shower Alert trigger time and cold shot time [#436](https://github.com/emsesp/EMS-ESP32/issues/436) - Improved Table layout in Web UI (searching, filtering, sorting, exporting to CSV) - API fetch individual attributes from an entity [#462](https://github.com/emsesp/EMS-ESP32/issues/462) +- Option to disable mDNS ### Fixed diff --git a/interface/src/framework/network/NetworkSettingsForm.tsx b/interface/src/framework/network/NetworkSettingsForm.tsx index b15eb66f5..c1221713d 100644 --- a/interface/src/framework/network/NetworkSettingsForm.tsx +++ b/interface/src/framework/network/NetworkSettingsForm.tsx @@ -56,7 +56,8 @@ const WiFiSettingsForm: FC = () => { enableIPv6: false, bandwidth20: false, tx_power: 20, - nosleep: false + nosleep: false, + enableMDNS: true }); } setInitialized(true); @@ -153,6 +154,11 @@ const WiFiSettingsForm: FC = () => { label="Use Lower WiFi Bandwidth" /> + } + label="Enable mDNS Service" + /> + General diff --git a/interface/src/types/network.ts b/interface/src/types/network.ts index 538020903..fb6b576ba 100644 --- a/interface/src/types/network.ts +++ b/interface/src/types/network.ts @@ -47,6 +47,7 @@ export interface NetworkSettings { subnet_mask?: string; dns_ip_1?: string; dns_ip_2?: string; + enableMDNS: boolean; } export interface WiFiNetworkList { diff --git a/lib/framework/NetworkSettingsService.h b/lib/framework/NetworkSettingsService.h index ce3b9b189..60843431f 100644 --- a/lib/framework/NetworkSettingsService.h +++ b/lib/framework/NetworkSettingsService.h @@ -38,6 +38,7 @@ class NetworkSettings { bool bandwidth20; int8_t tx_power; bool nosleep; + bool enableMDNS; // optional configuration for static IP address IPAddress localIP; @@ -56,6 +57,7 @@ class NetworkSettings { root["bandwidth20"] = settings.bandwidth20; root["tx_power"] = settings.tx_power; root["nosleep"] = settings.nosleep; + root["enableMDNS"] = settings.enableMDNS; // extended settings JsonUtils::writeIP(root, "local_ip", settings.localIP); @@ -74,6 +76,7 @@ class NetworkSettings { settings.bandwidth20 = root["bandwidth20"] | false; settings.tx_power = root["tx_power"] | 20; settings.nosleep = root["nosleep"] | false; + settings.enableMDNS = root["enableMDNS"] | true; // extended settings JsonUtils::readIP(root, "local_ip", settings.localIP); diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index f4122656b..76063f679 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -189,21 +189,31 @@ void WebStatusService::webStatusService(AsyncWebServerRequest * request) { void WebStatusService::mDNS_start() const { #ifndef EMSESP_STANDALONE MDNS.end(); - if (!MDNS.begin(EMSESP::system_.hostname().c_str())) { - EMSESP::logger().warning(F("Failed to start mDNS responder service")); - return; - } + EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { + if (networkSettings.enableMDNS) { + if (!MDNS.begin(EMSESP::system_.hostname().c_str())) { + EMSESP::logger().warning(F("Failed to start mDNS responder service")); + return; + } - std::string address_s = EMSESP::system_.hostname() + ".local"; + std::string address_s = EMSESP::system_.hostname() + ".local"; - MDNS.addService("http", "tcp", 80); // add our web server and rest API - MDNS.addService("telnet", "tcp", 23); // add our telnet console + MDNS.addService("http", "tcp", 80); // add our web server and rest API + MDNS.addService("telnet", "tcp", 23); // add our telnet console - MDNS.addServiceTxt("http", "tcp", "version", EMSESP_APP_VERSION); - MDNS.addServiceTxt("http", "tcp", "address", address_s.c_str()); + MDNS.addServiceTxt("http", "tcp", "version", EMSESP_APP_VERSION); + MDNS.addServiceTxt("http", "tcp", "address", address_s.c_str()); + + EMSESP::logger().info(F("mDNS responder service started")); + } + }); +#else + EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { + if (networkSettings.enableMDNS) { + EMSESP::logger().info(F("mDNS responder service started")); + } + }); #endif - - EMSESP::logger().info(F("mDNS responder service started")); } } // namespace emsesp \ No newline at end of file From 5d2f648d0381b291478f8a7eaac685ce074e5a66 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 4 May 2022 14:47:57 +0200 Subject: [PATCH 271/319] add option for rendering booleans on Dashboard #456 --- CHANGELOG_LATEST.md | 1 + interface/src/project/SettingsApplication.tsx | 25 ++++++++++++++++--- interface/src/project/types.ts | 1 + lib_standalone/ESP8266React.h | 1 + src/emsdevice.cpp | 20 +++++---------- src/helpers.cpp | 4 +-- src/helpers.h | 2 +- src/system.cpp | 10 +++++--- src/system.h | 9 +++++++ src/web/WebSettingsService.cpp | 4 +++ src/web/WebSettingsService.h | 1 + 11 files changed, 53 insertions(+), 25 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 104ef1b19..b128f1fab 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -39,6 +39,7 @@ - Improved Table layout in Web UI (searching, filtering, sorting, exporting to CSV) - API fetch individual attributes from an entity [#462](https://github.com/emsesp/EMS-ESP32/issues/462) - Option to disable mDNS +- Option for rendering booleans on dashboard [#456](https://github.com/emsesp/EMS-ESP32/issues/456) ### Fixed diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx index 353f1faf0..945dfa137 100644 --- a/interface/src/project/SettingsApplication.tsx +++ b/interface/src/project/SettingsApplication.tsx @@ -402,10 +402,27 @@ const SettingsApplication: FC = () => { Formatting Options - + + + on/off + ON/OFF + true/false + 1/0 + + + { 1/0 - + Date: Fri, 6 May 2022 07:58:22 +0200 Subject: [PATCH 272/319] mdns in lib_standanlone --- lib_standalone/ESP8266React.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index 2b1bd5039..d8c9a52d0 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -93,6 +93,7 @@ class DummySettings { String dnsIP1 = ""; String dnsIP2 = ""; bool enableIPv6 = false; + bool enableMDNS = true; uint8_t phy_type = 0; uint8_t eth_power = 0; // 0 means -1 From 90aa385326fa82b10bf6a6823ca79a188be3a7a2 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 6 May 2022 07:59:07 +0200 Subject: [PATCH 273/319] shower-times in system/settings --- src/shower.h | 3 +++ src/system.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/shower.h b/src/shower.h index 809a18031..b4fb29f7c 100644 --- a/src/shower.h +++ b/src/shower.h @@ -30,6 +30,8 @@ class Shower { void set_shower_state(bool state, bool force = false); + /* unused header + * bool shower_alert() const { return shower_alert_; } @@ -45,6 +47,7 @@ class Shower { void shower_timer(const bool shower_timer) { shower_timer_ = shower_timer; } + */ private: static uuid::log::Logger logger_; diff --git a/src/system.cpp b/src/system.cpp index f0f03fad3..f63159737 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1000,8 +1000,8 @@ bool System::command_settings(const char * value, const int8_t id, JsonObject & node["shower_timer"] = settings.shower_timer; node["shower_alert"] = settings.shower_alert; if (settings.shower_alert) { - node["shower_alert_coldshot"] = settings.shower_alert_coldshot / 1000; // seconds - node["shower_alert_trigger"] = settings.shower_alert_trigger / 60000; // minutes + node["shower_alert_coldshot"] = settings.shower_alert_coldshot; // seconds + node["shower_alert_trigger"] = settings.shower_alert_trigger; // minutes } node["rx_gpio"] = settings.rx_gpio; From b2429e3cff65bdcabcdbcbd34d7ba046adc95f97 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 6 May 2022 07:59:48 +0200 Subject: [PATCH 274/319] charset for plain text output --- src/web/WebAPIService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index be8966a1e..c79e04ca5 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -124,7 +124,7 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) { // https://github.com/emsesp/EMS-ESP32/issues/462#issuecomment-1093877210 if (output.containsKey("api_data")) { JsonVariant data = output["api_data"]; - request->send(200, "text/plain", data.as()); + request->send(200, "text/plain; charset=utf-8", data.as()); api_count_++; return; } From 1a5b0125456fed561ead0462106222f79acb9680 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 6 May 2022 12:15:25 +0200 Subject: [PATCH 275/319] csv utf-8 with semicolon and Intl.Number format --- interface/src/project/DashboardData.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/interface/src/project/DashboardData.tsx b/interface/src/project/DashboardData.tsx index 827120708..5b4bd827d 100644 --- a/interface/src/project/DashboardData.tsx +++ b/interface/src/project/DashboardData.tsx @@ -355,7 +355,7 @@ const DashboardData: FC = () => { if (sc === '' || sc === '""') { return sc; } - if (sc.includes('"') || sc.includes(',') || sc.includes('\n') || sc.includes('\r')) { + if (sc.includes('"') || sc.includes(';') || sc.includes('\n') || sc.includes('\r')) { return '"' + sc.replace(/"/g, '""') + '"'; } return sc; @@ -363,13 +363,13 @@ const DashboardData: FC = () => { const makeCsvData = (columns: any, data: any) => { return data.reduce((csvString: any, rowItem: any) => { - return csvString + columns.map(({ accessor }: any) => escapeCsvCell(accessor(rowItem))).join(',') + '\r\n'; - }, columns.map(({ name }: any) => escapeCsvCell(name)).join(',') + '\r\n'); + return csvString + columns.map(({ accessor }: any) => escapeCsvCell(accessor(rowItem))).join(';') + '\r\n'; + }, columns.map(({ name }: any) => escapeCsvCell(name)).join(';') + '\r\n'); }; const downloadAsCsv = (columns: any, data: any, filename: string) => { const csvData = makeCsvData(columns, data); - const csvFile = new Blob([csvData], { type: 'text/csv' }); + const csvFile = new Blob([csvData], { type: 'text/csv;charset:utf-8' }); const downloadLink = document.createElement('a'); downloadLink.download = filename; @@ -384,8 +384,8 @@ const DashboardData: FC = () => { const handleDownloadCsv = () => { const columns = [ { accessor: (dv: any) => dv.id.slice(2), name: 'Entity' }, - { accessor: (dv: any) => dv.v, name: 'Value' }, - { accessor: (dv: any) => (dv.u >= 1 && dv.u <= 2 ? 'C' : DeviceValueUOM_s[dv.u]), name: 'UoM' } + { accessor: (dv: any) => (typeof dv.v === 'number') ? new Intl.NumberFormat().format(dv.v) : dv.v, name: 'Value' }, + { accessor: (dv: any) => DeviceValueUOM_s[dv.u], name: 'UoM' } ]; downloadAsCsv( columns, From 6277fbbea10101a462328fb45ad7548f3d655c7a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 6 May 2022 13:27:21 +0200 Subject: [PATCH 276/319] api entitiy attributes with hcs --- src/analogsensor.cpp | 37 ++++++++++++++++++++++++++---- src/command.cpp | 54 ++++++++++++++++++++------------------------ src/dallassensor.cpp | 31 +++++++++++++++++++++++-- src/emsdevice.cpp | 19 +++++++--------- 4 files changed, 95 insertions(+), 46 deletions(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 7a6856f53..8131754d6 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -435,15 +435,43 @@ void AnalogSensor::publish_values(const bool force) { // called from emsesp.cpp, similar to the emsdevice->get_value_info // searches by name bool AnalogSensor::get_value_info(JsonObject & output, const char * cmd, const int8_t id) const { + // make a copy of the string command for parsing + char command_s[30]; + strlcpy(command_s, cmd, sizeof(command_s)); + char * attribute_s = nullptr; + + // check specific attribute to fetch instead of the complete record + char * breakp = strchr(command_s, '/'); + if (breakp) { + *breakp = '\0'; + attribute_s = breakp + 1; + } + for (const auto & sensor : sensors_) { - if (strcmp(cmd, sensor.name().c_str()) == 0) { + if (strcmp(command_s, sensor.name().c_str()) == 0) { output["gpio"] = sensor.gpio(); output["name"] = sensor.name(); - output["type"] = sensor.type(); - output["uom"] = sensor.uom(); + output["type"] = F_(number); + output["analog"] = FL_(enum_sensortype)[sensor.type()]; + output["uom"] = EMSdevice::uom_to_string(sensor.uom()); output["offset"] = sensor.offset(); output["factor"] = sensor.factor(); output["value"] = sensor.value(); + // if we're filtering on an attribute, go find it + if (attribute_s) { + if (output.containsKey(attribute_s)) { + JsonVariant data = output[attribute_s]; + output.clear(); + output["api_data"] = data; + return true; + } else { + char error[100]; + snprintf(error, sizeof(error), "cannot find attribute %s in entity %s", attribute_s, command_s); + output.clear(); + output["message"] = error; + return false; + } + } return true; } } @@ -461,7 +489,8 @@ bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject if (id == -1) { // show number and id JsonObject dataSensor = output.createNestedObject(sensor.name()); dataSensor["gpio"] = sensor.gpio(); - dataSensor["type"] = FL_(enum_sensortype)[sensor.type()]; + dataSensor["type"] = F_(number); + dataSensor["analog"] = FL_(enum_sensortype)[sensor.type()]; if (sensor.type() == AnalogType::ADC) { dataSensor["uom"] = EMSdevice::uom_to_string(sensor.uom()); dataSensor["offset"] = sensor.offset(); diff --git a/src/command.cpp b/src/command.cpp index d8c7b8406..e54cc1ced 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -90,11 +90,16 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec const char * command_p = nullptr; if (num_paths == 2) { command_p = p.paths()[1].c_str(); - } else if (num_paths >= 3) { + } else if (num_paths == 3) { // concatenate the path into one string as it could be in the format 'hc/XXX' char command[50]; snprintf(command, sizeof(command), "%s/%s", p.paths()[1].c_str(), p.paths()[2].c_str()); command_p = command; + } else if (num_paths > 3) { + // concatenate the path into one string as it could be in the format 'hc/XXX/attribute' + char command[50]; + snprintf(command, sizeof(command), "%s/%s/%s", p.paths()[1].c_str(), p.paths()[2].c_str(), p.paths()[3].c_str()); + command_p = command; } else { // take it from the JSON if (input.containsKey("entity")) { @@ -110,7 +115,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec if (command_p == nullptr) { // handle dead endpoints like api/system or api/boiler // default to 'info' for SYSTEM, DALLASENSOR and ANALOGSENSOR, the other devices to 'values' for shortname version - if (num_paths < 3) { + if (num_paths < (id_n > 0 ? 4 : 3)) { if (device_type < EMSdevice::DeviceType::BOILER) { command_p = "info"; } else { @@ -188,37 +193,28 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { return nullptr; } - // make a copy of the string command for parsing - char command_s[30]; - strlcpy(command_s, command, sizeof(command_s)); - - // look for a delimeter and split the string - char * p = command_s; - char * breakp = strchr(p, '.'); - if (!breakp) { - p = command_s; // reset and look for / - breakp = strchr(p, '/'); - if (!breakp) { - p = command_s; // reset and look for _ - breakp = strchr(p, '_'); - if (!breakp) { - return command; // no delimeter found, return the whole string - } + if (!strncmp(command, "hc", 2) && strlen(command) >= 3) { + id = command[2] - '0'; + command += 3; + } else if (!strncmp(command, "wwc", 3) && strlen(command) >= 4) { + if (command[3] == '1' && command[4] == '0') { + id = 19; // wwc10 + command += 5; + } else { + id = command[3] - '0' + 8; // wwc1 has id 9 + command += 4; } } - - // extract the hc or wwc number - uint8_t start_pos = breakp - p + 1; - if (!strncmp(command, "hc", 2) && start_pos == 4) { - id = command[start_pos - 2] - '0'; - } else if (!strncmp(command, "wwc", 3) && start_pos == 5) { - id = command[start_pos - 2] - '0' + 8; // wwc1 has id 9 - } else { - id = 0; // special case for extracting the attributes - return command; + // remove separator + if (command[0] == '/' || command[0] == '.' || command[0] == '_') { + command++; + } + // return null for empty command + if (command[0] == '\0') { + return nullptr; } - return (command + start_pos); + return command; } // calls a command directly diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index a66e070fd..58c15e123 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -375,8 +375,20 @@ bool DallasSensor::command_info(const char * value, const int8_t id, JsonObject // called from emsesp.cpp, similar to the emsdevice->get_value_info bool DallasSensor::get_value_info(JsonObject & output, const char * cmd, const int8_t id) { + // make a copy of the string command for parsing + char command_s[30]; + strlcpy(command_s, cmd, sizeof(command_s)); + char * attribute_s = nullptr; + + // check specific attribute to fetch instead of the complete record + char * breakp = strchr(command_s, '/'); + if (breakp) { + *breakp = '\0'; + attribute_s = breakp + 1; + } + for (const auto & sensor : sensors_) { - if (strcmp(cmd, sensor.name().c_str()) == 0) { + if (strcmp(command_s, sensor.name().c_str()) == 0) { output["id"] = sensor.id(); output["name"] = sensor.name(); if (Helpers::hasValue(sensor.temperature_c)) { @@ -385,8 +397,23 @@ bool DallasSensor::get_value_info(JsonObject & output, const char * cmd, const i output["type"] = F_(number); output["min"] = Helpers::round2(-55, 0, EMSESP::system_.fahrenheit() ? 2 : 0); output["max"] = Helpers::round2(125, 0, EMSESP::system_.fahrenheit() ? 2 : 0); - output["unit"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); + output["uom"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); output["writeable"] = false; + // if we're filtering on an attribute, go find it + if (attribute_s) { + if (output.containsKey(attribute_s)) { + JsonVariant data = output[attribute_s]; + output.clear(); + output["api_data"] = data; + return true; + } else { + char error[100]; + snprintf(error, sizeof(error), "cannot find attribute %s in entity %s", attribute_s, command_s); + output.clear(); + output["message"] = error; + return false; + } + } return true; } } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index a1465ee47..29d2759a2 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -912,16 +912,13 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 // make a copy of the string command for parsing char command_s[30]; strlcpy(command_s, cmd, sizeof(command_s)); - char * attribute_s = command_s; + char * attribute_s = nullptr; - // if id=0 then we have a specific attribute to fetch instead of the complete record - if (id == 0) { - char * p = command_s; - char * breakp = strchr(p, '/'); - if (breakp) { - *breakp = '\0'; - attribute_s = breakp + 1; - } + // check specific attribute to fetch instead of the complete record + char * breakp = strchr(command_s, '/'); + if (breakp) { + *breakp = '\0'; + attribute_s = breakp + 1; } // search device value with this tag @@ -1065,8 +1062,8 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 json[value] = "not set"; } - // if id is 0 then we're filtering on an attribute, go find it - if (id == 0) { + // if we're filtering on an attribute, go find it + if (attribute_s) { #if defined(EMSESP_DEBUG) EMSESP::logger().debug(F("[DEBUG] Attribute '%s'"), attribute_s); #endif From 4f399b51f5d192e0f126948f597213c2b9166159 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:46:13 +0200 Subject: [PATCH 277/319] package updates --- interface/package-lock.json | 14 +++++++------- interface/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index d40e263ce..77fea275b 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -29,7 +29,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^14.2.0", + "react-dropzone": "^14.2.1", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", @@ -14437,9 +14437,9 @@ } }, "node_modules/react-dropzone": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.0.tgz", - "integrity": "sha512-D7AXPtRba8rd7DBOejh3W2v1Uax6i7XKPYPuMr13XFPfnDcPHHvlEfp3raVpdj3XMHlRfYuf2H5+m8p7mlgKdQ==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.1.tgz", + "integrity": "sha512-jzX6wDtAjlfwZ+Fbg+G17EszWUkQVxhMTWMfAC9qSUq7II2pKglHA8aarbFKl0mLpRPDaNUcy+HD/Sf4gkf76Q==", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.6.0", @@ -27793,9 +27793,9 @@ } }, "react-dropzone": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.0.tgz", - "integrity": "sha512-D7AXPtRba8rd7DBOejh3W2v1Uax6i7XKPYPuMr13XFPfnDcPHHvlEfp3raVpdj3XMHlRfYuf2H5+m8p7mlgKdQ==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.1.tgz", + "integrity": "sha512-jzX6wDtAjlfwZ+Fbg+G17EszWUkQVxhMTWMfAC9qSUq7II2pKglHA8aarbFKl0mLpRPDaNUcy+HD/Sf4gkf76Q==", "requires": { "attr-accept": "^2.2.2", "file-selector": "^0.6.0", diff --git a/interface/package.json b/interface/package.json index 837318bef..413709d0b 100644 --- a/interface/package.json +++ b/interface/package.json @@ -25,7 +25,7 @@ "react": "^17.0.2", "react-app-rewired": "^2.2.1", "react-dom": "^17.0.2", - "react-dropzone": "^14.2.0", + "react-dropzone": "^14.2.1", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", From b35ab94509a7a436f993f02a85575df058d42301 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:46:31 +0200 Subject: [PATCH 278/319] upload script example --- scripts/upload_fw.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 scripts/upload_fw.py diff --git a/scripts/upload_fw.py b/scripts/upload_fw.py new file mode 100644 index 000000000..0de980efe --- /dev/null +++ b/scripts/upload_fw.py @@ -0,0 +1,10 @@ +# for calling dos upload from Window WSL2 Linux, because serial ports are not mapped yet +# example file +Import('env') +from subprocess import call + +def upload(source, target, env): + print("bin file: " + str(target[0])) + call(["cmd.exe", "/c", "c:\\Users\\paul\\OneDrive\\Desktop\\ems-esp32.bat"]) + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [upload]) From f243162724e1e46cb829b9891d6b956bb8dfb242 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:46:49 +0200 Subject: [PATCH 279/319] comments --- lib_standalone/Features.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_standalone/Features.h b/lib_standalone/Features.h index f51037050..28cd6d551 100644 --- a/lib_standalone/Features.h +++ b/lib_standalone/Features.h @@ -28,7 +28,7 @@ #define FT_OTA 0 #endif -// upload firmware feature off by default +// upload firmware/file feature off by default #ifndef FT_UPLOAD_FIRMWARE #define FT_UPLOAD_FIRMWARE 0 #endif From 9923b60d64da6ca499b00cb9ea73abac24b31044 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:49:02 +0200 Subject: [PATCH 280/319] Feature: upload customization settings from a file #256 --- interface/src/AppRouting.tsx | 5 +- interface/src/api/endpoints.ts | 2 +- interface/src/api/system.ts | 6 +- .../src/components/upload/SingleUpload.tsx | 3 +- .../src/components/upload/useFileUpload.ts | 2 +- .../framework/system/FirmwareFileUpload.tsx | 33 --- .../framework/system/GeneralFileUpload.tsx | 28 ++ ...eRestartMonitor.tsx => RestartMonitor.tsx} | 6 +- interface/src/framework/system/System.tsx | 6 +- .../src/framework/system/SystemStatusForm.tsx | 2 +- .../src/framework/system/UploadFileForm.tsx | 26 ++ .../framework/system/UploadFirmwareForm.tsx | 26 -- interface/src/project/HelpInformation.tsx | 32 ++- lib/framework/ESP8266React.cpp | 2 +- lib/framework/ESP8266React.h | 4 +- lib/framework/FSPersistence.h | 14 +- lib/framework/UploadFileService.cpp | 122 ++++++++ ...dFirmwareService.h => UploadFileService.h} | 13 +- lib/framework/UploadFirmwareService.cpp | 68 ----- lib_standalone/ESP8266React.h | 8 + mock-api/server.js | 8 +- src/emsesp.cpp | 10 +- src/system.cpp | 267 ++++++------------ src/system.h | 3 + src/test/test.cpp | 2 + src/version.h | 2 +- 26 files changed, 348 insertions(+), 352 deletions(-) delete mode 100644 interface/src/framework/system/FirmwareFileUpload.tsx create mode 100644 interface/src/framework/system/GeneralFileUpload.tsx rename interface/src/framework/system/{FirmwareRestartMonitor.tsx => RestartMonitor.tsx} (89%) create mode 100644 interface/src/framework/system/UploadFileForm.tsx delete mode 100644 interface/src/framework/system/UploadFirmwareForm.tsx create mode 100644 lib/framework/UploadFileService.cpp rename lib/framework/{UploadFirmwareService.h => UploadFileService.h} (67%) delete mode 100644 lib/framework/UploadFirmwareService.cpp diff --git a/interface/src/AppRouting.tsx b/interface/src/AppRouting.tsx index 4017d9d14..4861c715d 100644 --- a/interface/src/AppRouting.tsx +++ b/interface/src/AppRouting.tsx @@ -47,10 +47,7 @@ const AppRouting: FC = () => { } /> - } - /> + } /> {features.security && ( void; } -export const uploadFile = (url: string, file: File, config?: FileUploadConfig): AxiosPromise => { +export const startUploadFile = (url: string, file: File, config?: FileUploadConfig): AxiosPromise => { const formData = new FormData(); formData.append('file', file); diff --git a/interface/src/api/system.ts b/interface/src/api/system.ts index 4db11723d..f93ff4853 100644 --- a/interface/src/api/system.ts +++ b/interface/src/api/system.ts @@ -2,7 +2,7 @@ import { AxiosPromise } from 'axios'; import { OTASettings, SystemStatus, LogSettings, LogEntries } from '../types'; -import { AXIOS, AXIOS_BIN, FileUploadConfig, uploadFile } from './endpoints'; +import { AXIOS, AXIOS_BIN, FileUploadConfig, startUploadFile } from './endpoints'; export function readSystemStatus(timeout?: number): AxiosPromise { return AXIOS.get('/systemStatus', { timeout }); @@ -24,8 +24,8 @@ export function updateOTASettings(otaSettings: OTASettings): AxiosPromise => - uploadFile('/uploadFirmware', file, config); +export const uploadFile = (file: File, config?: FileUploadConfig): AxiosPromise => + startUploadFile('/uploadFile', file, config); export function readLogSettings(): AxiosPromise { return AXIOS.get('/logSettings'); diff --git a/interface/src/components/upload/SingleUpload.tsx b/interface/src/components/upload/SingleUpload.tsx index f1cb6fb18..acdc15071 100644 --- a/interface/src/components/upload/SingleUpload.tsx +++ b/interface/src/components/upload/SingleUpload.tsx @@ -32,7 +32,8 @@ const SingleUpload: FC = ({ onDrop, onCancel, uploading, prog const dropzoneState = useDropzone({ onDrop, accept: { - 'application/octet-stream': ['.bin'] + 'application/octet-stream': ['.bin'], + 'application/json': ['.json'] }, disabled: uploading, multiple: false diff --git a/interface/src/components/upload/useFileUpload.ts b/interface/src/components/upload/useFileUpload.ts index b7529020f..0cc12b1aa 100644 --- a/interface/src/components/upload/useFileUpload.ts +++ b/interface/src/components/upload/useFileUpload.ts @@ -42,7 +42,7 @@ const useFileUpload = ({ upload }: MediaUploadOptions) => { cancelToken: cancelToken.token }); resetUploadingStates(); - enqueueSnackbar('Upload successful', { variant: 'success' }); + enqueueSnackbar('File uploaded', { variant: 'success' }); } catch (error: unknown) { if (axios.isCancel(error)) { enqueueSnackbar('Upload aborted', { variant: 'warning' }); diff --git a/interface/src/framework/system/FirmwareFileUpload.tsx b/interface/src/framework/system/FirmwareFileUpload.tsx deleted file mode 100644 index a0b212fdf..000000000 --- a/interface/src/framework/system/FirmwareFileUpload.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { AxiosPromise } from 'axios'; -import { FC } from 'react'; - -import { FileUploadConfig } from '../../api/endpoints'; -import { MessageBox, SingleUpload, useFileUpload } from '../../components'; - -interface UploadFirmwareProps { - uploadFirmware: (file: File, config?: FileUploadConfig) => AxiosPromise; -} - -const FirmwareFileUpload: FC = ({ uploadFirmware }) => { - const [uploadFile, cancelUpload, uploading, uploadProgress] = useFileUpload({ upload: uploadFirmware }); - - return ( - <> - {!uploading && ( - - )} - - - ); -}; - -export default FirmwareFileUpload; diff --git a/interface/src/framework/system/GeneralFileUpload.tsx b/interface/src/framework/system/GeneralFileUpload.tsx new file mode 100644 index 000000000..8f084b69e --- /dev/null +++ b/interface/src/framework/system/GeneralFileUpload.tsx @@ -0,0 +1,28 @@ +import { AxiosPromise } from 'axios'; +import { FC } from 'react'; + +import { FileUploadConfig } from '../../api/endpoints'; +import { MessageBox, SingleUpload, useFileUpload } from '../../components'; + +interface UploadFileProps { + uploadGeneralFile: (file: File, config?: FileUploadConfig) => AxiosPromise; +} + +const GeneralFileUpload: FC = ({ uploadGeneralFile }) => { + const [uploadFile, cancelUpload, uploading, uploadProgress] = useFileUpload({ upload: uploadGeneralFile }); + + return ( + <> + {!uploading && ( + + )} + + + ); +}; + +export default GeneralFileUpload; diff --git a/interface/src/framework/system/FirmwareRestartMonitor.tsx b/interface/src/framework/system/RestartMonitor.tsx similarity index 89% rename from interface/src/framework/system/FirmwareRestartMonitor.tsx rename to interface/src/framework/system/RestartMonitor.tsx index 7dd050c6e..3e832f302 100644 --- a/interface/src/framework/system/FirmwareRestartMonitor.tsx +++ b/interface/src/framework/system/RestartMonitor.tsx @@ -8,7 +8,7 @@ const RESTART_TIMEOUT = 2 * 60 * 1000; const POLL_TIMEOUT = 2000; const POLL_INTERVAL = 5000; -const FirmwareRestartMonitor: FC = () => { +const RestartMonitor: FC = () => { const [failed, setFailed] = useState(false); const [timeoutId, setTimeoutId] = useState(); @@ -16,7 +16,7 @@ const FirmwareRestartMonitor: FC = () => { const poll = useRef(async () => { try { await SystemApi.readSystemStatus(POLL_TIMEOUT); - document.location.href = '/firmwareUpdated'; + document.location.href = '/fileUpdated'; } catch (error: unknown) { if (new Date().getTime() < timeoutAt.current) { setTimeoutId(setTimeout(poll.current, POLL_INTERVAL)); @@ -40,4 +40,4 @@ const FirmwareRestartMonitor: FC = () => { ); }; -export default FirmwareRestartMonitor; +export default RestartMonitor; diff --git a/interface/src/framework/system/System.tsx b/interface/src/framework/system/System.tsx index 553f60ad0..07cf8296d 100644 --- a/interface/src/framework/system/System.tsx +++ b/interface/src/framework/system/System.tsx @@ -6,7 +6,7 @@ import { Tab } from '@mui/material'; import { useRouterTab, RouterTabs, useLayoutTitle, RequireAdmin } from '../../components'; import { AuthenticatedContext } from '../../contexts/authentication'; import { FeaturesContext } from '../../contexts/features'; -import UploadFirmwareForm from './UploadFirmwareForm'; +import UploadFileForm from './UploadFileForm'; import SystemStatusForm from './SystemStatusForm'; import OTASettingsForm from './OTASettingsForm'; @@ -26,7 +26,7 @@ const System: FC = () => { {features.ota && } - {features.upload_firmware && } + {features.upload_firmware && } } /> @@ -46,7 +46,7 @@ const System: FC = () => { path="upload" element={ - + } /> diff --git a/interface/src/framework/system/SystemStatusForm.tsx b/interface/src/framework/system/SystemStatusForm.tsx index 62c333fce..52c1a3a4b 100644 --- a/interface/src/framework/system/SystemStatusForm.tsx +++ b/interface/src/framework/system/SystemStatusForm.tsx @@ -159,7 +159,7 @@ const SystemStatusForm: FC = () => { Use  - {'UPLOAD FIRMWARE'} + {'UPLOAD'}  to apply the new firmware diff --git a/interface/src/framework/system/UploadFileForm.tsx b/interface/src/framework/system/UploadFileForm.tsx new file mode 100644 index 000000000..29f161310 --- /dev/null +++ b/interface/src/framework/system/UploadFileForm.tsx @@ -0,0 +1,26 @@ +import { FC, useRef, useState } from 'react'; + +import * as SystemApi from '../../api/system'; +import { SectionContent } from '../../components'; +import { FileUploadConfig } from '../../api/endpoints'; + +import GeneralFileUpload from './GeneralFileUpload'; +import RestartMonitor from './RestartMonitor'; + +const UploadFileForm: FC = () => { + const [restarting, setRestarting] = useState(); + + const uploadFile = useRef(async (file: File, config?: FileUploadConfig) => { + const response = await SystemApi.uploadFile(file, config); + setRestarting(true); + return response; + }); + + return ( + + {restarting ? : } + + ); +}; + +export default UploadFileForm; diff --git a/interface/src/framework/system/UploadFirmwareForm.tsx b/interface/src/framework/system/UploadFirmwareForm.tsx deleted file mode 100644 index 5af94f0de..000000000 --- a/interface/src/framework/system/UploadFirmwareForm.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { FC, useRef, useState } from 'react'; - -import * as SystemApi from '../../api/system'; -import { SectionContent } from '../../components'; -import { FileUploadConfig } from '../../api/endpoints'; - -import FirmwareFileUpload from './FirmwareFileUpload'; -import FirmwareRestartMonitor from './FirmwareRestartMonitor'; - -const UploadFirmwareForm: FC = () => { - const [restarting, setRestarting] = useState(); - - const uploadFirmware = useRef(async (file: File, config?: FileUploadConfig) => { - const response = await SystemApi.uploadFirmware(file, config); - setRestarting(true); - return response; - }); - - return ( - - {restarting ? : } - - ); -}; - -export default UploadFirmwareForm; diff --git a/interface/src/project/HelpInformation.tsx b/interface/src/project/HelpInformation.tsx index 803f30b83..e081facca 100644 --- a/interface/src/project/HelpInformation.tsx +++ b/interface/src/project/HelpInformation.tsx @@ -36,7 +36,7 @@ const HelpInformation: FC = () => { } else { const json = response.data; const a = document.createElement('a'); - const filename = 'emsesp_' + endpoint + '.txt'; + const filename = 'emsesp_' + endpoint + '.json'; a.href = URL.createObjectURL( new Blob([JSON.stringify(json, null, 2)], { type: 'text/plain' @@ -112,26 +112,30 @@ const HelpInformation: FC = () => { {me.admin && ( <> - + Export Data - - Download the current system information, application settings and any customizations using the buttons - below. + + Download the current system information to show EMS statistics and connected devices + + + + + + Export the application settings and any customizations to a JSON file. These files can later be uploaded + via the System menu. + + + Be careful when sharing the settings as the file contains passwords and other sensitive system + information. -
+
{(tableList: any) => ( <>
@@ -140,16 +141,16 @@ const ManageUsersForm: FC = () => {
- {tableList.map((u: User, index: number) => ( + {tableList.map((u: any) => ( - {u.id} + {u.username} {u.admin ? : } generateToken(u.id)} + onClick={() => generateToken(u.username)} > From c49928bf3be192ad97f2ed2abc46e3859ff7bb40 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:49:27 +0200 Subject: [PATCH 282/319] remove id in User --- interface/src/types/security.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/types/security.ts b/interface/src/types/security.ts index 472248b12..90db06a1e 100644 --- a/interface/src/types/security.ts +++ b/interface/src/types/security.ts @@ -1,5 +1,4 @@ export interface User { - id: string; // needed for Table username: string; password: string; admin: boolean; From a383925661aef74560ba3000baf7afe4dbb57d02 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:49:36 +0200 Subject: [PATCH 283/319] fix axios error reporting --- interface/src/utils/endpoints.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/utils/endpoints.ts b/interface/src/utils/endpoints.ts index 24d88fe1e..447bfbf3b 100644 --- a/interface/src/utils/endpoints.ts +++ b/interface/src/utils/endpoints.ts @@ -2,9 +2,9 @@ import { AxiosError } from 'axios'; export const extractErrorMessage = (error: unknown, defaultMessage: string) => { if (error instanceof AxiosError) { - return error.response && error.response.data && error?.response?.data?.message; + return defaultMessage + ' (' + error.request.statusText + ')'; } else if (error instanceof Error) { - return error.message; + return defaultMessage + ' (' + error.message + ')'; } return defaultMessage; }; From 84a2a7340c81192f2047d8b7b81ad4785a0613b5 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:49:49 +0200 Subject: [PATCH 284/319] comments --- lib/framework/Features.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/framework/Features.h b/lib/framework/Features.h index d93111e3f..204caaa18 100644 --- a/lib/framework/Features.h +++ b/lib/framework/Features.h @@ -30,7 +30,7 @@ #define FT_OTA 1 #endif -// upload firmware feature on by default +// upload firmware/file feature on by default #ifndef FT_UPLOAD_FIRMWARE #define FT_UPLOAD_FIRMWARE 1 #endif From cb16be6b1dc9339f9f44d9514eacead4a6633b35 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:50:00 +0200 Subject: [PATCH 285/319] remove id from User --- lib/framework/SecuritySettingsService.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/framework/SecuritySettingsService.h b/lib/framework/SecuritySettingsService.h index 51f57461e..cdbd8d085 100644 --- a/lib/framework/SecuritySettingsService.h +++ b/lib/framework/SecuritySettingsService.h @@ -43,7 +43,6 @@ class SecuritySettings { JsonArray users = root.createNestedArray("users"); for (User user : settings.users) { JsonObject userRoot = users.createNestedObject(); - userRoot["id"] = user.username; // for React Table userRoot["username"] = user.username; userRoot["password"] = user.password; userRoot["admin"] = user.admin; From 964e75e1917f2c2ef07b0678e1e93e55e1951af3 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:50:10 +0200 Subject: [PATCH 286/319] minor change --- src/command.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command.cpp b/src/command.cpp index d8c7b8406..1c3c54dc1 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -261,7 +261,7 @@ uint8_t Command::call(const uint8_t device_type, const char * cmd, const char * return CommandRet::NOT_ALLOWED; // command not allowed } - if (value == nullptr) { + if ((value == nullptr) || (strlen(value) == 0)) { if (EMSESP::system_.readonly_mode()) { LOG_INFO(F("[readonly] Calling command '%s/%s' (%s)"), dname.c_str(), cmd, read_flash_string(cf->description_).c_str()); } else { From ee0492771d0f5b28edeffc6a80b80e3c480dfe45 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:50:22 +0200 Subject: [PATCH 287/319] text change --- src/console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/console.cpp b/src/console.cpp index 9a08fe2e6..008c19c57 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -661,7 +661,7 @@ void Console::load_system_commands(unsigned int context) { networkSettings.ssid = arguments.front().c_str(); return StateUpdateResult::CHANGED; }); - shell.println("Use `wifi reconnect` to save and apply the new settings"); + shell.println("Use `wifi reconnect` to apply the new settings"); }); // added by mvdp From ce60bd10b6ad98bde86b0ba164a22b5de793d088 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 17:50:36 +0200 Subject: [PATCH 288/319] telnet and analog on by default --- src/default_settings.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/default_settings.h b/src/default_settings.h index 134ff4dc8..c1ee628b5 100644 --- a/src/default_settings.h +++ b/src/default_settings.h @@ -93,11 +93,11 @@ #endif #ifndef EMSESP_DEFAULT_ANALOG_ENABLED -#define EMSESP_DEFAULT_ANALOG_ENABLED false +#define EMSESP_DEFAULT_ANALOG_ENABLED true #endif #ifndef EMSESP_DEFAULT_TELNET_ENABLED -#define EMSESP_DEFAULT_TELNET_ENABLED false +#define EMSESP_DEFAULT_TELNET_ENABLED true #endif #ifndef EMSESP_DEFAULT_BOARD_PROFILE From 87c9d4d823138e83464c17bd4a3a84dc8337b9a6 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 7 May 2022 18:41:42 +0200 Subject: [PATCH 289/319] fix duplication --- lib_standalone/ESP8266React.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index 5f8f400c5..e9a20e562 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -33,7 +33,6 @@ class DummySettings { uint32_t syslog_mark_interval = 0; String syslog_host = "192.168.1.4"; uint16_t syslog_port = 514; - bool enableMDNS = false; uint8_t master_thermostat = 0; bool shower_timer = true; bool shower_alert = false; From c0aa263f2b73e5a92772d36024d7b8ab60b53de2 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 8 May 2022 11:19:12 +0200 Subject: [PATCH 290/319] parse_command checks prefix-numbers and prefix `id` --- src/command.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index e54cc1ced..ee79a2d76 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -193,17 +193,22 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { return nullptr; } - if (!strncmp(command, "hc", 2) && strlen(command) >= 3) { + // check prefix and valid number range, also check 'id' + if (!strncmp(command, "hc", 2) && command[2] >= '1' && command[2] <= '8') { + id = command[2] - '0'; + command += 3; + } else if (!strncmp(command, "wwc", 3) && command[3] == '1' && command[4] == '0') { + id = 19; + command += 5; + } else if (!strncmp(command, "wwc", 3) && command[3] >= '1' && command[3] <= '9') { + id = command[3] - '0' + 8; + command += 4; + } else if (!strncmp(command, "id", 2) && command[2] == '1' && command[3] >= '0' && command[3] <= '9') { + id = command[3] - '0' + 10; + command += 4; + } else if (!strncmp(command, "id", 2) && command[2] >= '1' && command[2] <= '9') { id = command[2] - '0'; command += 3; - } else if (!strncmp(command, "wwc", 3) && strlen(command) >= 4) { - if (command[3] == '1' && command[4] == '0') { - id = 19; // wwc10 - command += 5; - } else { - id = command[3] - '0' + 8; // wwc1 has id 9 - command += 4; - } } // remove separator if (command[0] == '/' || command[0] == '.' || command[0] == '_') { From 1f933fb26aee315412034f8a6509475aa82401f8 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 8 May 2022 14:58:41 +0200 Subject: [PATCH 291/319] updates for #256 --- CHANGELOG_LATEST.md | 1 + interface/src/project/HelpInformation.tsx | 37 ++-- src/system.cpp | 198 +++++++++++++++------- 3 files changed, 158 insertions(+), 78 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index b128f1fab..0ec10fa91 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -40,6 +40,7 @@ - API fetch individual attributes from an entity [#462](https://github.com/emsesp/EMS-ESP32/issues/462) - Option to disable mDNS - Option for rendering booleans on dashboard [#456](https://github.com/emsesp/EMS-ESP32/issues/456) +- Upload customization settings from a file [#256](https://github.com/emsesp/EMS-ESP32/issues/256) ### Fixed diff --git a/interface/src/project/HelpInformation.tsx b/interface/src/project/HelpInformation.tsx index e081facca..16a27dbe4 100644 --- a/interface/src/project/HelpInformation.tsx +++ b/interface/src/project/HelpInformation.tsx @@ -2,7 +2,7 @@ import { FC, useContext } from 'react'; import { Typography, Button, Box, List, ListItem, ListItemText, Link, ListItemAvatar } from '@mui/material'; -import { SectionContent, ButtonRow } from '../components'; +import { SectionContent, ButtonRow, MessageBox } from '../components'; import { AuthenticatedContext } from '../contexts/authentication'; @@ -102,9 +102,13 @@ const HelpInformation: FC = () => { - To report an issue or request a feature, please do via  + To report an issue or request a feature, please  + onDownload('info')}> + download + +  the debug information and include in a new  - {'GitHub'} + GitHub issue @@ -112,28 +116,15 @@ const HelpInformation: FC = () => { {me.admin && ( <> - - Export Data + + Download Settings - - Download the current system information to show EMS statistics and connected devices - - - - - + Export the application settings and any customizations to a JSON file. These files can later be uploaded - via the System menu. - - - Be careful when sharing the settings as the file contains passwords and other sensitive system - information. + via System→Upload. - + )} diff --git a/src/system.cpp b/src/system.cpp index 5e6cb16e4..05c6cf911 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -689,7 +689,7 @@ void System::commands_init() { // these commands will return data in JSON format Command::add(EMSdevice::DeviceType::SYSTEM, F_(info), System::command_info, F("show system status")); - Command::add(EMSdevice::DeviceType::SYSTEM, F_(settings), System::command_settings, F("fetch system settings")); + Command::add(EMSdevice::DeviceType::SYSTEM, F_(settings), System::command_settings, F("fetch system settings"), CommandFlag::ADMIN_ONLY); Command::add(EMSdevice::DeviceType::SYSTEM, F_(customizations), System::command_customizations, F("fetch system customizations")); Command::add(EMSdevice::DeviceType::SYSTEM, F_(commands), System::command_commands, F("fetch system commands")); @@ -915,10 +915,7 @@ bool System::check_upgrade() { reboot_required |= saveSettings(EMSESP_SETTINGS_FILE, "Settings", input); } else if (settings_type == "customizations") { // it's a customization file, just replace it and there's no need to reboot - LOG_INFO(F("Applying new customizations")); - new_file.close(); - LITTLEFS.remove(EMSESP_CUSTOMIZATION_FILE); - LITTLEFS.rename(TEMP_FILENAME_PATH, EMSESP_CUSTOMIZATION_FILE); + saveSettings(EMSESP_CUSTOMIZATION_FILE, "Customizations", input); return false; // no reboot required } else { LOG_ERROR(F("Unrecognized file uploaded")); @@ -927,7 +924,7 @@ bool System::check_upgrade() { LOG_ERROR(F("Unrecognized file uploaded, not json")); } - // close (just in case) and remove the file + // close (just in case) and remove the temp file new_file.close(); LITTLEFS.remove(TEMP_FILENAME_PATH); } @@ -1011,36 +1008,26 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp JsonObject node; // System - node = output.createNestedObject("System"); - - node["version"] = EMSESP_APP_VERSION; - node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); - node["uptime (seconds)"] = uuid::get_uptime_sec(); - node["network time"] = EMSESP::system_.ntp_connected() ? "connected" : "disconnected"; - + node = output.createNestedObject("System Status"); + node["version"] = EMSESP_APP_VERSION; + node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); + // node["uptime (seconds)"] = uuid::get_uptime_sec(); #ifndef EMSESP_STANDALONE node["freemem"] = ESP.getFreeHeap() / 1000L; // kilobytes #endif node["reset reason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1); - if (EMSESP::dallas_enabled()) { - node["temperature sensors"] = EMSESP::dallassensor_.no_sensors(); - } - - if (EMSESP::analog_enabled()) { - node["analog sensors"] = EMSESP::analogsensor_.no_sensors(); - } #ifndef EMSESP_STANDALONE - // Network - node = output.createNestedObject("Network"); + // Network Status + node = output.createNestedObject("Network Status"); if (WiFi.status() == WL_CONNECTED) { - node["connection"] = F("WiFi"); - node["hostname"] = WiFi.getHostname(); - node["SSID"] = WiFi.SSID(); - node["BSSID"] = WiFi.BSSIDstr(); - node["RSSI"] = WiFi.RSSI(); - node["MAC"] = WiFi.macAddress(); + node["connection"] = F("WiFi"); + node["hostname"] = WiFi.getHostname(); + // node["SSID"] = WiFi.SSID(); + // node["BSSID"] = WiFi.BSSIDstr(); + node["RSSI"] = WiFi.RSSI(); + // node["MAC"] = WiFi.macAddress(); node["IPv4 address"] = uuid::printable_to_string(WiFi.localIP()) + "/" + uuid::printable_to_string(WiFi.subnetMask()); node["IPv4 gateway"] = uuid::printable_to_string(WiFi.gatewayIP()); node["IPv4 nameserver"] = uuid::printable_to_string(WiFi.dnsIP()); @@ -1057,18 +1044,111 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp if (ETH.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000") { node["IPv6 address"] = uuid::printable_to_string(ETH.localIPv6()); } + EMSESP::webSettingsService.read([&](WebSettings & settings) { + node["phy type"] = settings.phy_type; + node["eth power"] = settings.eth_power; + node["eth phy addr"] = settings.eth_phy_addr; + node["eth clock mode"] = settings.eth_clock_mode; + }); + } +#endif + EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & settings) { + node["static ip config"] = settings.staticIPConfig; + node["enable IPv6"] = settings.enableIPv6; + node["low bandwidth"] = settings.bandwidth20; + node["disable sleep"] = settings.nosleep; + }); + EMSESP::esp8266React.getAPSettingsService()->read([&](APSettings & settings) { + const char * pM[] = {"always", "disconnected", "never"}; + node["AP provision mode"] = pM[settings.provisionMode]; + node["AP security"] = settings.password.length() ? "wpa2" : "open"; + node["AP ssid"] = settings.ssid; + }); + + // NTP status + node = output.createNestedObject("NTP Status"); + node["network time"] = EMSESP::system_.ntp_connected() ? "connected" : "disconnected"; + EMSESP::esp8266React.getNTPSettingsService()->read([&](NTPSettings & settings) { + node["enabled"] = settings.enabled; + node["server"] = settings.server; + node["tz label"] = settings.tzLabel; + // node["tz format"] = settings.tzFormat; + }); + + // OTA status + node = output.createNestedObject("OTA Status"); + EMSESP::esp8266React.getOTASettingsService()->read([&](OTASettings & settings) { + node["enabled"] = settings.enabled; + node["port"] = settings.port; + }); + + // MQTT Status + node = output.createNestedObject("MQTT Status"); + node["MQTT status"] = Mqtt::connected() ? F_(connected) : F_(disconnected); + if (Mqtt::enabled()) { + node["MQTT publishes"] = Mqtt::publish_count(); + node["MQTT publish fails"] = Mqtt::publish_fails(); + } + EMSESP::esp8266React.getMqttSettingsService()->read([&](MqttSettings & settings) { + node["enabled"] = settings.enabled; + node["client_id"] = settings.clientId; + node["keep alive"] = settings.keepAlive; + node["clean session"] = settings.cleanSession; + node["base"] = settings.base; + node["discovery prefix"] = settings.discovery_prefix; + node["nested format"] = settings.nested_format; + node["ha enabled"] = settings.ha_enabled; + node["mqtt qos"] = settings.mqtt_qos; + node["mqtt retain"] = settings.mqtt_retain; + node["publish time boiler"] = settings.publish_time_boiler; + node["publish time thermostat"] = settings.publish_time_thermostat; + node["publish time solar"] = settings.publish_time_solar; + node["publish time mixer"] = settings.publish_time_mixer; + node["publish time other"] = settings.publish_time_other; + node["publish time sensor"] = settings.publish_time_sensor; + node["publish single"] = settings.publish_single; + node["publish2command"] = settings.publish_single2cmd; + node["send response"] = settings.send_response; + }); + + // Syslog Status + node = output.createNestedObject("Syslog Status"); + node["enabled"] = EMSESP::system_.syslog_enabled_; +#ifndef EMSESP_STANDALONE + if (EMSESP::system_.syslog_enabled_) { + node["syslog started"] = syslog_.started(); + node["syslog level"] = FL_(enum_syslog_level)[syslog_.log_level() + 1]; + node["syslog ip"] = syslog_.ip(); + node["syslog queue"] = syslog_.queued(); } #endif - // Status - node = output.createNestedObject("Status"); + // Sensor Status + node = output.createNestedObject("Sensor Status"); + if (EMSESP::dallas_enabled()) { + node["temperature sensors"] = EMSESP::dallassensor_.no_sensors(); + node["temperature sensor reads"] = EMSESP::dallassensor_.reads(); + node["temperature sensor fails"] = EMSESP::dallassensor_.fails(); + } + if (EMSESP::analog_enabled()) { + node["analog sensors"] = EMSESP::analogsensor_.no_sensors(); + node["analog sensor reads"] = EMSESP::analogsensor_.reads(); + node["analog sensor fails"] = EMSESP::analogsensor_.fails(); + } + // API Status + node = output.createNestedObject("API Status"); + node["API calls"] = WebAPIService::api_count(); + node["API fails"] = WebAPIService::api_fails(); + + // EMS Bus Status + node = output.createNestedObject("Bus Status"); switch (EMSESP::bus_status()) { case EMSESP::BUS_STATUS_OFFLINE: node["bus status"] = (F("disconnected")); break; case EMSESP::BUS_STATUS_TX_ERRORS: - node["bus status"] = (F("connected, tx issues - try a different tx-mode")); + node["bus status"] = (F("connected, tx issues - try a different Tx Mode")); break; case EMSESP::BUS_STATUS_CONNECTED: node["bus status"] = (F("connected")); @@ -1077,7 +1157,6 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["bus status"] = (F("unknown")); break; } - if (EMSESP::bus_status() != EMSESP::BUS_STATUS_OFFLINE) { node["bus protocol"] = EMSbus::is_ht3() ? F("HT3") : F("Buderus"); node["bus telegrams received (rx)"] = EMSESP::rxservice_.telegram_count(); @@ -1088,34 +1167,37 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["bus writes failed"] = EMSESP::txservice_.telegram_write_fail_count(); node["bus rx line quality"] = EMSESP::rxservice_.quality(); node["bus tx line quality"] = (EMSESP::txservice_.read_quality() + EMSESP::txservice_.read_quality()) / 2; - if (Mqtt::enabled()) { - node["MQTT status"] = Mqtt::connected() ? F_(connected) : F_(disconnected); - node["MQTT publishes"] = Mqtt::publish_count(); - node["MQTT publish fails"] = Mqtt::publish_fails(); - } - node["temperature sensors"] = EMSESP::dallassensor_.no_sensors(); - if (EMSESP::dallas_enabled()) { - node["temperature sensor reads"] = EMSESP::dallassensor_.reads(); - node["temperature sensor fails"] = EMSESP::dallassensor_.fails(); - } - node["analog sensors"] = EMSESP::analogsensor_.no_sensors(); - if (EMSESP::analog_enabled()) { - node["analog sensor reads"] = EMSESP::analogsensor_.reads(); - node["analog sensor fails"] = EMSESP::analogsensor_.fails(); - } - node["API calls"] = WebAPIService::api_count(); - node["API fails"] = WebAPIService::api_fails(); - -#ifndef EMSESP_STANDALONE - if (EMSESP::system_.syslog_enabled_) { - node["syslog started"] = syslog_.started(); - node["syslog level"] = FL_(enum_syslog_level)[syslog_.log_level() + 1]; - node["syslog ip"] = syslog_.ip(); - node["syslog queue"] = syslog_.queued(); - } -#endif } + // Settings + node = output.createNestedObject("Settings"); + EMSESP::webSettingsService.read([&](WebSettings & settings) { + node["board profile"] = settings.board_profile; + node["tx mode"] = settings.tx_mode; + node["ems bus id"] = settings.ems_bus_id; + node["shower timer"] = settings.shower_timer; + node["shower alert"] = settings.shower_alert; + if (settings.shower_alert) { + node["shower alert coldshot"] = settings.shower_alert_coldshot; // seconds + node["shower alert trigger"] = settings.shower_alert_trigger; // minutes + } + node["rx gpio"] = settings.rx_gpio; + node["tx gpio"] = settings.tx_gpio; + node["dallas gpio"] = settings.dallas_gpio; + node["pbutton gpio"] = settings.pbutton_gpio; + node["led gpio"] = settings.led_gpio; + node["hide led"] = settings.hide_led; + node["notoken api"] = settings.notoken_api; + node["readonly mode"] = settings.readonly_mode; + node["fahrenheit"] = settings.fahrenheit; + node["dallas parasite"] = settings.dallas_parasite; + node["bool format"] = settings.bool_format; + node["bool dashboard"] = settings.bool_dashboard; + node["enum format"] = settings.enum_format; + node["analog enabled"] = settings.analog_enabled; + node["telnet enabled"] = settings.telnet_enabled; + }); + // Devices - show EMS devices JsonArray devices = output.createNestedArray("Devices"); for (const auto & device_class : EMSFactory::device_handlers()) { From 8b521aa572930d57ba530311953d1ef3c4da9561 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 8 May 2022 15:01:04 +0200 Subject: [PATCH 292/319] fix standalone compiling --- src/system.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index 05c6cf911..48ab46c97 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1017,7 +1017,6 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp #endif node["reset reason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1); - #ifndef EMSESP_STANDALONE // Network Status node = output.createNestedObject("Network Status"); @@ -1058,15 +1057,18 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["low bandwidth"] = settings.bandwidth20; node["disable sleep"] = settings.nosleep; }); +#ifndef EMSESP_STANDALONE EMSESP::esp8266React.getAPSettingsService()->read([&](APSettings & settings) { const char * pM[] = {"always", "disconnected", "never"}; node["AP provision mode"] = pM[settings.provisionMode]; node["AP security"] = settings.password.length() ? "wpa2" : "open"; node["AP ssid"] = settings.ssid; }); +#endif // NTP status - node = output.createNestedObject("NTP Status"); + node = output.createNestedObject("NTP Status"); +#ifndef EMSESP_STANDALONE node["network time"] = EMSESP::system_.ntp_connected() ? "connected" : "disconnected"; EMSESP::esp8266React.getNTPSettingsService()->read([&](NTPSettings & settings) { node["enabled"] = settings.enabled; @@ -1081,6 +1083,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["enabled"] = settings.enabled; node["port"] = settings.port; }); +#endif // MQTT Status node = output.createNestedObject("MQTT Status"); From 0e9202ae4d5600c26bfe89ce4f8bca737ea6ea5b Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 8 May 2022 17:01:38 +0200 Subject: [PATCH 293/319] change to saving customization file after upload --- src/system.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/system.cpp b/src/system.cpp index 48ab46c97..44eb94b31 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -916,7 +916,6 @@ bool System::check_upgrade() { } else if (settings_type == "customizations") { // it's a customization file, just replace it and there's no need to reboot saveSettings(EMSESP_CUSTOMIZATION_FILE, "Customizations", input); - return false; // no reboot required } else { LOG_ERROR(F("Unrecognized file uploaded")); } From db8c30ddbb9db0f13109412ccea5582368bea76d Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 8 May 2022 17:02:38 +0200 Subject: [PATCH 294/319] fix for customizations after upload new file --- src/system.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/system.cpp b/src/system.cpp index 48ab46c97..44eb94b31 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -916,7 +916,6 @@ bool System::check_upgrade() { } else if (settings_type == "customizations") { // it's a customization file, just replace it and there's no need to reboot saveSettings(EMSESP_CUSTOMIZATION_FILE, "Customizations", input); - return false; // no reboot required } else { LOG_ERROR(F("Unrecognized file uploaded")); } From 226a557d5ccc2f972ad8b796ad561f5c7b64dd7d Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 8 May 2022 20:13:48 +0200 Subject: [PATCH 295/319] prevent build failing --- interface/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/package.json b/interface/package.json index 413709d0b..f278f7a4d 100644 --- a/interface/package.json +++ b/interface/package.json @@ -78,7 +78,7 @@ "max-len": [ 1, { - "code": 150 + "code": 200 } ], "arrow-parens": 1 From 1863e57f5b8c6f5763a677cd85b70f3e0770fe25 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 12 May 2022 18:21:30 +0200 Subject: [PATCH 296/319] fix #496, RC30 design temp --- src/devices/thermostat.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index f2dc222a4..b4567d49a 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1246,7 +1246,8 @@ void Thermostat::process_RC35Set(std::shared_ptr telegram) { has_update(telegram, hc->vacreducemode, 41); // vacations reduce mode has_update(telegram, hc->minflowtemp, 16); - if (hc->heatingtype == 3) { // floor heating + // RC35 stores values for floorheating in different position + if (hc->heatingtype == 3 && model() == EMS_DEVICE_FLAG_RC35) { has_update(telegram, hc->designtemp, 36); // is * 1 has_update(telegram, hc->maxflowtemp, 35); // is * 1 } else { // radiator/convector From f3e99f909276fc84f377585bfa649ea62dd5b96a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 15 May 2022 08:58:28 +0200 Subject: [PATCH 297/319] Add HM200 hybrid manager as heatpump --- src/device_library.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/device_library.h b/src/device_library.h index 726972c5f..21fd47917 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -130,6 +130,7 @@ // Heat Pumps - 0x38 {200, DeviceType::HEATPUMP, F("HP Module"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{248, DeviceType::HEATPUMP, F("Hybrid Manager HM200"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, {252, DeviceType::HEATPUMP, F("HP Module"), DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Connect devices - 0x02 From ae9af3bf0b6963060f5884100c22101d040c2c81 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 16 May 2022 21:29:39 +0200 Subject: [PATCH 298/319] update packages --- interface/package-lock.json | 222 ++++++++++++++++++------------------ interface/package.json | 8 +- 2 files changed, 115 insertions(+), 115 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 77fea275b..b3f7cc0b5 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -12,10 +12,10 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.4", - "@table-library/react-table-library": "^3.1.0", + "@mui/material": "^5.7.0", + "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.31", + "@types/node": "^17.0.33", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -24,7 +24,7 @@ "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", - "notistack": "^2.0.4", + "notistack": "^2.0.5", "parse-ms": "^3.0.0", "react": "^17.0.2", "react-app-rewired": "^2.2.1", @@ -2856,17 +2856,18 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.79", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.79.tgz", - "integrity": "sha512-/lZLF027BkiEjM8MIYoeS/FEhTKf+41ePU9SOijMGrCin1Y0Igucw+IHa1fF8HXD7wDbFKqHuso3J1jMG8wyNw==", + "version": "5.0.0-alpha.80", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.80.tgz", + "integrity": "sha512-sPSYwJzwNMaqpksdLuOhpQQLrhtpBH4sNnMSgkzJzo7Jo4HF9ivjNpq27Zh5+sdRe5MTt0gcBT0QSMO6zML1Aw==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", + "@mui/private-classnames": "^5.7.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.1", + "@mui/utils": "^5.7.0", "@popperjs/core": "^2.11.5", "clsx": "^1.1.1", - "prop-types": "^15.7.2", + "prop-types": "^15.8.1", "react-is": "^17.0.2" }, "engines": { @@ -2913,20 +2914,21 @@ } }, "node_modules/@mui/material": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.4.tgz", - "integrity": "sha512-7TD+u/SExZK2a55w6reX56oPk37gKr/M/XGt156X+m0d9LhzOsW864nkErIX/H8oSkX/6kCimxu1FDsO+gjiVw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.7.0.tgz", + "integrity": "sha512-s1TSuUK5upNzGY5ZFHfJyzEt9fijn4cE+kEdEq7jGF+vpZIYXsDooH07+dNJ9+cJjYo6f9Fq1q5fPkknRC2Trw==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.79", - "@mui/system": "^5.6.4", + "@mui/base": "5.0.0-alpha.80", + "@mui/private-classnames": "^5.7.0", + "@mui/system": "^5.7.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.1", + "@mui/utils": "^5.7.0", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", "hoist-non-react-statics": "^3.3.2", - "prop-types": "^15.7.2", + "prop-types": "^15.8.1", "react-is": "^17.0.2", "react-transition-group": "^4.4.2" }, @@ -2956,14 +2958,26 @@ } } }, + "node_modules/@mui/private-classnames": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/private-classnames/-/private-classnames-5.7.0.tgz", + "integrity": "sha512-OSB4ybzpYiS11rQ3VtbcJz/CS19lC0r0Hk14iRZwPtVgapnL1hKsGtmgRviZLxpLk/cZUKaxaJDuuzI/extCoA==", + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, "node_modules/@mui/private-theming": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.2.tgz", - "integrity": "sha512-IbrSfFXfiZdyhRMC2bgGTFtb16RBQ5mccmjeh3MtAERWuepiCK7gkW5D9WhEsfTu6iez+TEjeUKSgmMHlsM2mg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.7.0.tgz", + "integrity": "sha512-r/6JAWAHV1IFASZnceJPe9QT/s12ia/okGbmCUO4MEPdsWcNKye1RVKSwVgLATaX3YwPxDljWguIQrM3R2gZNA==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.6.1", - "prop-types": "^15.7.2" + "@mui/utils": "^5.7.0", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" @@ -2983,13 +2997,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.1.tgz", - "integrity": "sha512-jEhH6TBY8jc9S8yVncXmoTYTbATjEu44RMFXj6sIYfKr5NArVwTwRo3JexLL0t3BOAiYM4xsFLgfKEIvB9SAeQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.7.0.tgz", + "integrity": "sha512-JTvp+6lbAXYqgf/YInwR+hd4F8Fhg5PxMBwKTFsdKbaZFvyBD95hzKcxRmO9Y/NdjwFYWm5bBhcZAT4r2g1kZA==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", - "prop-types": "^15.7.2" + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" @@ -3013,18 +3027,18 @@ } }, "node_modules/@mui/system": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.4.tgz", - "integrity": "sha512-7rsWED1wMFMePySJobsBerFZNu7ga580QSi3Zd6sJR8nVj12qD3yIdfvxA70/PxJ/805KbIT0GX7edKI+hpyhA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.7.0.tgz", + "integrity": "sha512-M0vemfcfaRQzqLUmVRIsAVb0rx2ULHisHED6njoJqtjH58gbVb497mH+K1vI+Lh29fKR6Ki2mx3egxVi7mUn9w==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.6.2", - "@mui/styled-engine": "^5.6.1", + "@mui/private-theming": "^5.7.0", + "@mui/styled-engine": "^5.7.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.1", + "@mui/utils": "^5.7.0", "clsx": "^1.1.1", "csstype": "^3.0.11", - "prop-types": "^15.7.2" + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" @@ -3065,14 +3079,14 @@ } }, "node_modules/@mui/utils": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.1.tgz", - "integrity": "sha512-CPrzrkiBusCZBLWu0Sg5MJvR3fKJyK3gKecLVX012LULyqg2U64Oz04BKhfkbtBrPBbSQxM+DWW9B1c9hmV9nQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.7.0.tgz", + "integrity": "sha512-uWpDIEXl7bWYkJwKQQ4Rdhc2dcotVETRYuLy29V6qLYZyAbs7AMKwDDz0XKy3RMNmU7S2R/jEeSb9xjXscQUHQ==", "dependencies": { "@babel/runtime": "^7.17.2", - "@types/prop-types": "^15.7.4", + "@types/prop-types": "^15.7.5", "@types/react-is": "^16.7.1 || ^17.0.0", - "prop-types": "^15.7.2", + "prop-types": "^15.8.1", "react-is": "^17.0.2" }, "engines": { @@ -3549,14 +3563,13 @@ } }, "node_modules/@table-library/react-table-library": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-3.1.0.tgz", - "integrity": "sha512-YCWmLPdElk/4+VPSxDcgQXlJx+jxYH2xJwr8NXm9e1AEy17K8mtrjzD5SQXDOiVT8vSOzD21eEldfIaI/kooHA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-3.1.2.tgz", + "integrity": "sha512-zfjIvcEP114KFh5WyZzbPQHtaxiSr0LHHgm+A8El6YG/SQ7D+i88RUdwiBu3uuKXTY7OV+5v/GESEiioZo150w==", "dependencies": { "clsx": "1.1.1", "react-virtualized-auto-sizer": "1.0.6", - "react-window": "1.8.6", - "use-double-click": "1.0.5" + "react-window": "1.8.6" }, "peerDependencies": { "@emotion/react": ">= 11", @@ -3763,9 +3776,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz", - "integrity": "sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q==" + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.33.tgz", + "integrity": "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -12150,9 +12163,9 @@ } }, "node_modules/notistack": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.4.tgz", - "integrity": "sha512-kOJmKvTG91ElMzi4aHu82BDe1liQ0zMrBp+TnWJptgowDsTbeTKbZmsRqJNIj145BmlOtZsEE9xjcrN46zVo3w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.5.tgz", + "integrity": "sha512-Ig2T1Muqkc1PaSQcEDrK7diKv6cBxw02Iq6uv074ySfgq524TV5lK41diAb6OSsaiWfp3aRt+T3+0MF8m2EcJQ==", "dependencies": { "clsx": "^1.1.0", "hoist-non-react-statics": "^3.3.0" @@ -16609,19 +16622,6 @@ "node": ">=4" } }, - "node_modules/use-double-click": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/use-double-click/-/use-double-click-1.0.5.tgz", - "integrity": "sha512-71LUca6NtzpzHYlcfM/dOdmwvmvpMbzeIVQpN87w+DctpLiMCXtZpsN8FNWPgHpPBtNhvucPUHIDh5al8D8C7w==", - "engines": { - "node": ">=8", - "npm": ">=5" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -19569,17 +19569,18 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.79", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.79.tgz", - "integrity": "sha512-/lZLF027BkiEjM8MIYoeS/FEhTKf+41ePU9SOijMGrCin1Y0Igucw+IHa1fF8HXD7wDbFKqHuso3J1jMG8wyNw==", + "version": "5.0.0-alpha.80", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.80.tgz", + "integrity": "sha512-sPSYwJzwNMaqpksdLuOhpQQLrhtpBH4sNnMSgkzJzo7Jo4HF9ivjNpq27Zh5+sdRe5MTt0gcBT0QSMO6zML1Aw==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", + "@mui/private-classnames": "^5.7.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.1", + "@mui/utils": "^5.7.0", "@popperjs/core": "^2.11.5", "clsx": "^1.1.1", - "prop-types": "^15.7.2", + "prop-types": "^15.8.1", "react-is": "^17.0.2" } }, @@ -19592,57 +19593,63 @@ } }, "@mui/material": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.6.4.tgz", - "integrity": "sha512-7TD+u/SExZK2a55w6reX56oPk37gKr/M/XGt156X+m0d9LhzOsW864nkErIX/H8oSkX/6kCimxu1FDsO+gjiVw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.7.0.tgz", + "integrity": "sha512-s1TSuUK5upNzGY5ZFHfJyzEt9fijn4cE+kEdEq7jGF+vpZIYXsDooH07+dNJ9+cJjYo6f9Fq1q5fPkknRC2Trw==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.79", - "@mui/system": "^5.6.4", + "@mui/base": "5.0.0-alpha.80", + "@mui/private-classnames": "^5.7.0", + "@mui/system": "^5.7.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.1", + "@mui/utils": "^5.7.0", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", "hoist-non-react-statics": "^3.3.2", - "prop-types": "^15.7.2", + "prop-types": "^15.8.1", "react-is": "^17.0.2", "react-transition-group": "^4.4.2" } }, + "@mui/private-classnames": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/private-classnames/-/private-classnames-5.7.0.tgz", + "integrity": "sha512-OSB4ybzpYiS11rQ3VtbcJz/CS19lC0r0Hk14iRZwPtVgapnL1hKsGtmgRviZLxpLk/cZUKaxaJDuuzI/extCoA==" + }, "@mui/private-theming": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.2.tgz", - "integrity": "sha512-IbrSfFXfiZdyhRMC2bgGTFtb16RBQ5mccmjeh3MtAERWuepiCK7gkW5D9WhEsfTu6iez+TEjeUKSgmMHlsM2mg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.7.0.tgz", + "integrity": "sha512-r/6JAWAHV1IFASZnceJPe9QT/s12ia/okGbmCUO4MEPdsWcNKye1RVKSwVgLATaX3YwPxDljWguIQrM3R2gZNA==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.6.1", - "prop-types": "^15.7.2" + "@mui/utils": "^5.7.0", + "prop-types": "^15.8.1" } }, "@mui/styled-engine": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.1.tgz", - "integrity": "sha512-jEhH6TBY8jc9S8yVncXmoTYTbATjEu44RMFXj6sIYfKr5NArVwTwRo3JexLL0t3BOAiYM4xsFLgfKEIvB9SAeQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.7.0.tgz", + "integrity": "sha512-JTvp+6lbAXYqgf/YInwR+hd4F8Fhg5PxMBwKTFsdKbaZFvyBD95hzKcxRmO9Y/NdjwFYWm5bBhcZAT4r2g1kZA==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", - "prop-types": "^15.7.2" + "prop-types": "^15.8.1" } }, "@mui/system": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.4.tgz", - "integrity": "sha512-7rsWED1wMFMePySJobsBerFZNu7ga580QSi3Zd6sJR8nVj12qD3yIdfvxA70/PxJ/805KbIT0GX7edKI+hpyhA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.7.0.tgz", + "integrity": "sha512-M0vemfcfaRQzqLUmVRIsAVb0rx2ULHisHED6njoJqtjH58gbVb497mH+K1vI+Lh29fKR6Ki2mx3egxVi7mUn9w==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.6.2", - "@mui/styled-engine": "^5.6.1", + "@mui/private-theming": "^5.7.0", + "@mui/styled-engine": "^5.7.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.1", + "@mui/utils": "^5.7.0", "clsx": "^1.1.1", "csstype": "^3.0.11", - "prop-types": "^15.7.2" + "prop-types": "^15.8.1" } }, "@mui/types": { @@ -19652,14 +19659,14 @@ "requires": {} }, "@mui/utils": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.1.tgz", - "integrity": "sha512-CPrzrkiBusCZBLWu0Sg5MJvR3fKJyK3gKecLVX012LULyqg2U64Oz04BKhfkbtBrPBbSQxM+DWW9B1c9hmV9nQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.7.0.tgz", + "integrity": "sha512-uWpDIEXl7bWYkJwKQQ4Rdhc2dcotVETRYuLy29V6qLYZyAbs7AMKwDDz0XKy3RMNmU7S2R/jEeSb9xjXscQUHQ==", "requires": { "@babel/runtime": "^7.17.2", - "@types/prop-types": "^15.7.4", + "@types/prop-types": "^15.7.5", "@types/react-is": "^16.7.1 || ^17.0.0", - "prop-types": "^15.7.2", + "prop-types": "^15.8.1", "react-is": "^17.0.2" } }, @@ -19947,14 +19954,13 @@ } }, "@table-library/react-table-library": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-3.1.0.tgz", - "integrity": "sha512-YCWmLPdElk/4+VPSxDcgQXlJx+jxYH2xJwr8NXm9e1AEy17K8mtrjzD5SQXDOiVT8vSOzD21eEldfIaI/kooHA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-3.1.2.tgz", + "integrity": "sha512-zfjIvcEP114KFh5WyZzbPQHtaxiSr0LHHgm+A8El6YG/SQ7D+i88RUdwiBu3uuKXTY7OV+5v/GESEiioZo150w==", "requires": { "clsx": "1.1.1", "react-virtualized-auto-sizer": "1.0.6", - "react-window": "1.8.6", - "use-double-click": "1.0.5" + "react-window": "1.8.6" } }, "@tootallnate/once": { @@ -20150,9 +20156,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz", - "integrity": "sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q==" + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.33.tgz", + "integrity": "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ==" }, "@types/parse-json": { "version": "4.0.0", @@ -26292,9 +26298,9 @@ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "notistack": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.4.tgz", - "integrity": "sha512-kOJmKvTG91ElMzi4aHu82BDe1liQ0zMrBp+TnWJptgowDsTbeTKbZmsRqJNIj145BmlOtZsEE9xjcrN46zVo3w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.5.tgz", + "integrity": "sha512-Ig2T1Muqkc1PaSQcEDrK7diKv6cBxw02Iq6uv074ySfgq524TV5lK41diAb6OSsaiWfp3aRt+T3+0MF8m2EcJQ==", "requires": { "clsx": "^1.1.0", "hoist-non-react-statics": "^3.3.0" @@ -29412,12 +29418,6 @@ "prepend-http": "^2.0.0" } }, - "use-double-click": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/use-double-click/-/use-double-click-1.0.5.tgz", - "integrity": "sha512-71LUca6NtzpzHYlcfM/dOdmwvmvpMbzeIVQpN87w+DctpLiMCXtZpsN8FNWPgHpPBtNhvucPUHIDh5al8D8C7w==", - "requires": {} - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/interface/package.json b/interface/package.json index f278f7a4d..82f9d9f25 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,10 +8,10 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.4", - "@table-library/react-table-library": "^3.1.0", + "@mui/material": "^5.7.0", + "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.31", + "@types/node": "^17.0.33", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -20,7 +20,7 @@ "http-proxy-middleware": "^2.0.6", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", - "notistack": "^2.0.4", + "notistack": "^2.0.5", "parse-ms": "^3.0.0", "react": "^17.0.2", "react-app-rewired": "^2.2.1", From fc29a3ad955f21b004e40ced8d672116e5611807 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 16 May 2022 21:30:06 +0200 Subject: [PATCH 299/319] replace api/settings and customizatons with secure REST calls #501 --- interface/src/api/system.ts | 1 + interface/src/project/HelpInformation.tsx | 63 +++++++++++++++++------ interface/src/project/api.ts | 8 +++ mock-api/server.js | 17 +++--- src/system.cpp | 30 ----------- src/system.h | 2 - src/version.h | 2 +- src/web/WebAPIService.cpp | 39 ++++++++++++++ src/web/WebAPIService.h | 5 ++ 9 files changed, 110 insertions(+), 57 deletions(-) diff --git a/interface/src/api/system.ts b/interface/src/api/system.ts index f93ff4853..a48158840 100644 --- a/interface/src/api/system.ts +++ b/interface/src/api/system.ts @@ -38,3 +38,4 @@ export function updateLogSettings(logSettings: LogSettings): AxiosPromise { return AXIOS_BIN.get('/fetchLog'); } + diff --git a/interface/src/project/HelpInformation.tsx b/interface/src/project/HelpInformation.tsx index 16a27dbe4..1d28946ac 100644 --- a/interface/src/project/HelpInformation.tsx +++ b/interface/src/project/HelpInformation.tsx @@ -24,7 +24,22 @@ const HelpInformation: FC = () => { const { me } = useContext(AuthenticatedContext); - const onDownload = async (endpoint: string) => { + const saveFile = (json: any, endpoint: string) => { + const a = document.createElement('a'); + const filename = 'emsesp_' + endpoint + '.json'; + a.href = URL.createObjectURL( + new Blob([JSON.stringify(json, null, 2)], { + type: 'text/plain' + }) + ); + a.setAttribute('download', filename); + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + enqueueSnackbar('File downloaded', { variant: 'info' }); + }; + + const callAPI = async (endpoint: string) => { try { const response = await EMSESP.API({ device: 'system', @@ -34,19 +49,33 @@ const HelpInformation: FC = () => { if (response.status !== 200) { enqueueSnackbar('API call failed', { variant: 'error' }); } else { - const json = response.data; - const a = document.createElement('a'); - const filename = 'emsesp_' + endpoint + '.json'; - a.href = URL.createObjectURL( - new Blob([JSON.stringify(json, null, 2)], { - type: 'text/plain' - }) - ); - a.setAttribute('download', filename); - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - enqueueSnackbar('File downloaded', { variant: 'info' }); + saveFile(response.data, endpoint); + } + } catch (error: unknown) { + enqueueSnackbar(extractErrorMessage(error, 'Problem with downloading'), { variant: 'error' }); + } + }; + + const downloadSettings = async () => { + try { + const response = await EMSESP.getSettings(); + if (response.status !== 200) { + enqueueSnackbar('Unable to get settings', { variant: 'error' }); + } else { + saveFile(response.data, 'settings'); + } + } catch (error: unknown) { + enqueueSnackbar(extractErrorMessage(error, 'Problem with downloading'), { variant: 'error' }); + } + }; + + const downloadCustomizations = async () => { + try { + const response = await EMSESP.getCustomizations(); + if (response.status !== 200) { + enqueueSnackbar('Unable to get customizations', { variant: 'error' }); + } else { + saveFile(response.data, 'customizations'); } } catch (error: unknown) { enqueueSnackbar(extractErrorMessage(error, 'Problem with downloading'), { variant: 'error' }); @@ -103,7 +132,7 @@ const HelpInformation: FC = () => { To report an issue or request a feature, please  - onDownload('info')}> + callAPI('info')}> download  the debug information and include in a new  @@ -131,7 +160,7 @@ const HelpInformation: FC = () => { startIcon={} variant="outlined" color="primary" - onClick={() => onDownload('settings')} + onClick={() => downloadSettings()} > settings @@ -139,7 +168,7 @@ const HelpInformation: FC = () => { startIcon={} variant="outlined" color="primary" - onClick={() => onDownload('customizations')} + onClick={() => downloadCustomizations()} > customizations diff --git a/interface/src/project/api.ts b/interface/src/project/api.ts index c625630c5..d6804cda4 100644 --- a/interface/src/project/api.ts +++ b/interface/src/project/api.ts @@ -86,3 +86,11 @@ export function resetCustomizations(): AxiosPromise { export function API(apiCall: APIcall): AxiosPromise { return AXIOS_API.post('/', apiCall); } + +export function getSettings(): AxiosPromise { + return AXIOS.get('/getSettings'); +} + +export function getCustomizations(): AxiosPromise { + return AXIOS.get('/getCustomizations'); +} diff --git a/mock-api/server.js b/mock-api/server.js index 33764ab66..d6bc9fefc 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -1193,16 +1193,19 @@ rest_server.get(SYSTEM_INFO_ENDPOINT, (req, res) => { res.json(emsesp_info) }) -const SYSTEM_SETTINGS_ENDPOINT = API_ENDPOINT_ROOT + 'system/settings' -rest_server.post(SYSTEM_SETTINGS_ENDPOINT, (req, res) => { - console.log('System Settings POST: ' + JSON.stringify(req.body)) - res.sendStatus(200) -}) -rest_server.get(SYSTEM_SETTINGS_ENDPOINT, (req, res) => { - console.log('System Settings GET') +const GET_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'getSettings' +rest_server.get(GET_SETTINGS_ENDPOINT, (req, res) => { + console.log('System Settings:') res.json(settings) }) +const GET_CUSTOMIZATIONS_ENDPOINT = REST_ENDPOINT_ROOT + 'getCustomizations' +rest_server.get(GET_CUSTOMIZATIONS_ENDPOINT, (req, res) => { + console.log('Customizations:') + // not implemented yet + res.sendStatus(200) +}) + // start server const expressServer = rest_server.listen(port, () => console.log(`Mock server for EMS-ESP is up and running at http://localhost:${port}`), diff --git a/src/system.cpp b/src/system.cpp index 44eb94b31..cb3be0332 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -689,8 +689,6 @@ void System::commands_init() { // these commands will return data in JSON format Command::add(EMSdevice::DeviceType::SYSTEM, F_(info), System::command_info, F("show system status")); - Command::add(EMSdevice::DeviceType::SYSTEM, F_(settings), System::command_settings, F("fetch system settings"), CommandFlag::ADMIN_ONLY); - Command::add(EMSdevice::DeviceType::SYSTEM, F_(customizations), System::command_customizations, F("fetch system customizations")); Command::add(EMSdevice::DeviceType::SYSTEM, F_(commands), System::command_commands, F("fetch system commands")); #if defined(EMSESP_DEBUG) @@ -973,34 +971,6 @@ bool System::saveSettings(const char * filename, const char * section, JsonObjec return false; // not found } -// export all settings to JSON text -// we need to keep the original format so the import/upload works as we just replace files -// http://ems-esp/api/system/settings -bool System::command_settings(const char * value, const int8_t id, JsonObject & output) { - output["type"] = "settings"; - - JsonObject node = output.createNestedObject("System"); - node["version"] = EMSESP_APP_VERSION; - - extractSettings(NETWORK_SETTINGS_FILE, "Network", output); - extractSettings(AP_SETTINGS_FILE, "AP", output); - extractSettings(MQTT_SETTINGS_FILE, "MQTT", output); - extractSettings(NTP_SETTINGS_FILE, "NTP", output); - extractSettings(OTA_SETTINGS_FILE, "OTA", output); - extractSettings(SECURITY_SETTINGS_FILE, "Security", output); - extractSettings(EMSESP_SETTINGS_FILE, "Settings", output); - - return true; -} - -// http://ems-esp/api/system/customizations -// we need to keep the original format so the import/upload works as we just replace file -bool System::command_customizations(const char * value, const int8_t id, JsonObject & output) { - output["type"] = "customizations"; - extractSettings(EMSESP_CUSTOMIZATION_FILE, "Customizations", output); - return true; -} - // export status information including the device information // http://ems-esp/api/system/info bool System::command_info(const char * value, const int8_t id, JsonObject & output) { diff --git a/src/system.h b/src/system.h index 63010652b..2d1796f83 100644 --- a/src/system.h +++ b/src/system.h @@ -61,8 +61,6 @@ class System { static bool command_watch(const char * value, const int8_t id); static bool command_info(const char * value, const int8_t id, JsonObject & output); - static bool command_settings(const char * value, const int8_t id, JsonObject & output); - static bool command_customizations(const char * value, const int8_t id, JsonObject & output); static bool command_commands(const char * value, const int8_t id, JsonObject & output); std::string reset_reason(uint8_t cpu) const; diff --git a/src/version.h b/src/version.h index c77300d6d..93db4995f 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b17" +#define EMSESP_APP_VERSION "3.4.0b18" diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index c79e04ca5..5ab041987 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -32,6 +32,12 @@ WebAPIService::WebAPIService(AsyncWebServer * server, SecurityManager * security , _apiHandler("/api", std::bind(&WebAPIService::webAPIService_post, this, _1, _2), 256) { // for POSTS, must use 'Content-Type: application/json' in header server->on("/api", HTTP_GET, std::bind(&WebAPIService::webAPIService_get, this, _1)); // for GETS server->addHandler(&_apiHandler); + + // for settings + server->on(GET_SETTINGS_PATH, HTTP_GET, securityManager->wrapRequest(std::bind(&WebAPIService::getSettings, this, _1), AuthenticationPredicates::IS_ADMIN)); + server->on(GET_CUSTOMIZATIONS_PATH, + HTTP_GET, + securityManager->wrapRequest(std::bind(&WebAPIService::getCustomizations, this, _1), AuthenticationPredicates::IS_ADMIN)); } // HTTP GET @@ -150,4 +156,37 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) { #endif } +void WebAPIService::getSettings(AsyncWebServerRequest * request) { + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); + JsonObject root = response->getRoot(); + + root["type"] = "settings"; + + JsonObject node = root.createNestedObject("System"); + node["version"] = EMSESP_APP_VERSION; + + System::extractSettings(NETWORK_SETTINGS_FILE, "Network", root); + System::extractSettings(AP_SETTINGS_FILE, "AP", root); + System::extractSettings(MQTT_SETTINGS_FILE, "MQTT", root); + System::extractSettings(NTP_SETTINGS_FILE, "NTP", root); + System::extractSettings(OTA_SETTINGS_FILE, "OTA", root); + System::extractSettings(SECURITY_SETTINGS_FILE, "Security", root); + System::extractSettings(EMSESP_SETTINGS_FILE, "Settings", root); + + response->setLength(); + request->send(response); +} + +void WebAPIService::getCustomizations(AsyncWebServerRequest * request) { + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN); + JsonObject root = response->getRoot(); + + root["type"] = "customizations"; + + System::extractSettings(EMSESP_CUSTOMIZATION_FILE, "Customizations", root); + + response->setLength(); + request->send(response); +} + } // namespace emsesp diff --git a/src/web/WebAPIService.h b/src/web/WebAPIService.h index 799cc82fd..5e5d2321a 100644 --- a/src/web/WebAPIService.h +++ b/src/web/WebAPIService.h @@ -20,6 +20,8 @@ #define WebAPIService_h #define EMSESP_API_SERVICE_PATH "/api" +#define GET_SETTINGS_PATH "/rest/getSettings" +#define GET_CUSTOMIZATIONS_PATH "/rest/getCustomizations" namespace emsesp { @@ -46,6 +48,9 @@ class WebAPIService { static uint16_t api_fails_; void parse(AsyncWebServerRequest * request, JsonObject & input); + + void getSettings(AsyncWebServerRequest * request); + void getCustomizations(AsyncWebServerRequest * request); }; } // namespace emsesp From 6072606918b5bf0a05a1fface6d8cc3c516a2d4a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 17 May 2022 12:50:34 +0200 Subject: [PATCH 300/319] heatpump summer mode, fix #503 --- src/devices/thermostat.cpp | 17 +++++++++++------ src/devices/thermostat.h | 3 ++- src/locale_DE.h | 2 ++ src/locale_EN.h | 2 ++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index b4567d49a..c75d885e5 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -973,7 +973,7 @@ void Thermostat::process_RC300Summer(std::shared_ptr telegram) { has_update(telegram, hc->offsettemp, 2); if (!is_fetch(summer2_typeids[hc->hc()])) { has_update(telegram, hc->summertemp, 6); - has_update(telegram, hc->summer_setmode, 7); + has_update(telegram, hc->summersetmode, 7); } if (hc->heatingtype < 3) { @@ -993,7 +993,7 @@ void Thermostat::process_RC300Summer2(std::shared_ptr telegram) if (hc == nullptr) { return; } - has_update(telegram, hc->summer_setmode, 0); + has_update(telegram, hc->hpsummersetmode, 0); has_update(telegram, hc->summertemp, 1); } @@ -2348,13 +2348,16 @@ bool Thermostat::set_summermode(const char * value, const int8_t id) { } uint8_t set = 0xFF; - if (!Helpers::value2enum(value, set, FL_(enum_summermode))) { - return false; - } if (is_fetch(summer2_typeids[hc->hc()])) { + if (!Helpers::value2enum(value, set, FL_(enum_hpsummermode))) { + return false; + } write_command(summer2_typeids[hc->hc()], 0, set, summer2_typeids[hc->hc()]); } else { + if (!Helpers::value2enum(value, set, FL_(enum_summermode))) { + return false; + } write_command(summer_typeids[hc->hc()], 7, set, summer_typeids[hc->hc()]); } @@ -3831,7 +3834,9 @@ void Thermostat::register_device_values_hc(std::shared_ptrheatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value( - tag, &hc->summer_setmode, DeviceValueType::ENUM, FL_(enum_summermode), FL_(summersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); + tag, &hc->summersetmode, DeviceValueType::ENUM, FL_(enum_summermode), FL_(summersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); + register_device_value( + tag, &hc->hpsummersetmode, DeviceValueType::ENUM, FL_(enum_hpsummermode), FL_(hpsummersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); register_device_value( tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index a62a61050..e5d1a47f7 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -54,7 +54,8 @@ class Thermostat : public EMSdevice { uint8_t designtemp; // heating curve design temp at MinExtTemp int8_t offsettemp; // heating curve offest temp at roomtemp signed! uint8_t manualtemp; - uint8_t summer_setmode; + uint8_t summersetmode; + uint8_t hpsummersetmode; uint8_t roominfluence; uint8_t roominfl_factor; int16_t curroominfl; diff --git a/src/locale_DE.h b/src/locale_DE.h index 7a668d1c2..b0d93a781 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -364,6 +364,7 @@ MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto)) MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) +MAKE_PSTR_LIST(enum_hpsummermode, F_(off), F_(auto), F("heizen"), F("kühlen")) MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer)) MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310 @@ -649,6 +650,7 @@ MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("Frostschutztemperatur")) MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("berechnete Flusstemperatur")) MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("Heizungstyp")) MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("Einstellung Sommerbetrieb")) +MAKE_PSTR_LIST(hpsummersetmode, F("hpsummersetmode"), F("Wärmepumpe Sommerbetrieb")) MAKE_PSTR_LIST(controlmode, F("controlmode"), F("Kontrollmodus")) MAKE_PSTR_LIST(control, F("control"), F("Fernsteuerung")) MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 677a3e104..67d5063b7 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -364,6 +364,7 @@ MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto)) MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) +MAKE_PSTR_LIST(enum_hpsummermode, F_(off), F_(auto), F("heating"), F("cooling")) MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer)) MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310 @@ -638,6 +639,7 @@ MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("nofrost temperature")) MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("target flow temperature")) MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("heating type")) MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("set summer mode")) +MAKE_PSTR_LIST(hpsummersetmode, F("hpsummersetmode"), F("heatpump summer mode")) MAKE_PSTR_LIST(controlmode, F("controlmode"), F("control mode")) MAKE_PSTR_LIST(control, F("control"), F("control device")) MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates")) From e175b5a5a2508efd87ade091282640cb44ddedca Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 17 May 2022 20:53:22 +0200 Subject: [PATCH 301/319] heatpump summermode -> heatpump operatingsmode --- src/devices/thermostat.cpp | 6 +++--- src/devices/thermostat.h | 2 +- src/locale_DE.h | 4 ++-- src/locale_EN.h | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index c75d885e5..efd40b5ca 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -993,7 +993,7 @@ void Thermostat::process_RC300Summer2(std::shared_ptr telegram) if (hc == nullptr) { return; } - has_update(telegram, hc->hpsummersetmode, 0); + has_update(telegram, hc->hpoperatingmode, 0); has_update(telegram, hc->summertemp, 1); } @@ -2350,7 +2350,7 @@ bool Thermostat::set_summermode(const char * value, const int8_t id) { uint8_t set = 0xFF; if (is_fetch(summer2_typeids[hc->hc()])) { - if (!Helpers::value2enum(value, set, FL_(enum_hpsummermode))) { + if (!Helpers::value2enum(value, set, FL_(enum_hpoperatingmode))) { return false; } write_command(summer2_typeids[hc->hc()], 0, set, summer2_typeids[hc->hc()]); @@ -3836,7 +3836,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrsummersetmode, DeviceValueType::ENUM, FL_(enum_summermode), FL_(summersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); register_device_value( - tag, &hc->hpsummersetmode, DeviceValueType::ENUM, FL_(enum_hpsummermode), FL_(hpsummersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); + tag, &hc->hpoperatingmode, DeviceValueType::ENUM, FL_(enum_hpoperatingmode), FL_(hpoperatingmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); register_device_value( tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index e5d1a47f7..2fde27634 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -55,7 +55,7 @@ class Thermostat : public EMSdevice { int8_t offsettemp; // heating curve offest temp at roomtemp signed! uint8_t manualtemp; uint8_t summersetmode; - uint8_t hpsummersetmode; + uint8_t hpoperatingmode; uint8_t roominfluence; uint8_t roominfl_factor; int16_t curroominfl; diff --git a/src/locale_DE.h b/src/locale_DE.h index b0d93a781..a57e54abc 100644 --- a/src/locale_DE.h +++ b/src/locale_DE.h @@ -364,7 +364,7 @@ MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto)) MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) -MAKE_PSTR_LIST(enum_hpsummermode, F_(off), F_(auto), F("heizen"), F("kühlen")) +MAKE_PSTR_LIST(enum_hpoperatingmode, F_(off), F_(auto), F("heizen"), F("kühlen")) MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer)) MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310 @@ -650,7 +650,7 @@ MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("Frostschutztemperatur")) MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("berechnete Flusstemperatur")) MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("Heizungstyp")) MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("Einstellung Sommerbetrieb")) -MAKE_PSTR_LIST(hpsummersetmode, F("hpsummersetmode"), F("Wärmepumpe Sommerbetrieb")) +MAKE_PSTR_LIST(hpoperatingmode, F("hpoperatingmode"), F("Wärmepumpe Betriebsmodus")) MAKE_PSTR_LIST(controlmode, F("controlmode"), F("Kontrollmodus")) MAKE_PSTR_LIST(control, F("control"), F("Fernsteuerung")) MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates")) diff --git a/src/locale_EN.h b/src/locale_EN.h index 67d5063b7..938d5f912 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -364,7 +364,7 @@ MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto)) MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) -MAKE_PSTR_LIST(enum_hpsummermode, F_(off), F_(auto), F("heating"), F("cooling")) +MAKE_PSTR_LIST(enum_hpoperatingmode, F_(off), F_(auto), F("heating"), F("cooling")) MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer)) MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310 @@ -639,7 +639,7 @@ MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("nofrost temperature")) MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("target flow temperature")) MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("heating type")) MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("set summer mode")) -MAKE_PSTR_LIST(hpsummersetmode, F("hpsummersetmode"), F("heatpump summer mode")) +MAKE_PSTR_LIST(hpoperatingmode, F("hpoperatingmode"), F("heatpump operating mode")) MAKE_PSTR_LIST(controlmode, F("controlmode"), F("control mode")) MAKE_PSTR_LIST(control, F("control"), F("control device")) MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates")) From 33e58ec45a7a8c6a18e1624c85a293ab77a970e2 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 18 May 2022 07:05:11 +0200 Subject: [PATCH 302/319] RC30 designtemp write, 2.fix #496 --- src/devices/thermostat.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index efd40b5ca..726ecf98b 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -2966,7 +2966,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co factor = 1; break; case HeatingCircuit::Mode::DESIGN: - if (hc->heatingtype == 3) { + if (hc->heatingtype == 3 && model == EMS_DEVICE_FLAG_RC35) { offset = EMS_OFFSET_RC35Set_temp_design_floor; } else { offset = EMS_OFFSET_RC35Set_temp_design; @@ -3005,7 +3005,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co factor = 1; break; case HeatingCircuit::Mode::MAXFLOW: - if (hc->heatingtype == 3) { + if (hc->heatingtype == 3 && model == EMS_DEVICE_FLAG_RC35) { offset = 35; } else { offset = 15; From 9034c16e27f4c589975d3c83582a3a7393709413 Mon Sep 17 00:00:00 2001 From: tp1de Date: Wed, 18 May 2022 18:11:17 +0200 Subject: [PATCH 303/319] wwFlowTempOffset RC310 --- src/devices/boiler.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 1b2d89588..d8d63eef3 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -399,7 +399,9 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const nullptr, FL_(wwFlowTempOffset), DeviceValueUOM::DEGREES_R, - MAKE_CF_CB(set_ww_flowTempOffset)); + MAKE_CF_CB(set_ww_flowTempOffset), + 0, + 40); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMaxPower_, DeviceValueType::UINT, @@ -773,6 +775,7 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram has_update(telegram, wwSelTemp_, 6); // setting here has_update(telegram, wwHystOn_, 7); has_update(telegram, wwHystOff_, 8); + has_update(telegram, wwFlowTempOffset_, 9); has_update(telegram, wwCircPump_, 10); // 0x01 means yes has_update(telegram, wwCircMode_, 11); // 1=1x3min... 6=6x3min, 7=continuous has_update(telegram, wwDisinfectionTemp_, 12); // setting here, status in E9 @@ -1249,7 +1252,11 @@ bool Boiler::set_ww_flowTempOffset(const char * value, const int8_t id) { return false; } - write_command(EMS_TYPE_UBAParameterWW, 5, v, EMS_TYPE_UBAParameterWW); + if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { + write_command(EMS_TYPE_UBAParameterWWPlus, 9, v, EMS_TYPE_UBAParameterWWPlus); + } else { + write_command(EMS_TYPE_UBAParameterWW, 5, v, EMS_TYPE_UBAParameterWW); + } return true; } From c481e1fe0f2f31884922e9095675f15655951f91 Mon Sep 17 00:00:00 2001 From: tp1de Date: Thu, 19 May 2022 16:59:03 +0200 Subject: [PATCH 304/319] wwcomfort1 for UBAParameterWWPlus (RC310) --- src/devices/boiler.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++ src/devices/boiler.h | 2 ++ src/locale_EN.h | 3 +++ 3 files changed, 50 insertions(+) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index d8d63eef3..0c46a362d 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -393,6 +393,13 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(wwComfort), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_mode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwComfort1_, + DeviceValueType::ENUM, + FL_(enum_comfort1), + FL_(wwComfort1), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_mode1)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwFlowTempOffset_, DeviceValueType::UINT, @@ -781,6 +788,19 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram has_update(telegram, wwDisinfectionTemp_, 12); // setting here, status in E9 has_update(telegram, wwSelTempSingle_, 16); has_update(telegram, wwSelTempLow_, 18); + + uint8_t wwComfort1 = EMS_VALUE_UINT_NOTSET; + telegram->read_value(wwComfort1, 13); + if (wwComfort1 == 0) { + wwComfort1 = 0; // High_Comfort + } else if (wwComfort1 == 0xD8) { + wwComfort1 = 1; // Eco + } else { + wwComfort1 = EMS_VALUE_UINT_NOTSET; + } + has_update(wwComfort1_, wwComfort1); + + } // 0xE9 - WW monitor ems+ @@ -1492,6 +1512,31 @@ bool Boiler::set_ww_mode(const char * value, const int8_t id) { return true; } +// wwcomfort1 for RC310 +// on a RC310 it's 1=high, 2=eco +bool Boiler::set_ww_mode1(const char * value, const int8_t id) { + uint8_t set; + if (!Helpers::value2enum(value, set, FL_(enum_comfort1))) { + return false; + } + + if (!is_fetch(EMS_TYPE_UBAParameterWWPlus)) { + return false; + } + + if (set == 0) { + // LOG_INFO(F("Setting boiler dhw to High")); + } else if (set == 1) { + // LOG_INFO(F("Setting boiler dhw to Eco")); + set = 0xD8; + } else { + return false; // do nothing + } + + write_command(EMS_TYPE_UBAParameterWWPlus, 13, set, EMS_TYPE_UBAParameterWWPlus); + return true; +} + // turn on/off dhw bool Boiler::set_ww_activated(const char * value, const int8_t id) { bool v = false; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 71e71365c..5b5ae53b2 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -58,6 +58,7 @@ class Boiler : public EMSdevice { uint8_t wwSelTempSingle_; // DHW single charge temperature uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer uint8_t wwComfort_; // WW comfort mode + uint8_t wwComfort1_; // WW comfort mode RC310 uint8_t wwCircPump_; // DHW circulation pump available uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection @@ -240,6 +241,7 @@ class Boiler : public EMSdevice { // commands - none of these use the additional id parameter bool set_ww_mode(const char * value, const int8_t id); + bool set_ww_mode1(const char * value, const int8_t id); bool set_ww_activated(const char * value, const int8_t id); bool set_tapwarmwater_activated(const char * value, const int8_t id); bool set_ww_onetime(const char * value, const int8_t id); diff --git a/src/locale_EN.h b/src/locale_EN.h index 677a3e104..328b1754a 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -262,6 +262,7 @@ MAKE_PSTR_WORD(continuous) MAKE_PSTR(3wayvalve, "3-way valve") MAKE_PSTR(chargepump, "charge pump") MAKE_PSTR_WORD(hot) +MAKE_PSTR_WORD(high_comfort) MAKE_PSTR_WORD(eco) MAKE_PSTR_WORD(intelligent) MAKE_PSTR_WORD(flow) @@ -277,6 +278,7 @@ MAKE_PSTR_LIST(enum_off_time_date_manual, F_(off), F_(time), F_(date), F_(manual MAKE_PSTR_LIST(enum_freq, F_(off), F_(1x3min), F_(2x3min), F_(3x3min), F_(4x3min), F_(5x3min), F_(6x3min), F_(continuous)) MAKE_PSTR_LIST(enum_charge, F_(chargepump), F_(3wayvalve)) MAKE_PSTR_LIST(enum_comfort, F_(hot), F_(eco), F_(intelligent)) +MAKE_PSTR_LIST(enum_comfort1, F_(high_comfort), F_(eco)) MAKE_PSTR_LIST(enum_flow, F_(off), F_(flow), F_(bufferedflow), F_(buffer), F_(layeredbuffer)) MAKE_PSTR_LIST(enum_reset, F("-"), F_(maintenance), F_(error)) // MAKE_PSTR_LIST(enum_bool, F_(off), F_(on)) @@ -534,6 +536,7 @@ MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperatu MAKE_PSTR_LIST(wwSetTemp, F("wwsettemp"), F("set temperature")) MAKE_PSTR_LIST(wwType, F("wwtype"), F("type")) MAKE_PSTR_LIST(wwComfort, F("wwcomfort"), F("comfort")) +MAKE_PSTR_LIST(wwComfort1, F("wwcomfort1"), F("ww comfort1")) MAKE_PSTR_LIST(wwFlowTempOffset, F("wwflowtempoffset"), F("flow temperature offset")) MAKE_PSTR_LIST(wwMaxPower, F("wwmaxpower"), F("max power")) MAKE_PSTR_LIST(wwCircPump, F("wwcircpump"), F("circulation pump available")) From e2de89c7636d2a792a781c8a1558326740dd77e0 Mon Sep 17 00:00:00 2001 From: Thomas <36480251+tp1de@users.noreply.github.com> Date: Thu, 19 May 2022 23:29:20 +0200 Subject: [PATCH 305/319] Update locale_EN.h --- src/locale_EN.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locale_EN.h b/src/locale_EN.h index 328b1754a..b1fc30442 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -536,7 +536,7 @@ MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperatu MAKE_PSTR_LIST(wwSetTemp, F("wwsettemp"), F("set temperature")) MAKE_PSTR_LIST(wwType, F("wwtype"), F("type")) MAKE_PSTR_LIST(wwComfort, F("wwcomfort"), F("comfort")) -MAKE_PSTR_LIST(wwComfort1, F("wwcomfort1"), F("ww comfort1")) +MAKE_PSTR_LIST(wwComfort1, F("wwcomfort1"), F("comfort1")) MAKE_PSTR_LIST(wwFlowTempOffset, F("wwflowtempoffset"), F("flow temperature offset")) MAKE_PSTR_LIST(wwMaxPower, F("wwmaxpower"), F("max power")) MAKE_PSTR_LIST(wwCircPump, F("wwcircpump"), F("circulation pump available")) From 571f5577d12888fe881803ab74efebabeebc2a24 Mon Sep 17 00:00:00 2001 From: tp1de Date: Fri, 20 May 2022 00:10:58 +0200 Subject: [PATCH 306/319] wwchargeoptimization UBAParameterWWPlus --- src/devices/boiler.cpp | 25 +++++++++++++++++++++++++ src/devices/boiler.h | 2 ++ src/locale_EN.h | 3 ++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 0c46a362d..18242d7df 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -409,6 +409,13 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_ww_flowTempOffset), 0, 40); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwChargeOptimization_, + DeviceValueType::BOOL, + nullptr, + FL_(wwChargeOptimization), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_chargeOptimization)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMaxPower_, DeviceValueType::UINT, @@ -788,6 +795,7 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram has_update(telegram, wwDisinfectionTemp_, 12); // setting here, status in E9 has_update(telegram, wwSelTempSingle_, 16); has_update(telegram, wwSelTempLow_, 18); + has_update(telegram, wwChargeOptimization_, 25); uint8_t wwComfort1 = EMS_VALUE_UINT_NOTSET; telegram->read_value(wwComfort1, 13); @@ -1377,6 +1385,23 @@ bool Boiler::set_ww_hyst_off(const char * value, const int8_t id) { return true; } +// set ww charge optimization +bool Boiler::set_ww_chargeOptimization(const char * value, const int8_t id) { + bool v = false; + if (!Helpers::value2bool(value, v)) { + return false; + } + + if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { + write_command(EMS_TYPE_UBAParameterWWPlus, 25, v ? 1 : 0, EMS_TYPE_UBAParameterWWPlus); + } + + return true; +} + + + + // set dhw max power bool Boiler::set_ww_maxpower(const char * value, const int8_t id) { int v = 0; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 5b5ae53b2..adcca7f97 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -61,6 +61,7 @@ class Boiler : public EMSdevice { uint8_t wwComfort1_; // WW comfort mode RC310 uint8_t wwCircPump_; // DHW circulation pump available uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) + uint8_t wwChargeOptimization_; // DHW charge optimization uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection uint8_t wwCircMode_; // DHW circulation pump mode uint8_t wwCirc_; // Circulation on/off @@ -255,6 +256,7 @@ class Boiler : public EMSdevice { bool set_ww_disinfect_temp(const char * value, const int8_t id); bool set_ww_maxpower(const char * value, const int8_t id); bool set_ww_flowTempOffset(const char * value, const int8_t id); + bool set_ww_chargeOptimization(const char * value, const int8_t id); bool set_flow_temp(const char * value, const int8_t id); bool set_burn_power(const char * value, const int8_t id); bool set_heating_activated(const char * value, const int8_t id); diff --git a/src/locale_EN.h b/src/locale_EN.h index 328b1754a..2b1f0b7dc 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -536,7 +536,7 @@ MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperatu MAKE_PSTR_LIST(wwSetTemp, F("wwsettemp"), F("set temperature")) MAKE_PSTR_LIST(wwType, F("wwtype"), F("type")) MAKE_PSTR_LIST(wwComfort, F("wwcomfort"), F("comfort")) -MAKE_PSTR_LIST(wwComfort1, F("wwcomfort1"), F("ww comfort1")) +MAKE_PSTR_LIST(wwComfort1, F("wwcomfort1"), F("comfort mode")) MAKE_PSTR_LIST(wwFlowTempOffset, F("wwflowtempoffset"), F("flow temperature offset")) MAKE_PSTR_LIST(wwMaxPower, F("wwmaxpower"), F("max power")) MAKE_PSTR_LIST(wwCircPump, F("wwcircpump"), F("circulation pump available")) @@ -553,6 +553,7 @@ MAKE_PSTR_LIST(wwActivated, F("wwactivated"), F("activated")) MAKE_PSTR_LIST(wwOneTime, F("wwonetime"), F("one time charging")) MAKE_PSTR_LIST(wwDisinfecting, F("wwdisinfecting"), F("disinfecting")) MAKE_PSTR_LIST(wwCharging, F("wwcharging"), F("charging")) +MAKE_PSTR_LIST(wwChargeOptimization, F("wwchargeoptimization"), F("charge optimization")) MAKE_PSTR_LIST(wwRecharging, F("wwrecharging"), F("recharging")) MAKE_PSTR_LIST(wwTempOK, F("wwtempok"), F("temperature ok")) MAKE_PSTR_LIST(wwActive, F("wwactive"), F("active")) From 353853af14442d845cd6efe8fd64f63a9de4ad7f Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 20 May 2022 09:58:43 +0200 Subject: [PATCH 307/319] max must be a integer (changed 19.9 to 20) --- src/devices/boiler.cpp | 2 +- src/devices/thermostat.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 1b2d89588..1c4bde70f 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -238,7 +238,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueUOM::NONE, MAKE_CF_CB(set_energyCostRatio), 0, - 19.9); + 20); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &fossileFactor_, DeviceValueType::UINT, diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index b4567d49a..b7c26b62f 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -3720,7 +3720,7 @@ void Thermostat::register_device_values() { DeviceValueUOM::NONE, MAKE_CF_CB(set_energyCostRatio), 0, - 19.9); + 20); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &fossileFactor_, DeviceValueType::UINT, From 6545dbd483277cc8dec342e967bf5f01e50f8549 Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 20 May 2022 09:58:53 +0200 Subject: [PATCH 308/319] updated packages --- interface/package-lock.json | 155 ++++++++++++++++-------------------- interface/package.json | 6 +- 2 files changed, 70 insertions(+), 91 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index b3f7cc0b5..60e461923 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -11,11 +11,11 @@ "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.7.0", + "@mui/icons-material": "^5.8.0", + "@mui/material": "^5.8.0", "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.33", + "@types/node": "^17.0.35", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -2856,15 +2856,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.80", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.80.tgz", - "integrity": "sha512-sPSYwJzwNMaqpksdLuOhpQQLrhtpBH4sNnMSgkzJzo7Jo4HF9ivjNpq27Zh5+sdRe5MTt0gcBT0QSMO6zML1Aw==", + "version": "5.0.0-alpha.81", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.81.tgz", + "integrity": "sha512-KJP+RdKBLSbhiAliy1b5xFuoAezawupfIHc/MRtEZdqAmUW0+UFNDXIUDlBKR9zLCjgjQ7eVJsSe0TwAgd8OMQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", - "@mui/private-classnames": "^5.7.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.7.0", + "@mui/utils": "^5.8.0", "@popperjs/core": "^2.11.5", "clsx": "^1.1.1", "prop-types": "^15.8.1", @@ -2889,9 +2888,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.2.tgz", - "integrity": "sha512-9QdI7axKuBAyaGz4mtdi7Uy1j73/thqFmEuxpJHxNC7O8ADEK1Da3t2veK2tgmsXsUlAHcAG63gg+GvWWeQNqQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.8.0.tgz", + "integrity": "sha512-ScwLxa0q5VYV70Jfc60V/9VD0b9SvIeZ0Jddx2Dt2pBUFFO9vKdrbt9LYiT+4p21Au5NdYIb2XSHj46CLN1v3g==", "dependencies": { "@babel/runtime": "^7.17.2" }, @@ -2914,16 +2913,15 @@ } }, "node_modules/@mui/material": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.7.0.tgz", - "integrity": "sha512-s1TSuUK5upNzGY5ZFHfJyzEt9fijn4cE+kEdEq7jGF+vpZIYXsDooH07+dNJ9+cJjYo6f9Fq1q5fPkknRC2Trw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.8.0.tgz", + "integrity": "sha512-yvt3sUmUZ1i8SPadRYBCThcB57lBZsvyhC7ufVpRxA3AD39O+WXtXAapEfpDdDkJnnKb5MCimDMwBYgWLmY89Q==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.80", - "@mui/private-classnames": "^5.7.0", - "@mui/system": "^5.7.0", + "@mui/base": "5.0.0-alpha.81", + "@mui/system": "^5.8.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.7.0", + "@mui/utils": "^5.8.0", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -2958,25 +2956,13 @@ } } }, - "node_modules/@mui/private-classnames": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/private-classnames/-/private-classnames-5.7.0.tgz", - "integrity": "sha512-OSB4ybzpYiS11rQ3VtbcJz/CS19lC0r0Hk14iRZwPtVgapnL1hKsGtmgRviZLxpLk/cZUKaxaJDuuzI/extCoA==", - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - } - }, "node_modules/@mui/private-theming": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.7.0.tgz", - "integrity": "sha512-r/6JAWAHV1IFASZnceJPe9QT/s12ia/okGbmCUO4MEPdsWcNKye1RVKSwVgLATaX3YwPxDljWguIQrM3R2gZNA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.8.0.tgz", + "integrity": "sha512-MjRAneTmCKLR9u2S4jtjLUe6gpHxlbb4g2bqpDJ2PdwlvwsWIUzbc/gVB4dvccljXeWxr5G2M/Co2blXisvFIw==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.7.0", + "@mui/utils": "^5.8.0", "prop-types": "^15.8.1" }, "engines": { @@ -2997,9 +2983,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.7.0.tgz", - "integrity": "sha512-JTvp+6lbAXYqgf/YInwR+hd4F8Fhg5PxMBwKTFsdKbaZFvyBD95hzKcxRmO9Y/NdjwFYWm5bBhcZAT4r2g1kZA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.8.0.tgz", + "integrity": "sha512-Q3spibB8/EgeMYHc+/o3RRTnAYkSl7ROCLhXJ830W8HZ2/iDiyYp16UcxKPurkXvLhUaILyofPVrP3Su2uKsAw==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -3027,15 +3013,15 @@ } }, "node_modules/@mui/system": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.7.0.tgz", - "integrity": "sha512-M0vemfcfaRQzqLUmVRIsAVb0rx2ULHisHED6njoJqtjH58gbVb497mH+K1vI+Lh29fKR6Ki2mx3egxVi7mUn9w==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.8.0.tgz", + "integrity": "sha512-1tEj2S59RjlZ/6JMJMUktQDbV2ev7hyGXqO7dRRUQ7nOJi9qHmCFP0uXj3YS6LbM6hVasgYXJg8GBjbEtfTJvg==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.7.0", - "@mui/styled-engine": "^5.7.0", + "@mui/private-theming": "^5.8.0", + "@mui/styled-engine": "^5.8.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.7.0", + "@mui/utils": "^5.8.0", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.8.1" @@ -3079,9 +3065,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.7.0.tgz", - "integrity": "sha512-uWpDIEXl7bWYkJwKQQ4Rdhc2dcotVETRYuLy29V6qLYZyAbs7AMKwDDz0XKy3RMNmU7S2R/jEeSb9xjXscQUHQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.8.0.tgz", + "integrity": "sha512-7LgUtCvz78676iC0wpTH7HizMdCrTphhBmRWimIMFrp5Ph6JbDFVuKS1CwYnWWxRyYKL0QzXrDL0lptAU90EXg==", "dependencies": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.5", @@ -3776,9 +3762,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.33.tgz", - "integrity": "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ==" + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -19569,15 +19555,14 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.80", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.80.tgz", - "integrity": "sha512-sPSYwJzwNMaqpksdLuOhpQQLrhtpBH4sNnMSgkzJzo7Jo4HF9ivjNpq27Zh5+sdRe5MTt0gcBT0QSMO6zML1Aw==", + "version": "5.0.0-alpha.81", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.81.tgz", + "integrity": "sha512-KJP+RdKBLSbhiAliy1b5xFuoAezawupfIHc/MRtEZdqAmUW0+UFNDXIUDlBKR9zLCjgjQ7eVJsSe0TwAgd8OMQ==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", - "@mui/private-classnames": "^5.7.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.7.0", + "@mui/utils": "^5.8.0", "@popperjs/core": "^2.11.5", "clsx": "^1.1.1", "prop-types": "^15.8.1", @@ -19585,24 +19570,23 @@ } }, "@mui/icons-material": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.6.2.tgz", - "integrity": "sha512-9QdI7axKuBAyaGz4mtdi7Uy1j73/thqFmEuxpJHxNC7O8ADEK1Da3t2veK2tgmsXsUlAHcAG63gg+GvWWeQNqQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.8.0.tgz", + "integrity": "sha512-ScwLxa0q5VYV70Jfc60V/9VD0b9SvIeZ0Jddx2Dt2pBUFFO9vKdrbt9LYiT+4p21Au5NdYIb2XSHj46CLN1v3g==", "requires": { "@babel/runtime": "^7.17.2" } }, "@mui/material": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.7.0.tgz", - "integrity": "sha512-s1TSuUK5upNzGY5ZFHfJyzEt9fijn4cE+kEdEq7jGF+vpZIYXsDooH07+dNJ9+cJjYo6f9Fq1q5fPkknRC2Trw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.8.0.tgz", + "integrity": "sha512-yvt3sUmUZ1i8SPadRYBCThcB57lBZsvyhC7ufVpRxA3AD39O+WXtXAapEfpDdDkJnnKb5MCimDMwBYgWLmY89Q==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.80", - "@mui/private-classnames": "^5.7.0", - "@mui/system": "^5.7.0", + "@mui/base": "5.0.0-alpha.81", + "@mui/system": "^5.8.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.7.0", + "@mui/utils": "^5.8.0", "@types/react-transition-group": "^4.4.4", "clsx": "^1.1.1", "csstype": "^3.0.11", @@ -19612,25 +19596,20 @@ "react-transition-group": "^4.4.2" } }, - "@mui/private-classnames": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/private-classnames/-/private-classnames-5.7.0.tgz", - "integrity": "sha512-OSB4ybzpYiS11rQ3VtbcJz/CS19lC0r0Hk14iRZwPtVgapnL1hKsGtmgRviZLxpLk/cZUKaxaJDuuzI/extCoA==" - }, "@mui/private-theming": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.7.0.tgz", - "integrity": "sha512-r/6JAWAHV1IFASZnceJPe9QT/s12ia/okGbmCUO4MEPdsWcNKye1RVKSwVgLATaX3YwPxDljWguIQrM3R2gZNA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.8.0.tgz", + "integrity": "sha512-MjRAneTmCKLR9u2S4jtjLUe6gpHxlbb4g2bqpDJ2PdwlvwsWIUzbc/gVB4dvccljXeWxr5G2M/Co2blXisvFIw==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.7.0", + "@mui/utils": "^5.8.0", "prop-types": "^15.8.1" } }, "@mui/styled-engine": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.7.0.tgz", - "integrity": "sha512-JTvp+6lbAXYqgf/YInwR+hd4F8Fhg5PxMBwKTFsdKbaZFvyBD95hzKcxRmO9Y/NdjwFYWm5bBhcZAT4r2g1kZA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.8.0.tgz", + "integrity": "sha512-Q3spibB8/EgeMYHc+/o3RRTnAYkSl7ROCLhXJ830W8HZ2/iDiyYp16UcxKPurkXvLhUaILyofPVrP3Su2uKsAw==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/cache": "^11.7.1", @@ -19638,15 +19617,15 @@ } }, "@mui/system": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.7.0.tgz", - "integrity": "sha512-M0vemfcfaRQzqLUmVRIsAVb0rx2ULHisHED6njoJqtjH58gbVb497mH+K1vI+Lh29fKR6Ki2mx3egxVi7mUn9w==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.8.0.tgz", + "integrity": "sha512-1tEj2S59RjlZ/6JMJMUktQDbV2ev7hyGXqO7dRRUQ7nOJi9qHmCFP0uXj3YS6LbM6hVasgYXJg8GBjbEtfTJvg==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.7.0", - "@mui/styled-engine": "^5.7.0", + "@mui/private-theming": "^5.8.0", + "@mui/styled-engine": "^5.8.0", "@mui/types": "^7.1.3", - "@mui/utils": "^5.7.0", + "@mui/utils": "^5.8.0", "clsx": "^1.1.1", "csstype": "^3.0.11", "prop-types": "^15.8.1" @@ -19659,9 +19638,9 @@ "requires": {} }, "@mui/utils": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.7.0.tgz", - "integrity": "sha512-uWpDIEXl7bWYkJwKQQ4Rdhc2dcotVETRYuLy29V6qLYZyAbs7AMKwDDz0XKy3RMNmU7S2R/jEeSb9xjXscQUHQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.8.0.tgz", + "integrity": "sha512-7LgUtCvz78676iC0wpTH7HizMdCrTphhBmRWimIMFrp5Ph6JbDFVuKS1CwYnWWxRyYKL0QzXrDL0lptAU90EXg==", "requires": { "@babel/runtime": "^7.17.2", "@types/prop-types": "^15.7.5", @@ -20156,9 +20135,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.33.tgz", - "integrity": "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ==" + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==" }, "@types/parse-json": { "version": "4.0.0", diff --git a/interface/package.json b/interface/package.json index 82f9d9f25..375f96cb6 100644 --- a/interface/package.json +++ b/interface/package.json @@ -7,11 +7,11 @@ "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.7.0", + "@mui/icons-material": "^5.8.0", + "@mui/material": "^5.8.0", "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.33", + "@types/node": "^17.0.35", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", From f9d46904f611725a95d273240e619fb7048fdd6e Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 20 May 2022 09:59:15 +0200 Subject: [PATCH 309/319] updated URL for api/system/info --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/questions---troubleshooting.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6a0ddf1e1..7a62dcb07 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -29,7 +29,7 @@ assignees: '' *If applicable, add screenshots to help explain your problem.* **Device information** -*Copy-paste here the information as it is outputted by the device. You can get this information by from http://ems-esp.local/api?device=system&cmd=info* +*Copy-paste here the information as it is outputted by the device. You can get this information by from http://ems-esp.local/api/system* **Additional context** *Add any other context about the problem here.* diff --git a/.github/ISSUE_TEMPLATE/questions---troubleshooting.md b/.github/ISSUE_TEMPLATE/questions---troubleshooting.md index fa26a177b..0e8175477 100644 --- a/.github/ISSUE_TEMPLATE/questions---troubleshooting.md +++ b/.github/ISSUE_TEMPLATE/questions---troubleshooting.md @@ -23,7 +23,7 @@ assignees: '' *If applicable, add screenshots to help explain your problem.* **Device information** -*Copy-paste here the information as it is outputted by the device. You can get this information from http://ems-esp.local/api?device=system&cmd=info* +*Copy-paste here the information as it is outputted by the device. You can get this information from http://ems-esp.local/api/system* **Additional context** *Add any other context about the problem here.* From 8afb5b3a7ccc3466da0a6c85cf35e538989f0641 Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 20 May 2022 12:40:07 +0200 Subject: [PATCH 310/319] formatting --- src/devices/boiler.cpp | 2 -- src/devices/boiler.h | 66 +++++++++++++++++++------------------- src/devices/thermostat.cpp | 9 ++++-- 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 41ee5e05d..6591dbde9 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -807,8 +807,6 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram wwComfort1 = EMS_VALUE_UINT_NOTSET; } has_update(wwComfort1_, wwComfort1); - - } // 0xE9 - WW monitor ems+ diff --git a/src/devices/boiler.h b/src/devices/boiler.h index adcca7f97..e02465905 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -51,39 +51,39 @@ class Boiler : public EMSdevice { static constexpr uint16_t EMS_TYPE_UBAEnergySupplied = 0x494; // ww - uint8_t wwSetTemp_; // DHW set temperature - uint8_t wwSelTemp_; // DHW selected temperature - uint8_t wwSelTempLow_; // DHW lower selected temperature - uint8_t wwSelTempOff_; // DHW selected temperature for off position - uint8_t wwSelTempSingle_; // DHW single charge temperature - uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer - uint8_t wwComfort_; // WW comfort mode - uint8_t wwComfort1_; // WW comfort mode RC310 - uint8_t wwCircPump_; // DHW circulation pump available - uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) - uint8_t wwChargeOptimization_; // DHW charge optimization - uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection - uint8_t wwCircMode_; // DHW circulation pump mode - uint8_t wwCirc_; // Circulation on/off - uint16_t wwCurTemp_; // DHW current temperature - uint16_t wwCurTemp2_; // DHW current temperature storage - uint8_t wwCurFlow_; // DHW current flow temp in l/min - uint16_t wwStorageTemp1_; // DHW storage temp 1 - uint16_t wwStorageTemp2_; // DHW storage temp 2 - uint8_t wwActivated_; // DHW activated - uint8_t wwOneTime_; // DHW one time function on/off - uint8_t wwDisinfect_; // DHW disinfection on/off - uint8_t wwCharging_; // DHW charging on/off - uint8_t wwRecharging_; // DHW recharge on/off - uint8_t wwTempOK_; // DHW temperature ok on/off - uint8_t wwActive_; // - uint8_t ww3wayValve_; // 3-way valve on WW - uint8_t wwSetPumpPower_; // ww pump speed/power? - uint8_t wwFlowTempOffset_; // Boiler offset for ww heating - uint8_t wwMaxPower_; // DHW maximum power - uint32_t wwStarts_; // DHW starts - uint32_t wwStarts2_; // DHW control starts - uint32_t wwWorkM_; // DHW minutes + uint8_t wwSetTemp_; // DHW set temperature + uint8_t wwSelTemp_; // DHW selected temperature + uint8_t wwSelTempLow_; // DHW lower selected temperature + uint8_t wwSelTempOff_; // DHW selected temperature for off position + uint8_t wwSelTempSingle_; // DHW single charge temperature + uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer + uint8_t wwComfort_; // WW comfort mode + uint8_t wwComfort1_; // WW comfort mode RC310 + uint8_t wwCircPump_; // DHW circulation pump available + uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) + uint8_t wwChargeOptimization_; // DHW charge optimization + uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection + uint8_t wwCircMode_; // DHW circulation pump mode + uint8_t wwCirc_; // Circulation on/off + uint16_t wwCurTemp_; // DHW current temperature + uint16_t wwCurTemp2_; // DHW current temperature storage + uint8_t wwCurFlow_; // DHW current flow temp in l/min + uint16_t wwStorageTemp1_; // DHW storage temp 1 + uint16_t wwStorageTemp2_; // DHW storage temp 2 + uint8_t wwActivated_; // DHW activated + uint8_t wwOneTime_; // DHW one time function on/off + uint8_t wwDisinfect_; // DHW disinfection on/off + uint8_t wwCharging_; // DHW charging on/off + uint8_t wwRecharging_; // DHW recharge on/off + uint8_t wwTempOK_; // DHW temperature ok on/off + uint8_t wwActive_; // + uint8_t ww3wayValve_; // 3-way valve on WW + uint8_t wwSetPumpPower_; // ww pump speed/power? + uint8_t wwFlowTempOffset_; // Boiler offset for ww heating + uint8_t wwMaxPower_; // DHW maximum power + uint32_t wwStarts_; // DHW starts + uint32_t wwStarts2_; // DHW control starts + uint32_t wwWorkM_; // DHW minutes int8_t wwHystOn_; int8_t wwHystOff_; uint8_t wwTapActivated_; // maintenance-mode to switch DHW off diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 4d502f6ac..7be718f9b 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -3835,8 +3835,13 @@ void Thermostat::register_device_values_hc(std::shared_ptrheatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value( tag, &hc->summersetmode, DeviceValueType::ENUM, FL_(enum_summermode), FL_(summersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); - register_device_value( - tag, &hc->hpoperatingmode, DeviceValueType::ENUM, FL_(enum_hpoperatingmode), FL_(hpoperatingmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); + register_device_value(tag, + &hc->hpoperatingmode, + DeviceValueType::ENUM, + FL_(enum_hpoperatingmode), + FL_(hpoperatingmode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_summermode)); register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); register_device_value( tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); From 5b4c5b063d8c9b5a3ee8b64cc324716791f849ff Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 20 May 2022 12:40:27 +0200 Subject: [PATCH 311/319] increase # devices supported --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f3893c9c..063a55364 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Note, EMS-ESP requires a small hardware circuit that can convert the EMS bus dat - Native support for Home Assistant and Domoticz via [MQTT Discovery](https://www.home-assistant.io/docs/mqtt/discovery/) - Can run standalone as an independent WiFi Access Point or join an existing WiFi network - Easy first-time configuration via a web Captive Portal -- Support for more than [80 EMS devices](https://emsesp.github.io/docs/#/Supported-EMS-Devices) (boilers, thermostats, solar modules, mixer modules, heat pumps, gateways) +- Support for more than [100 EMS devices](https://emsesp.github.io/docs/#/Supported-EMS-Devices) (boilers, thermostats, solar modules, mixer modules, heat pumps, gateways) ## **Demo** From 7ea6c542cfcdc646128651577c873fdc3e7ddc94 Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 20 May 2022 12:40:34 +0200 Subject: [PATCH 312/319] updated screenshots --- media/web_devices.png | Bin 89709 -> 47142 bytes media/web_edit.png | Bin 64080 -> 142412 bytes media/web_sensor.png | Bin 0 -> 115253 bytes media/web_settings.png | Bin 94566 -> 138357 bytes media/web_status.png | Bin 49196 -> 80003 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 media/web_sensor.png diff --git a/media/web_devices.png b/media/web_devices.png index 8d4f8794af131d4fb849c7121f97381ee3ac129a..75055909f6d6bf417aad269f63fa8e9ec7ff48a6 100644 GIT binary patch literal 47142 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 K$tv+rf&UGRI-Ifq literal 89709 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 literal 64080 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 Zbpt2^=qiq=M6iH|lDw)M?3G#I{{hdmL>&MC diff --git a/media/web_sensor.png b/media/web_sensor.png new file mode 100644 index 0000000000000000000000000000000000000000..9419070e3612952f04e8716702c227ae794b99bd GIT binary patch literal 115253 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�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%0A&@*%MXN3UXdL2g>}&cdM7g@KeHy6oR{t=p4> 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 z≈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 Date: Fri, 20 May 2022 12:47:54 +0200 Subject: [PATCH 313/319] change tooltips #504 --- .../src/project/SettingsCustomization.tsx | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 05dca4571..a5cac3aae 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -376,22 +376,22 @@ const SettingsCustomization: FC = () => { }} > - + - + - + - + @@ -403,26 +403,30 @@ const SettingsCustomization: FC = () => { : - + + + - + + +

From c637dcbbd848ce33072850a5c7b19b3e271f8b75 Mon Sep 17 00:00:00 2001 From: tp1de Date: Fri, 20 May 2022 13:14:09 +0200 Subject: [PATCH 314/319] wwmaxtemp for RC310 --- src/devices/boiler.cpp | 22 ++++++++++++++++++++++ src/devices/boiler.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 18242d7df..b61656b77 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -425,6 +425,15 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_ww_maxpower), 0, 130); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwMaxTemp_, + DeviceValueType::UINT, + nullptr, + FL_(wwMaxTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_ww_maxtemp), + 0, + 70); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCircPump_, DeviceValueType::BOOL, @@ -795,6 +804,7 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram has_update(telegram, wwDisinfectionTemp_, 12); // setting here, status in E9 has_update(telegram, wwSelTempSingle_, 16); has_update(telegram, wwSelTempLow_, 18); + has_update(telegram, wwMaxTemp_, 20); has_update(telegram, wwChargeOptimization_, 25); uint8_t wwComfort1 = EMS_VALUE_UINT_NOTSET; @@ -1414,6 +1424,18 @@ bool Boiler::set_ww_maxpower(const char * value, const int8_t id) { return true; } +// set dhw maximum temperature +bool Boiler::set_ww_maxtemp(const char * value, const int8_t id) { + int v = 0; + if (!Helpers::value2number(value, v)) { + return false; + } + + write_command(EMS_TYPE_UBAParameterWWPlus, 20, v, EMS_TYPE_UBAParameterWWPlus); + + return true; +} + // set min pump modulation bool Boiler::set_min_pump(const char * value, const int8_t id) { int v = 0; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index adcca7f97..b36ad2694 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -81,6 +81,7 @@ class Boiler : public EMSdevice { uint8_t wwSetPumpPower_; // ww pump speed/power? uint8_t wwFlowTempOffset_; // Boiler offset for ww heating uint8_t wwMaxPower_; // DHW maximum power + uint8_t wwMaxTemp_; // DHW maximum temperature uint32_t wwStarts_; // DHW starts uint32_t wwStarts2_; // DHW control starts uint32_t wwWorkM_; // DHW minutes @@ -255,6 +256,7 @@ class Boiler : public EMSdevice { bool set_ww_temp_single(const char * value, const int8_t id); bool set_ww_disinfect_temp(const char * value, const int8_t id); bool set_ww_maxpower(const char * value, const int8_t id); + bool set_ww_maxtemp(const char * value, const int8_t id); bool set_ww_flowTempOffset(const char * value, const int8_t id); bool set_ww_chargeOptimization(const char * value, const int8_t id); bool set_flow_temp(const char * value, const int8_t id); From 5ab22af9c3653df663cfda9f2b58685af731fe78 Mon Sep 17 00:00:00 2001 From: tp1de Date: Fri, 20 May 2022 16:55:16 +0200 Subject: [PATCH 315/319] correct boilers.h --- src/devices/boiler.h | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 0e6bc8aa0..b36ad2694 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -85,39 +85,6 @@ class Boiler : public EMSdevice { uint32_t wwStarts_; // DHW starts uint32_t wwStarts2_; // DHW control starts uint32_t wwWorkM_; // DHW minutes - uint8_t wwSetTemp_; // DHW set temperature - uint8_t wwSelTemp_; // DHW selected temperature - uint8_t wwSelTempLow_; // DHW lower selected temperature - uint8_t wwSelTempOff_; // DHW selected temperature for off position - uint8_t wwSelTempSingle_; // DHW single charge temperature - uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer - uint8_t wwComfort_; // WW comfort mode - uint8_t wwComfort1_; // WW comfort mode RC310 - uint8_t wwCircPump_; // DHW circulation pump available - uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) - uint8_t wwChargeOptimization_; // DHW charge optimization - uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection - uint8_t wwCircMode_; // DHW circulation pump mode - uint8_t wwCirc_; // Circulation on/off - uint16_t wwCurTemp_; // DHW current temperature - uint16_t wwCurTemp2_; // DHW current temperature storage - uint8_t wwCurFlow_; // DHW current flow temp in l/min - uint16_t wwStorageTemp1_; // DHW storage temp 1 - uint16_t wwStorageTemp2_; // DHW storage temp 2 - uint8_t wwActivated_; // DHW activated - uint8_t wwOneTime_; // DHW one time function on/off - uint8_t wwDisinfect_; // DHW disinfection on/off - uint8_t wwCharging_; // DHW charging on/off - uint8_t wwRecharging_; // DHW recharge on/off - uint8_t wwTempOK_; // DHW temperature ok on/off - uint8_t wwActive_; // - uint8_t ww3wayValve_; // 3-way valve on WW - uint8_t wwSetPumpPower_; // ww pump speed/power? - uint8_t wwFlowTempOffset_; // Boiler offset for ww heating - uint8_t wwMaxPower_; // DHW maximum power - uint32_t wwStarts_; // DHW starts - uint32_t wwStarts2_; // DHW control starts - uint32_t wwWorkM_; // DHW minutes int8_t wwHystOn_; int8_t wwHystOff_; uint8_t wwTapActivated_; // maintenance-mode to switch DHW off From 2c0c5ba425445cf716d57c38cc7e731f9aac3f67 Mon Sep 17 00:00:00 2001 From: tp1de Date: Sat, 21 May 2022 13:57:31 +0200 Subject: [PATCH 316/319] emergencyops and emergencytemp for RC310 --- src/devices/boiler.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/devices/boiler.h | 4 ++++ src/locale_EN.h | 2 ++ 3 files changed, 44 insertions(+) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 890ba7beb..e39a3cc45 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -206,6 +206,21 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(maintenanceDate), DeviceValueUOM::NONE, MAKE_CF_CB(set_maintenancedate)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &emergencyOps_, + DeviceValueType::BOOL, + nullptr, FL_(emergencyOps), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_emergency_ops)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &emergencyTemp_, + DeviceValueType::UINT, + nullptr, + FL_(emergencyTemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_emergency_temp), + 40, + 70); /* * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat @@ -784,6 +799,9 @@ void Boiler::process_UBAParametersPlus(std::shared_ptr telegram) has_update(telegram, boilHystOff_, 8); has_update(telegram, boilHystOn_, 9); has_update(telegram, burnMinPeriod_, 10); + has_update(telegram, emergencyOps_, 18); + has_update(telegram, emergencyTemp_, 19); + // has_update(telegram, pumpType_, 11); // guess, RC300 manual: power controlled, pressure controlled 1-4? // has_update(telegram, pumpDelay_, 12); // guess // has_update(telegram, pumpModMax_, 13); // guess @@ -1854,4 +1872,24 @@ bool Boiler::set_pool_temp(const char * value, const int8_t id) { return true; } +bool Boiler::set_emergency_temp(const char * value, const int8_t id) { + int v = 0; + if (!Helpers::value2temperature(value, v)) { + return false; + } + + write_command(EMS_TYPE_UBAParametersPlus, 19, v, EMS_TYPE_UBAParametersPlus); + + return true; +} + +bool Boiler::set_emergency_ops(const char * value, const int8_t id) { + bool v = false; + if (!Helpers::value2bool(value, v)) { + return false; + } + write_command(EMS_TYPE_UBAParametersPlus, 18, v ? 0x01 : 0x00, EMS_TYPE_UBAParametersPlus); + return true; +} + } // namespace emsesp diff --git a/src/devices/boiler.h b/src/devices/boiler.h index b36ad2694..9d8bd85b0 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -134,6 +134,8 @@ class Boiler : public EMSdevice { char lastCode_[50]; // last error code char serviceCode_[4]; // 3 character status/service code uint16_t serviceCodeNumber_; // error/service code + uint8_t emergencyOps_; + uint8_t emergencyTemp_; // info uint32_t upTimeControl_; // Operating time control @@ -278,6 +280,8 @@ class Boiler : public EMSdevice { bool set_ww_hyst_on(const char * value, const int8_t id); bool set_ww_hyst_off(const char * value, const int8_t id); bool set_pool_temp(const char * value, const int8_t id); + bool set_emergency_temp(const char * value, const int8_t id); + bool set_emergency_ops(const char * value, const int8_t id); /* bool set_hybridStrategy(const char * value, const int8_t id); bool set_switchOverTemp(const char * value, const int8_t id); diff --git a/src/locale_EN.h b/src/locale_EN.h index 57653f1af..5ddf6dc1e 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -465,6 +465,8 @@ MAKE_PSTR_LIST(maintenanceMessage, F("maintenancemessage"), F("maintenance messa MAKE_PSTR_LIST(maintenanceDate, F("maintenancedate"), F("next maintenance date")) MAKE_PSTR_LIST(maintenanceType, F_(maintenance), F("maintenance scheduled")) MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("time to next maintenance")) +MAKE_PSTR_LIST(emergencyOps, F("emergencyops"), F("emergency operation")) +MAKE_PSTR_LIST(emergencyTemp, F("emergencytemp"), F("emergency temperature")) // heatpump/compress specific MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("total operating time heat")) From 22668d76eef55f019f7631d120244c08966d4190 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 22 May 2022 13:57:17 +0200 Subject: [PATCH 317/319] upgrade to react18 --- interface/package-lock.json | 4170 ++++++++++------- interface/package.json | 8 +- interface/src/CustomTheme.tsx | 4 +- interface/src/components/SectionContent.tsx | 4 +- interface/src/components/layout/Layout.tsx | 4 +- .../src/components/routing/RequireAdmin.tsx | 3 +- .../routing/RequireAuthenticated.tsx | 4 +- .../routing/RequireUnauthenticated.tsx | 3 +- .../src/components/routing/RouterTabs.tsx | 4 +- .../authentication/Authentication.tsx | 3 +- .../src/contexts/features/FeaturesLoader.tsx | 4 +- interface/src/utils/index.ts | 2 + interface/src/utils/props.ts | 3 + 13 files changed, 2491 insertions(+), 1725 deletions(-) create mode 100644 interface/src/utils/props.ts diff --git a/interface/package-lock.json b/interface/package-lock.json index 60e461923..68db828eb 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -16,8 +16,8 @@ "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", "@types/node": "^17.0.35", - "@types/react": "^17.0.43", - "@types/react-dom": "^17.0.14", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.1.1", "axios": "^0.27.2", @@ -26,9 +26,9 @@ "lodash": "^4.17.21", "notistack": "^2.0.5", "parse-ms": "^3.0.0", - "react": "^17.0.2", + "react": "^18.1.0", "react-app-rewired": "^2.2.1", - "react-dom": "^17.0.2", + "react-dom": "^18.1.0", "react-dropzone": "^14.2.1", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", @@ -42,11 +42,12 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -64,28 +65,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", + "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", + "@babel/generator": "^7.18.0", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -146,18 +147,31 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", - "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.0", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", @@ -182,13 +196,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", + "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", "dependencies": { - "@babel/compat-data": "^7.17.7", + "@babel/compat-data": "^7.17.10", "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "engines": { @@ -199,9 +213,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -219,9 +233,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^5.0.1" @@ -319,9 +333,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -329,8 +343,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" }, "engines": { "node": ">=6.9.0" @@ -348,9 +362,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", "engines": { "node": ">=6.9.0" } @@ -447,22 +461,22 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", + "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -473,9 +487,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", - "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -484,11 +498,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -498,13 +512,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/plugin-proposal-optional-chaining": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -514,11 +528,11 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -530,12 +544,12 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -545,12 +559,12 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -561,15 +575,15 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", - "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.12.tgz", + "integrity": "sha512-gL0qSSeIk/VRfTDgtQg/EtejENssN/r3p5gJsPie1UacwiHibprpr19Z0pcK3XKuqQvjGVxsQ37Tl1MGfXzonA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.9", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.17.0", + "@babel/plugin-syntax-decorators": "^7.17.12", "charcodes": "^0.2.0" }, "engines": { @@ -595,11 +609,11 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -610,11 +624,11 @@ } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -625,11 +639,11 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -640,11 +654,11 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -670,15 +684,15 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -703,11 +717,11 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -719,12 +733,12 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -734,13 +748,13 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -751,12 +765,12 @@ } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=4" @@ -813,11 +827,11 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", - "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz", + "integrity": "sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -849,11 +863,25 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", - "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.17.12.tgz", + "integrity": "sha512-B8QIgBvkIG6G2jgsOHQUist7Sm0EBLDCx8sen072IwqNuzMegZNXrYnSv77cYzA8mLDZAfQYqsLIhimiP1s2HQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -885,11 +913,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", + "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -993,11 +1021,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1007,11 +1035,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1021,12 +1049,12 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8" }, "engines": { @@ -1051,11 +1079,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz", + "integrity": "sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1065,15 +1093,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz", + "integrity": "sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" @@ -1086,11 +1114,11 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1100,11 +1128,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1129,11 +1157,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1158,12 +1186,12 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", - "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.17.12.tgz", + "integrity": "sha512-g8cSNt+cHCpG/uunPQELdq/TeV3eg1OLJYwxypwHtAWo9+nErH3lQx9CSO2uI9lF74A0mR0t4KoMjs1snSgnTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-flow": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-flow": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1173,11 +1201,11 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1203,11 +1231,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1231,12 +1259,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1247,12 +1275,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", + "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", "dependencies": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1264,13 +1292,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", + "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1282,12 +1310,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1297,11 +1325,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1311,11 +1340,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1340,11 +1369,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1368,11 +1397,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz", + "integrity": "sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1396,15 +1425,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", + "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/types": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1428,12 +1457,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz", + "integrity": "sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1443,10 +1472,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", "regenerator-transform": "^0.15.0" }, "engines": { @@ -1457,11 +1487,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1471,12 +1501,12 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", - "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.0.tgz", + "integrity": "sha512-7kM/jJ3DD/y1hDPn0jov12DoUIFsxLiItprhNydUSibxaywaxNqKwq+ODk72J9ePn4LWobIc5ik6TAJhVl8IkQ==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", @@ -1504,11 +1534,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" }, "engines": { @@ -1533,11 +1563,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz", + "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1547,11 +1577,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1561,13 +1591,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.1.tgz", + "integrity": "sha512-F+RJmL479HJmC0KeqqwEGZMg1P7kWArLGbAKfEi9yPthJyMNjF+DjxFF/halfQvq1Q9GFM4TUbYDNV8xe4Ctqg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-typescript": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1606,36 +1636,37 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.0.tgz", + "integrity": "sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==", "dependencies": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1645,44 +1676,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.17.12", "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.0", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.17.12", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", + "@babel/types": "^7.18.0", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, "engines": { @@ -1708,14 +1739,14 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", + "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.17.12", "@babel/plugin-transform-react-jsx-development": "^7.16.7", "@babel/plugin-transform-react-pure-annotations": "^7.16.7" }, @@ -1727,13 +1758,13 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", + "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" + "@babel/plugin-transform-typescript": "^7.17.12" }, "engines": { "node": ">=6.9.0" @@ -1743,9 +1774,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", + "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1754,9 +1785,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", - "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.0.tgz", + "integrity": "sha512-G5FaGZOWORq9zthDjIrjib5XlcddeqLbIiDO3YQsut6j7aGf76xn0umUC/pA6+nApk3hQJF4JzLzg5PCl6ewJg==", "dependencies": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -1779,18 +1810,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", - "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", + "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", + "@babel/generator": "^7.18.0", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.0", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1799,9 +1830,9 @@ } }, "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", + "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1820,6 +1851,25 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.2.tgz", + "integrity": "sha512-n5fSd3N/RTLjwC6TLnHjlVEt5tRg6S6Pu+LpRgXayX0QVJHvlMzE3+R12cd2F0we8WB4OE8o5r5iWgmBPpqUyQ==", + "dependencies": { + "@csstools/selector-specificity": "^1.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, "node_modules/@csstools/postcss-color-function": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", @@ -1854,17 +1904,21 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.1.tgz", + "integrity": "sha512-AMZwWyHbbNLBsDADWmoXT9A5yl5dsGEBeJSJRUJt8Y9n8Ziu7Wstt4MC8jtPW7xjcLecyfJwtnUTNSmOzcnWeg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.4" } }, "node_modules/@csstools/postcss-ic-unit": { @@ -1883,10 +1937,11 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz", - "integrity": "sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.4.tgz", + "integrity": "sha512-T2Tmr5RIxkCEXxHwMVyValqwv3h5FTJPpmU8Mq/HDV+TY6C9srVaNMiMG/sp0QaxUnVQQrnXsuLU+1g2zrLDcQ==", "dependencies": { + "@csstools/selector-specificity": "^1.0.0", "postcss-selector-parser": "^6.0.10" }, "engines": { @@ -1947,6 +2002,55 @@ "postcss": "^8.3" } }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.0.tgz", + "integrity": "sha512-q8c4bs1GumAiRenmFjASBcWSLKrbzHzWl6C2HcaAxAXIiL2rUlUWbqQZUjwVG5tied0rld19j/Mm90K3qI26vw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.1.tgz", + "integrity": "sha512-f1G1WGDXEU/RN1TWAxBPQgQudtLnLQPyiWdtypkPC+mVYNKFKH/HYXSxH4MVNqwF8M0eDsoiU7HumJHCg/L/jg==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-1.0.0.tgz", + "integrity": "sha512-RkYG5KiGNX0fJ5YoI0f4Wfq2Yo74D25Hru4fxTOioYdQvHBxcrrtTTyT5Ozzh2ejcNrhFy7IEts2WyEY7yi5yw==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3", + "postcss-selector-parser": "^6.0.10" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.9.2", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", @@ -2083,18 +2187,18 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", + "espree": "^9.3.2", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { @@ -2107,9 +2211,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2595,6 +2699,17 @@ "node": ">=8" } }, + "node_modules/@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", + "dependencies": { + "@sinclair/typebox": "^0.23.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, "node_modules/@jest/source-map": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", @@ -2820,32 +2935,52 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", - "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "node_modules/@msgpack/msgpack": { "version": "2.7.2", @@ -3119,9 +3254,9 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz", - "integrity": "sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.6.tgz", + "integrity": "sha512-IIWxofIYt/AbMwoeBgj+O2aAXLrlCQVg+A4a2zfpXFNHgP8o8rvi3v+oe5t787Lj+KXlKOh8BAiUp9bhuELXhg==", "dependencies": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -3263,6 +3398,11 @@ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz", "integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==" }, + "node_modules/@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==" + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -3563,6 +3703,34 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@table-library/react-table-library/node_modules/react-virtualized-auto-sizer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", + "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0" + } + }, + "node_modules/@table-library/react-table-library/node_modules/react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3609,9 +3777,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.0.tgz", - "integrity": "sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA==", + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", + "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", "dependencies": { "@babel/types": "^7.3.0" } @@ -3713,9 +3881,9 @@ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "node_modules/@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dependencies": { "@types/node": "*" } @@ -3749,7 +3917,7 @@ "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/lodash": { "version": "4.14.182", @@ -3772,9 +3940,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.1.tgz", + "integrity": "sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw==" }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -3797,9 +3965,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.44", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.44.tgz", - "integrity": "sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==", + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.9.tgz", + "integrity": "sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3807,11 +3975,11 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.15.tgz", - "integrity": "sha512-Tr9VU9DvNoHDWlmecmcsE5ZZiUkYx+nKBzum4Oxe1K0yJVyBlfbq7H3eXjxXqJczBKqPGq3EgfTru4MgKb9+Yw==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.4.tgz", + "integrity": "sha512-FgTtbqPOCI3dzZPZoC2T/sx3L34qxy99ITWn4eoSA95qPyXDMH0ALoAqUp49ITniiJFsXUVBtalh/KffMpg21Q==", "dependencies": { - "@types/react": "^17" + "@types/react": "*" } }, "node_modules/@types/react-is": { @@ -3858,9 +4026,9 @@ } }, "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/@types/scheduler": { "version": "0.16.2", @@ -3924,18 +4092,18 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz", - "integrity": "sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.25.0.tgz", + "integrity": "sha512-icYrFnUzvm+LhW0QeJNKkezBu6tJs9p/53dpPLFH8zoM9w1tfaKzVurkPotEpAqQ8Vf8uaFyL5jHd0Vs6Z0ZQg==", "dependencies": { - "@typescript-eslint/scope-manager": "5.19.0", - "@typescript-eslint/type-utils": "5.19.0", - "@typescript-eslint/utils": "5.19.0", - "debug": "^4.3.2", + "@typescript-eslint/scope-manager": "5.25.0", + "@typescript-eslint/type-utils": "5.25.0", + "@typescript-eslint/utils": "5.25.0", + "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", + "ignore": "^5.2.0", "regexpp": "^3.2.0", - "semver": "^7.3.5", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { @@ -3970,11 +4138,11 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.19.0.tgz", - "integrity": "sha512-F+X/TTzmb2UXbghY1LrNLNDjMcGZMhKzXuzvu0xD+YEB77EamLM7zMOLuz2kP5807IJRDLBoAFFPYa7HT62sYg==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.25.0.tgz", + "integrity": "sha512-YTe9rmslCh1xAvNa3X+uZe4L2lsyb8V3WIeK9z46nNiPswk/V/0SGLJSfo8W9Hj4R7ak7bolazXGn3DErmb8QA==", "dependencies": { - "@typescript-eslint/utils": "5.19.0" + "@typescript-eslint/utils": "5.25.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3988,14 +4156,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.19.0.tgz", - "integrity": "sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.25.0.tgz", + "integrity": "sha512-r3hwrOWYbNKP1nTcIw/aZoH+8bBnh/Lh1iDHoFpyG4DnCpvEdctrSl6LOo19fZbzypjQMHdajolxs6VpYoChgA==", "dependencies": { - "@typescript-eslint/scope-manager": "5.19.0", - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/typescript-estree": "5.19.0", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "5.25.0", + "@typescript-eslint/types": "5.25.0", + "@typescript-eslint/typescript-estree": "5.25.0", + "debug": "^4.3.4" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4014,12 +4182,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", - "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.25.0.tgz", + "integrity": "sha512-p4SKTFWj+2VpreUZ5xMQsBMDdQ9XdRvODKXN4EksyBjFp2YvQdLkyHqOffakYZPuWJUDNu3jVXtHALDyTv3cww==", "dependencies": { - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/visitor-keys": "5.19.0" + "@typescript-eslint/types": "5.25.0", + "@typescript-eslint/visitor-keys": "5.25.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4030,12 +4198,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz", - "integrity": "sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.25.0.tgz", + "integrity": "sha512-B6nb3GK3Gv1Rsb2pqalebe/RyQoyG/WDy9yhj8EE0Ikds4Xa8RR28nHz+wlt4tMZk5bnAr0f3oC8TuDAd5CPrw==", "dependencies": { - "@typescript-eslint/utils": "5.19.0", - "debug": "^4.3.2", + "@typescript-eslint/utils": "5.25.0", + "debug": "^4.3.4", "tsutils": "^3.21.0" }, "engines": { @@ -4055,9 +4223,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", - "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.25.0.tgz", + "integrity": "sha512-7fWqfxr0KNHj75PFqlGX24gWjdV/FDBABXL5dyvBOWHpACGyveok8Uj4ipPX/1fGU63fBkzSIycEje4XsOxUFA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4067,16 +4235,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", - "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.25.0.tgz", + "integrity": "sha512-MrPODKDych/oWs/71LCnuO7NyR681HuBly2uLnX3r5i4ME7q/yBqC4hW33kmxtuauLTM0OuBOhhkFaxCCOjEEw==", "dependencies": { - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/visitor-keys": "5.19.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "5.25.0", + "@typescript-eslint/visitor-keys": "5.25.0", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { @@ -4107,14 +4275,14 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.19.0.tgz", - "integrity": "sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.25.0.tgz", + "integrity": "sha512-qNC9bhnz/n9Kba3yI6HQgQdBLuxDoMgdjzdhSInZh6NaDnFpTUlwNGxplUFWfY260Ya0TRPvkg9dd57qxrJI9g==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.19.0", - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/typescript-estree": "5.19.0", + "@typescript-eslint/scope-manager": "5.25.0", + "@typescript-eslint/types": "5.25.0", + "@typescript-eslint/typescript-estree": "5.25.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4150,12 +4318,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", - "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.25.0.tgz", + "integrity": "sha512-yd26vFgMsC4h2dgX4+LR+GeicSKIfUvZREFLf3DDjZPtqgLx5AJZr6TetMNwFP9hcKreTTeztQYBTNbNoOycwA==", "dependencies": { - "@typescript-eslint/types": "5.19.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "5.25.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4330,9 +4498,9 @@ } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "bin": { "acorn": "bin/acorn" }, @@ -4406,11 +4574,11 @@ } }, "node_modules/address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", + "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", "engines": { - "node": ">= 0.12.0" + "node": ">= 10.0.0" } }, "node_modules/adjust-sourcemap-loader": { @@ -4591,13 +4759,13 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" }, @@ -4650,23 +4818,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.reduce": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" }, "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "node_modules/async-validator": { "version": "4.1.1", @@ -4676,7 +4859,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -4695,9 +4878,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "funding": [ { "type": "opencollective", @@ -4709,8 +4892,8 @@ } ], "dependencies": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4727,11 +4910,11 @@ } }, "node_modules/axe-core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", + "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==", "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/axios": { @@ -4743,19 +4926,6 @@ "form-data": "^4.0.0" } }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -4847,9 +5017,9 @@ } }, "node_modules/babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -5074,7 +5244,7 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "node_modules/bfj": { "version": "7.0.2", @@ -5112,23 +5282,26 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { @@ -5164,9 +5337,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/bonjour-service": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", - "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", + "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -5177,7 +5350,7 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/boxen": { "version": "5.1.2", @@ -5309,9 +5482,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "funding": [ { "type": "opencollective", @@ -5323,10 +5496,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" }, "bin": { @@ -5350,9 +5523,9 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "engines": { "node": ">=6" }, @@ -5363,7 +5536,7 @@ "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } @@ -5479,9 +5652,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "version": "1.0.30001342", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz", + "integrity": "sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA==", "funding": [ { "type": "opencollective", @@ -5578,9 +5751,9 @@ } }, "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==" }, "node_modules/cjs-module-lexer": { "version": "1.2.2", @@ -5855,9 +6028,9 @@ } }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -5868,9 +6041,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/core-js": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.0.tgz", - "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz", + "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5878,11 +6051,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.0.tgz", - "integrity": "sha512-WwA7xbfRGrk8BGaaHlakauVXrlYmAIkk8PNGb1FDQS+Rbrewc3pgFfwJFRw6psmJVAll7Px9UHRYE16oRQnwAQ==", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.5.tgz", + "integrity": "sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg==", "dependencies": { - "browserslist": "^4.20.2", + "browserslist": "^4.20.3", "semver": "7.0.0" }, "funding": { @@ -5899,9 +6072,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.0.tgz", - "integrity": "sha512-ylOC9nVy0ak1N+fPIZj00umoZHgUVqmucklP5RT5N+vJof38klKn8Ze6KGyvchdClvEBr6LcQqJpI216LUMqYA==", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.5.tgz", + "integrity": "sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6205,9 +6378,13 @@ } }, "node_modules/cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==" + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.1.tgz", + "integrity": "sha512-0/nZEYfp8SFEzJkMud8NxZJsGfD7RHDJti6GRBLZptIwAzco6RTx1KgwFl4mGWsYS0ZNbCrsY9QryhQ4ldF3Mg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } }, "node_modules/cssesc": { "version": "3.0.0", @@ -6221,11 +6398,11 @@ } }, "node_modules/cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.9.tgz", + "integrity": "sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg==", "dependencies": { - "cssnano-preset-default": "^5.2.7", + "cssnano-preset-default": "^5.2.9", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -6241,24 +6418,24 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz", + "integrity": "sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw==", "dependencies": { "css-declaration-sorter": "^6.2.2", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", + "postcss-convert-values": "^5.1.1", "postcss-discard-comments": "^5.1.1", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", + "postcss-merge-longhand": "^5.1.5", "postcss-merge-rules": "^5.1.1", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", + "postcss-minify-params": "^5.1.3", "postcss-minify-selectors": "^5.2.0", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -6351,9 +6528,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -6487,17 +6664,21 @@ } }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-newline": { "version": "3.1.0", @@ -6751,11 +6932,11 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", "dependencies": { - "jake": "^10.6.1" + "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" @@ -6765,9 +6946,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.111", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.111.tgz", - "integrity": "sha512-/s3+fwhKf1YK4k7btOImOzCQLpUjS6MaPf0ODTNuT4eTM1Bg4itBpLkydhOzJmpmH6Z9eXFyuuK5czsmzRzwtw==" + "version": "1.4.137", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", + "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" }, "node_modules/emittery": { "version": "0.8.1", @@ -6847,16 +7028,18 @@ } }, "node_modules/es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", @@ -6868,9 +7051,10 @@ "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6879,6 +7063,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -7019,11 +7208,11 @@ } }, "node_modules/eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "dependencies": { - "@eslint/eslintrc": "^1.2.1", + "@eslint/eslintrc": "^1.3.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -7034,14 +7223,14 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", + "espree": "^9.3.2", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -7050,7 +7239,7 @@ "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "regexpp": "^3.2.0", @@ -7310,24 +7499,24 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", + "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.5", "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", + "object.hasown": "^1.1.1", "object.values": "^1.1.5", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" + "string.prototype.matchall": "^4.0.7" }, "engines": { "node": ">=4" @@ -7337,9 +7526,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", + "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", "engines": { "node": ">=10" }, @@ -7371,9 +7560,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.3.1.tgz", - "integrity": "sha512-OfF4dlG/q6ck6DL3P8Z0FPdK0dU5K57gsBu7eUcaVbwYKaNzjgejnXiM9CCUevppORkvfek+9D3Uj/9ZZ8Vz8g==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.0.tgz", + "integrity": "sha512-eWQ19l6uWL7LW8oeMyQVSGjVYFnBqk7DMHjadm0yOHBvX3Xi9OBrsNuxoAMdX4r7wlQ5WWpW46d+CB6FWFL/PQ==", "dependencies": { "@typescript-eslint/utils": "^5.13.0" }, @@ -7528,9 +7717,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "dependencies": { "type-fest": "^0.20.2" }, @@ -7624,12 +7813,12 @@ } }, "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -7811,37 +8000,38 @@ } }, "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -7853,7 +8043,7 @@ "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/express/node_modules/debug": { "version": "2.6.9", @@ -7986,11 +8176,30 @@ } }, "node_modules/filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/filesize": { @@ -8013,16 +8222,16 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -8096,9 +8305,9 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", + "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==", "funding": [ { "type": "individual", @@ -8115,9 +8324,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", - "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -8270,9 +8479,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -8351,15 +8560,32 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "node_modules/functions-have-names": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz", - "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8433,14 +8659,14 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -8617,9 +8843,9 @@ } }, "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8846,18 +9072,18 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-parser-js": { @@ -8987,9 +9213,9 @@ "dev": true }, "node_modules/immer": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", - "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz", + "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -9157,9 +9383,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dependencies": { "has": "^1.0.3" }, @@ -9463,9 +9689,9 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -9543,11 +9769,11 @@ } }, "node_modules/jake": { - "version": "10.8.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz", - "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dependencies": { - "async": "0.9.x", + "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" @@ -9573,11 +9799,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jake/node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -11066,14 +11287,14 @@ } }, "node_modules/jest-watch-typeahead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz", - "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", - "jest-regex-util": "^27.0.0", - "jest-watcher": "^27.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", "slash": "^4.0.0", "string-length": "^5.0.1", "strip-ansi": "^7.0.1" @@ -11082,18 +11303,69 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "jest": "^27.0.0" + "jest": "^27.0.0 || ^28.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.0.tgz", + "integrity": "sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==", + "dependencies": { + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.0", + "jest-util": "^28.1.0", + "slash": "^3.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.0.tgz", + "integrity": "sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==", + "dependencies": { + "@jest/console": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.0.tgz", + "integrity": "sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==", + "dependencies": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dependencies": { + "@types/yargs-parser": "*" } }, "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { @@ -11125,14 +11397,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "engines": { - "node": ">=12.20" - } - }, "node_modules/jest-watch-typeahead/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -11149,6 +11413,17 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, "node_modules/jest-watch-typeahead/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11157,6 +11432,128 @@ "node": ">=8" } }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.0.tgz", + "integrity": "sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.0.tgz", + "integrity": "sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==", + "dependencies": { + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.0.tgz", + "integrity": "sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==", + "dependencies": { + "@jest/test-result": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", + "integrity": "sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==", + "dependencies": { + "@jest/schemas": "^28.0.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==" + }, "node_modules/jest-watch-typeahead/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -11183,6 +11580,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "engines": { + "node": ">=12.20" + } + }, "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -11197,6 +11602,17 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/jest-watch-typeahead/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11386,6 +11802,19 @@ } } }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -11406,7 +11835,8 @@ "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -11459,9 +11889,9 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", - "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz", + "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==", "dependencies": { "array-includes": "^3.1.4", "object.assign": "^4.1.2" @@ -11751,9 +12181,9 @@ } }, "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", + "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", "dependencies": { "fs-monkey": "1.0.3" }, @@ -11965,9 +12395,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -11977,9 +12407,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12034,9 +12464,9 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node_modules/node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" }, "node_modules/nodemon": { "version": "2.0.16", @@ -12253,9 +12683,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", + "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12315,13 +12745,14 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", "dependencies": { + "array.prototype.reduce": "^1.0.4", "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" }, "engines": { "node": ">= 0.8" @@ -12331,12 +12762,12 @@ } }, "node_modules/object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12364,9 +12795,9 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -12474,11 +12905,11 @@ } }, "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dependencies": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" }, "engines": { @@ -12797,31 +13228,10 @@ "node": ">=4" } }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "funding": [ { "type": "opencollective", @@ -12833,7 +13243,7 @@ } ], "dependencies": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -12891,15 +13301,19 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz", + "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { "postcss": "^8.4" } @@ -12950,10 +13364,11 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz", + "integrity": "sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q==", "dependencies": { + "browserslist": "^4.20.3", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -13308,9 +13723,9 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", + "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" @@ -13370,9 +13785,9 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", "dependencies": { "browserslist": "^4.16.6", "cssnano-utils": "^3.1.0", @@ -13473,10 +13888,11 @@ } }, "node_modules/postcss-nesting": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", - "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz", + "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==", "dependencies": { + "@csstools/selector-specificity": "1.0.0", "postcss-selector-parser": "^6.0.10" }, "engines": { @@ -13699,31 +14115,34 @@ } }, "node_modules/postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.6.0.tgz", + "integrity": "sha512-5cnzpSFZnQJOlBu85xn4Nnluy/WjIST/ugn+gOVcKnmFJ+GLtkfRhmJPo/TW9UDpG7oyA467kvDOO8mtcpOL4g==", "dependencies": { - "@csstools/postcss-color-function": "^1.0.3", + "@csstools/postcss-cascade-layers": "^1.0.1", + "@csstools/postcss-color-function": "^1.1.0", "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.1", "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.4", "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", + "@csstools/postcss-oklab-function": "^1.1.0", "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", + "@csstools/postcss-stepped-value-functions": "^1.0.0", + "@csstools/postcss-unset-value": "^1.0.1", + "autoprefixer": "^10.4.7", + "browserslist": "^4.20.3", "css-blank-pseudo": "^3.0.3", "css-has-pseudo": "^3.0.4", "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", + "cssdb": "^6.6.1", "postcss-attribute-case-insensitive": "^5.0.0", "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^4.2.2", "postcss-color-hex-alpha": "^8.0.3", "postcss-color-rebeccapurple": "^7.0.2", "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", + "postcss-custom-properties": "^12.1.7", "postcss-custom-selectors": "^6.0.0", "postcss-dir-pseudo-class": "^6.0.4", "postcss-double-position-gradients": "^3.1.1", @@ -13734,15 +14153,15 @@ "postcss-gap-properties": "^3.0.3", "postcss-image-set-function": "^4.0.6", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", + "postcss-lab-function": "^4.2.0", "postcss-logical": "^5.0.4", "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", + "postcss-nesting": "^10.1.6", "postcss-opacity-percentage": "^1.1.2", "postcss-overflow-shorthand": "^3.0.3", "postcss-page-break": "^3.0.4", "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", + "postcss-pseudo-class-any-link": "^7.1.4", "postcss-replace-overflow-wrap": "^4.0.0", "postcss-selector-not": "^5.0.0", "postcss-value-parser": "^4.2.0" @@ -13750,14 +14169,18 @@ "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", - "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.4.tgz", + "integrity": "sha512-JxRcLXm96u14N3RzFavPIE9cRPuOqLDuzKeBsqi4oRk4vt8n0A7I0plFs/VXTg7U2n7g/XkQi0OwqTO3VWBfEg==", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14091,9 +14514,12 @@ } }, "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" }, @@ -14156,12 +14582,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -14213,12 +14639,11 @@ } }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz", + "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -14423,16 +14848,15 @@ } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz", + "integrity": "sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.22.0" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.1.0" } }, "node_modules/react-dropzone": { @@ -14602,34 +15026,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", - "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0" - } - }, - "node_modules/react-window": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", - "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - }, - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -15016,9 +15412,9 @@ } }, "node_modules/rollup": { - "version": "2.70.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz", - "integrity": "sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==", + "version": "2.74.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.74.1.tgz", + "integrity": "sha512-K2zW7kV8Voua5eGkbnBtWYfMIhYhT9Pel2uhBk2WO5eMee161nPze/XRfvEQPFYz7KgrCCnmh2Wy0AMFLGGmMA==", "bin": { "rollup": "dist/bin/rollup" }, @@ -15174,12 +15570,11 @@ } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", + "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { @@ -15236,23 +15631,23 @@ } }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -15309,6 +15704,14 @@ "ms": "2.0.0" } }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -15338,15 +15741,23 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -15587,11 +15998,11 @@ "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/string_decoder": { @@ -15692,24 +16103,26 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16074,13 +16487,13 @@ } }, "node_modules/terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz", + "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", "dependencies": { "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", + "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "bin": { @@ -16137,13 +16550,39 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, "engines": { "node": ">= 8" } }, + "node_modules/terser/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/terser/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/terser/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -16379,13 +16818,13 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { @@ -16748,9 +17187,9 @@ } }, "node_modules/webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -16761,13 +17200,13 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", @@ -16794,12 +17233,12 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.1", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -16865,9 +17304,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", - "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", + "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -16889,7 +17328,6 @@ "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", @@ -16964,9 +17402,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", + "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", "engines": { "node": ">=10.0.0" }, @@ -17618,11 +18056,12 @@ }, "dependencies": { "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { @@ -17634,25 +18073,25 @@ } }, "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" }, "@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", + "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", + "@babel/generator": "^7.18.0", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.0", + "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -17692,13 +18131,25 @@ } }, "@babel/generator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", - "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", + "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.0", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/helper-annotate-as-pure": { @@ -17719,20 +18170,20 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", + "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", "requires": { - "@babel/compat-data": "^7.17.7", + "@babel/compat-data": "^7.17.10", "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "browserslist": "^4.20.2", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -17744,9 +18195,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^5.0.1" @@ -17817,9 +18268,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -17827,8 +18278,8 @@ "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/helper-optimise-call-expression": { @@ -17840,9 +18291,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" }, "@babel/helper-remap-async-to-generator": { "version": "7.16.8", @@ -17912,19 +18363,19 @@ } }, "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", + "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -17932,67 +18383,67 @@ } }, "@babel/parser": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", - "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/plugin-proposal-optional-chaining": "^7.17.12" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", - "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.12.tgz", + "integrity": "sha512-gL0qSSeIk/VRfTDgtQg/EtejENssN/r3p5gJsPie1UacwiHibprpr19Z0pcK3XKuqQvjGVxsQ37Tl1MGfXzonA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.9", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/plugin-syntax-decorators": "^7.17.0", + "@babel/plugin-syntax-decorators": "^7.17.12", "charcodes": "^0.2.0" } }, @@ -18006,38 +18457,38 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, @@ -18051,15 +18502,15 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "@babel/plugin-transform-parameters": "^7.17.12" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -18072,42 +18523,42 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-async-generators": { @@ -18143,11 +18594,11 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz", - "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz", + "integrity": "sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-dynamic-import": { @@ -18167,11 +18618,19 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", - "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.17.12.tgz", + "integrity": "sha512-B8QIgBvkIG6G2jgsOHQUist7Sm0EBLDCx8sen072IwqNuzMegZNXrYnSv77cYzA8mLDZAfQYqsLIhimiP1s2HQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-import-meta": { @@ -18191,11 +18650,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", + "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -18263,28 +18722,28 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "requires": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-remap-async-to-generator": "^7.16.8" } }, @@ -18297,42 +18756,42 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz", + "integrity": "sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz", + "integrity": "sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-dotall-regex": { @@ -18345,11 +18804,11 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -18362,20 +18821,20 @@ } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", - "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.17.12.tgz", + "integrity": "sha512-g8cSNt+cHCpG/uunPQELdq/TeV3eg1OLJYwxypwHtAWo9+nErH3lQx9CSO2uI9lF74A0mR0t4KoMjs1snSgnTw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-flow": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-flow": "^7.17.12" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-function-name": { @@ -18389,11 +18848,11 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-member-expression-literals": { @@ -18405,61 +18864,62 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", + "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", + "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", - "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-object-super": { @@ -18472,11 +18932,11 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-property-literals": { @@ -18488,11 +18948,11 @@ } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz", + "integrity": "sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-react-display-name": { @@ -18504,15 +18964,15 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", + "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/types": "^7.17.12" } }, "@babel/plugin-transform-react-jsx-development": { @@ -18524,37 +18984,38 @@ } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz", + "integrity": "sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "requires": { + "@babel/helper-plugin-utils": "^7.17.12", "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-runtime": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", - "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.0.tgz", + "integrity": "sha512-7kM/jJ3DD/y1hDPn0jov12DoUIFsxLiItprhNydUSibxaywaxNqKwq+ODk72J9ePn4LWobIc5ik6TAJhVl8IkQ==", "requires": { "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", @@ -18570,11 +19031,11 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, @@ -18587,29 +19048,29 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz", + "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.1.tgz", + "integrity": "sha512-F+RJmL479HJmC0KeqqwEGZMg1P7kWArLGbAKfEi9yPthJyMNjF+DjxFF/halfQvq1Q9GFM4TUbYDNV8xe4Ctqg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-typescript": "^7.17.12" } }, "@babel/plugin-transform-unicode-escapes": { @@ -18630,36 +19091,37 @@ } }, "@babel/preset-env": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", - "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.0.tgz", + "integrity": "sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==", "requires": { - "@babel/compat-data": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -18669,44 +19131,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.17.12", "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-modules-systemjs": "^7.16.7", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", - "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.0", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.16.7", - "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.17.12", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.8", + "@babel/types": "^7.18.0", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.20.2", + "core-js-compat": "^3.22.1", "semver": "^6.3.0" } }, @@ -18723,40 +19185,40 @@ } }, "@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", + "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.17.12", "@babel/plugin-transform-react-jsx-development": "^7.16.7", "@babel/plugin-transform-react-pure-annotations": "^7.16.7" } }, "@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", + "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" + "@babel/plugin-transform-typescript": "^7.17.12" } }, "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", + "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", - "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.0.tgz", + "integrity": "sha512-G5FaGZOWORq9zthDjIrjib5XlcddeqLbIiDO3YQsut6j7aGf76xn0umUC/pA6+nApk3hQJF4JzLzg5PCl6ewJg==", "requires": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -18773,26 +19235,26 @@ } }, "@babel/traverse": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", - "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", + "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", + "@babel/generator": "^7.18.0", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.0", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", + "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -18808,6 +19270,15 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" }, + "@csstools/postcss-cascade-layers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.2.tgz", + "integrity": "sha512-n5fSd3N/RTLjwC6TLnHjlVEt5tRg6S6Pu+LpRgXayX0QVJHvlMzE3+R12cd2F0we8WB4OE8o5r5iWgmBPpqUyQ==", + "requires": { + "@csstools/selector-specificity": "^1.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, "@csstools/postcss-color-function": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", @@ -18826,9 +19297,9 @@ } }, "@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.1.tgz", + "integrity": "sha512-AMZwWyHbbNLBsDADWmoXT9A5yl5dsGEBeJSJRUJt8Y9n8Ziu7Wstt4MC8jtPW7xjcLecyfJwtnUTNSmOzcnWeg==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -18843,10 +19314,11 @@ } }, "@csstools/postcss-is-pseudo-class": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz", - "integrity": "sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.4.tgz", + "integrity": "sha512-T2Tmr5RIxkCEXxHwMVyValqwv3h5FTJPpmU8Mq/HDV+TY6C9srVaNMiMG/sp0QaxUnVQQrnXsuLU+1g2zrLDcQ==", "requires": { + "@csstools/selector-specificity": "^1.0.0", "postcss-selector-parser": "^6.0.10" } }, @@ -18875,6 +19347,26 @@ "postcss-value-parser": "^4.2.0" } }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.0.tgz", + "integrity": "sha512-q8c4bs1GumAiRenmFjASBcWSLKrbzHzWl6C2HcaAxAXIiL2rUlUWbqQZUjwVG5tied0rld19j/Mm90K3qI26vw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.1.tgz", + "integrity": "sha512-f1G1WGDXEU/RN1TWAxBPQgQudtLnLQPyiWdtypkPC+mVYNKFKH/HYXSxH4MVNqwF8M0eDsoiU7HumJHCg/L/jg==", + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-1.0.0.tgz", + "integrity": "sha512-RkYG5KiGNX0fJ5YoI0f4Wfq2Yo74D25Hru4fxTOioYdQvHBxcrrtTTyT5Ozzh2ejcNrhFy7IEts2WyEY7yi5yw==", + "requires": {} + }, "@emotion/babel-plugin": { "version": "11.9.2", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", @@ -18983,18 +19475,18 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", + "espree": "^9.3.2", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { @@ -19004,9 +19496,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "requires": { "type-fest": "^0.20.2" } @@ -19357,6 +19849,14 @@ } } }, + "@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", + "requires": { + "@sinclair/typebox": "^0.23.3" + } + }, "@jest/source-map": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", @@ -19525,29 +20025,43 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" + }, + "@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" }, "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@leichtgewicht/ip-codec": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", - "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "@msgpack/msgpack": { "version": "2.7.2", @@ -19673,9 +20187,9 @@ } }, "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz", - "integrity": "sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.6.tgz", + "integrity": "sha512-IIWxofIYt/AbMwoeBgj+O2aAXLrlCQVg+A4a2zfpXFNHgP8o8rvi3v+oe5t787Lj+KXlKOh8BAiUp9bhuELXhg==", "requires": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -19753,6 +20267,11 @@ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz", "integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==" }, + "@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -19940,6 +20459,23 @@ "clsx": "1.1.1", "react-virtualized-auto-sizer": "1.0.6", "react-window": "1.8.6" + }, + "dependencies": { + "react-virtualized-auto-sizer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", + "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", + "requires": {} + }, + "react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + } } }, "@tootallnate/once": { @@ -19982,9 +20518,9 @@ } }, "@types/babel__traverse": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.0.tgz", - "integrity": "sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA==", + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", + "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", "requires": { "@babel/types": "^7.3.0" } @@ -20086,9 +20622,9 @@ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "requires": { "@types/node": "*" } @@ -20122,7 +20658,7 @@ "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "@types/lodash": { "version": "4.14.182", @@ -20145,9 +20681,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.1.tgz", + "integrity": "sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw==" }, "@types/prop-types": { "version": "15.7.5", @@ -20170,9 +20706,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.44", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.44.tgz", - "integrity": "sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==", + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.9.tgz", + "integrity": "sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -20180,11 +20716,11 @@ } }, "@types/react-dom": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.15.tgz", - "integrity": "sha512-Tr9VU9DvNoHDWlmecmcsE5ZZiUkYx+nKBzum4Oxe1K0yJVyBlfbq7H3eXjxXqJczBKqPGq3EgfTru4MgKb9+Yw==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.4.tgz", + "integrity": "sha512-FgTtbqPOCI3dzZPZoC2T/sx3L34qxy99ITWn4eoSA95qPyXDMH0ALoAqUp49ITniiJFsXUVBtalh/KffMpg21Q==", "requires": { - "@types/react": "^17" + "@types/react": "*" } }, "@types/react-is": { @@ -20231,9 +20767,9 @@ } }, "@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "@types/scheduler": { "version": "0.16.2", @@ -20297,18 +20833,18 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz", - "integrity": "sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.25.0.tgz", + "integrity": "sha512-icYrFnUzvm+LhW0QeJNKkezBu6tJs9p/53dpPLFH8zoM9w1tfaKzVurkPotEpAqQ8Vf8uaFyL5jHd0Vs6Z0ZQg==", "requires": { - "@typescript-eslint/scope-manager": "5.19.0", - "@typescript-eslint/type-utils": "5.19.0", - "@typescript-eslint/utils": "5.19.0", - "debug": "^4.3.2", + "@typescript-eslint/scope-manager": "5.25.0", + "@typescript-eslint/type-utils": "5.25.0", + "@typescript-eslint/utils": "5.25.0", + "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", + "ignore": "^5.2.0", "regexpp": "^3.2.0", - "semver": "^7.3.5", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { @@ -20323,59 +20859,59 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.19.0.tgz", - "integrity": "sha512-F+X/TTzmb2UXbghY1LrNLNDjMcGZMhKzXuzvu0xD+YEB77EamLM7zMOLuz2kP5807IJRDLBoAFFPYa7HT62sYg==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.25.0.tgz", + "integrity": "sha512-YTe9rmslCh1xAvNa3X+uZe4L2lsyb8V3WIeK9z46nNiPswk/V/0SGLJSfo8W9Hj4R7ak7bolazXGn3DErmb8QA==", "requires": { - "@typescript-eslint/utils": "5.19.0" + "@typescript-eslint/utils": "5.25.0" } }, "@typescript-eslint/parser": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.19.0.tgz", - "integrity": "sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.25.0.tgz", + "integrity": "sha512-r3hwrOWYbNKP1nTcIw/aZoH+8bBnh/Lh1iDHoFpyG4DnCpvEdctrSl6LOo19fZbzypjQMHdajolxs6VpYoChgA==", "requires": { - "@typescript-eslint/scope-manager": "5.19.0", - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/typescript-estree": "5.19.0", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "5.25.0", + "@typescript-eslint/types": "5.25.0", + "@typescript-eslint/typescript-estree": "5.25.0", + "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", - "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.25.0.tgz", + "integrity": "sha512-p4SKTFWj+2VpreUZ5xMQsBMDdQ9XdRvODKXN4EksyBjFp2YvQdLkyHqOffakYZPuWJUDNu3jVXtHALDyTv3cww==", "requires": { - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/visitor-keys": "5.19.0" + "@typescript-eslint/types": "5.25.0", + "@typescript-eslint/visitor-keys": "5.25.0" } }, "@typescript-eslint/type-utils": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz", - "integrity": "sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.25.0.tgz", + "integrity": "sha512-B6nb3GK3Gv1Rsb2pqalebe/RyQoyG/WDy9yhj8EE0Ikds4Xa8RR28nHz+wlt4tMZk5bnAr0f3oC8TuDAd5CPrw==", "requires": { - "@typescript-eslint/utils": "5.19.0", - "debug": "^4.3.2", + "@typescript-eslint/utils": "5.25.0", + "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", - "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==" + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.25.0.tgz", + "integrity": "sha512-7fWqfxr0KNHj75PFqlGX24gWjdV/FDBABXL5dyvBOWHpACGyveok8Uj4ipPX/1fGU63fBkzSIycEje4XsOxUFA==" }, "@typescript-eslint/typescript-estree": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", - "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.25.0.tgz", + "integrity": "sha512-MrPODKDych/oWs/71LCnuO7NyR681HuBly2uLnX3r5i4ME7q/yBqC4hW33kmxtuauLTM0OuBOhhkFaxCCOjEEw==", "requires": { - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/visitor-keys": "5.19.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "5.25.0", + "@typescript-eslint/visitor-keys": "5.25.0", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { @@ -20390,14 +20926,14 @@ } }, "@typescript-eslint/utils": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.19.0.tgz", - "integrity": "sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.25.0.tgz", + "integrity": "sha512-qNC9bhnz/n9Kba3yI6HQgQdBLuxDoMgdjzdhSInZh6NaDnFpTUlwNGxplUFWfY260Ya0TRPvkg9dd57qxrJI9g==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.19.0", - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/typescript-estree": "5.19.0", + "@typescript-eslint/scope-manager": "5.25.0", + "@typescript-eslint/types": "5.25.0", + "@typescript-eslint/typescript-estree": "5.25.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -20419,12 +20955,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", - "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.25.0.tgz", + "integrity": "sha512-yd26vFgMsC4h2dgX4+LR+GeicSKIfUvZREFLf3DDjZPtqgLx5AJZr6TetMNwFP9hcKreTTeztQYBTNbNoOycwA==", "requires": { - "@typescript-eslint/types": "5.19.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "5.25.0", + "eslint-visitor-keys": "^3.3.0" } }, "@webassemblyjs/ast": { @@ -20589,9 +21125,9 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" }, "acorn-globals": { "version": "6.0.0", @@ -20644,9 +21180,9 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", + "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==" }, "adjust-sourcemap-loader": { "version": "4.0.0", @@ -20780,13 +21316,13 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" } @@ -20818,23 +21354,32 @@ "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.reduce": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" }, "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" - } + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "async-validator": { "version": "4.1.1", @@ -20844,7 +21389,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "at-least-node": { "version": "1.0.0", @@ -20857,12 +21402,12 @@ "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" }, "autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "requires": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -20870,9 +21415,9 @@ } }, "axe-core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==" + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", + "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==" }, "axios": { "version": "0.27.2", @@ -20881,18 +21426,6 @@ "requires": { "follow-redirects": "^1.14.9", "form-data": "^4.0.0" - }, - "dependencies": { - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } } }, "axobject-query": { @@ -20961,9 +21494,9 @@ } }, "babel-loader": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", - "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "requires": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -21145,7 +21678,7 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "bfj": { "version": "7.0.2", @@ -21174,20 +21707,22 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "bytes": { @@ -21219,9 +21754,9 @@ } }, "bonjour-service": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", - "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", + "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", "requires": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -21232,7 +21767,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "boxen": { "version": "5.1.2", @@ -21330,14 +21865,14 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" } }, @@ -21355,14 +21890,14 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, "cacheable-request": { "version": "6.1.0", @@ -21447,9 +21982,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" + "version": "1.0.30001342", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz", + "integrity": "sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -21509,9 +22044,9 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==" }, "cjs-module-lexer": { "version": "1.2.2", @@ -21729,9 +22264,9 @@ } }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", @@ -21739,16 +22274,16 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-js": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.0.tgz", - "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==" + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz", + "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==" }, "core-js-compat": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.0.tgz", - "integrity": "sha512-WwA7xbfRGrk8BGaaHlakauVXrlYmAIkk8PNGb1FDQS+Rbrewc3pgFfwJFRw6psmJVAll7Px9UHRYE16oRQnwAQ==", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.5.tgz", + "integrity": "sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg==", "requires": { - "browserslist": "^4.20.2", + "browserslist": "^4.20.3", "semver": "7.0.0" }, "dependencies": { @@ -21760,9 +22295,9 @@ } }, "core-js-pure": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.0.tgz", - "integrity": "sha512-ylOC9nVy0ak1N+fPIZj00umoZHgUVqmucklP5RT5N+vJof38klKn8Ze6KGyvchdClvEBr6LcQqJpI216LUMqYA==" + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.5.tgz", + "integrity": "sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA==" }, "core-util-is": { "version": "1.0.3", @@ -21954,9 +22489,9 @@ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==" + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.1.tgz", + "integrity": "sha512-0/nZEYfp8SFEzJkMud8NxZJsGfD7RHDJti6GRBLZptIwAzco6RTx1KgwFl4mGWsYS0ZNbCrsY9QryhQ4ldF3Mg==" }, "cssesc": { "version": "3.0.0", @@ -21964,34 +22499,34 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.9.tgz", + "integrity": "sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg==", "requires": { - "cssnano-preset-default": "^5.2.7", + "cssnano-preset-default": "^5.2.9", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz", + "integrity": "sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw==", "requires": { "css-declaration-sorter": "^6.2.2", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", + "postcss-convert-values": "^5.1.1", "postcss-discard-comments": "^5.1.1", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", + "postcss-merge-longhand": "^5.1.5", "postcss-merge-rules": "^5.1.1", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", + "postcss-minify-params": "^5.1.3", "postcss-minify-selectors": "^5.2.0", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -22065,9 +22600,9 @@ } }, "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "damerau-levenshtein": { "version": "1.0.8", @@ -22166,14 +22701,14 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-newline": { "version": "3.1.0", @@ -22373,17 +22908,17 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", "requires": { - "jake": "^10.6.1" + "jake": "^10.8.5" } }, "electron-to-chromium": { - "version": "1.4.111", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.111.tgz", - "integrity": "sha512-/s3+fwhKf1YK4k7btOImOzCQLpUjS6MaPf0ODTNuT4eTM1Bg4itBpLkydhOzJmpmH6Z9eXFyuuK5czsmzRzwtw==" + "version": "1.4.137", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", + "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" }, "emittery": { "version": "0.8.1", @@ -22445,16 +22980,18 @@ } }, "es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", @@ -22466,11 +23003,17 @@ "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" } }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -22571,11 +23114,11 @@ } }, "eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "requires": { - "@eslint/eslintrc": "^1.2.1", + "@eslint/eslintrc": "^1.3.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -22586,14 +23129,14 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", + "espree": "^9.3.2", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -22602,7 +23145,7 @@ "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "regexpp": "^3.2.0", @@ -22666,9 +23209,9 @@ } }, "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "requires": { "type-fest": "^0.20.2" } @@ -22909,24 +23452,24 @@ } }, "eslint-plugin-react": { - "version": "7.29.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", - "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", + "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", "requires": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.5", "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", + "object.hasown": "^1.1.1", "object.values": "^1.1.5", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" + "string.prototype.matchall": "^4.0.7" }, "dependencies": { "doctrine": { @@ -22949,15 +23492,15 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz", + "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==", "requires": {} }, "eslint-plugin-testing-library": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.3.1.tgz", - "integrity": "sha512-OfF4dlG/q6ck6DL3P8Z0FPdK0dU5K57gsBu7eUcaVbwYKaNzjgejnXiM9CCUevppORkvfek+9D3Uj/9ZZ8Vz8g==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.0.tgz", + "integrity": "sha512-eWQ19l6uWL7LW8oeMyQVSGjVYFnBqk7DMHjadm0yOHBvX3Xi9OBrsNuxoAMdX4r7wlQ5WWpW46d+CB6FWFL/PQ==", "requires": { "@typescript-eslint/utils": "^5.13.0" } @@ -23004,12 +23547,12 @@ } }, "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } }, @@ -23135,37 +23678,38 @@ } }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -23174,7 +23718,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "debug": { "version": "2.6.9", @@ -23273,11 +23817,29 @@ } }, "filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "filesize": { @@ -23294,16 +23856,16 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -23361,14 +23923,14 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", + "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==" }, "fork-ts-checker-webpack-plugin": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", - "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -23465,9 +24027,9 @@ } }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -23520,15 +24082,26 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "functions-have-names": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz", - "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "gensync": { "version": "1.0.0-beta.2", @@ -23575,14 +24148,14 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -23715,9 +24288,9 @@ } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" }, "has-flag": { "version": "3.0.0", @@ -23892,14 +24465,14 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" } }, @@ -23993,9 +24566,9 @@ "dev": true }, "immer": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", - "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==" + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz", + "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==" }, "import-fresh": { "version": "3.3.0", @@ -24113,9 +24686,9 @@ } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "requires": { "has": "^1.0.3" } @@ -24308,9 +24881,9 @@ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" }, "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -24371,11 +24944,11 @@ } }, "jake": { - "version": "10.8.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz", - "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "requires": { - "async": "0.9.x", + "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" @@ -24389,11 +24962,6 @@ "color-convert": "^2.0.1" } }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -25477,23 +26045,70 @@ } }, "jest-watch-typeahead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz", - "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", "requires": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", - "jest-regex-util": "^27.0.0", - "jest-watcher": "^27.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", "slash": "^4.0.0", "string-length": "^5.0.1", "strip-ansi": "^7.0.1" }, "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + "@jest/console": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.0.tgz", + "integrity": "sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==", + "requires": { + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.0", + "jest-util": "^28.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "@jest/test-result": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.0.tgz", + "integrity": "sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==", + "requires": { + "@jest/console": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.0.tgz", + "integrity": "sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==", + "requires": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "requires": { + "@types/yargs-parser": "*" + } }, "ansi-styles": { "version": "4.3.0", @@ -25512,11 +26127,6 @@ "supports-color": "^7.1.0" } }, - "char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -25530,11 +26140,114 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==" + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "jest-message-util": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.0.tgz", + "integrity": "sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" + }, + "jest-util": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.0.tgz", + "integrity": "sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==", + "requires": { + "@jest/types": "^28.1.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-watcher": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.0.tgz", + "integrity": "sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==", + "requires": { + "@jest/test-result": "^28.1.0", + "@jest/types": "^28.1.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.0", + "string-length": "^4.0.1" + }, + "dependencies": { + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "pretty-format": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", + "integrity": "sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==", + "requires": { + "@jest/schemas": "^28.0.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==" + }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -25547,6 +26260,13 @@ "requires": { "char-regex": "^2.0.0", "strip-ansi": "^7.0.1" + }, + "dependencies": { + "char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" + } } }, "strip-ansi": { @@ -25555,6 +26275,13 @@ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "requires": { "ansi-regex": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + } } }, "supports-color": { @@ -25697,6 +26424,18 @@ "whatwg-url": "^8.5.0", "ws": "^7.4.6", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "jsesc": { @@ -25713,7 +26452,8 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -25755,9 +26495,9 @@ "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==" }, "jsx-ast-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", - "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz", + "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==", "requires": { "array-includes": "^3.1.4", "object.assign": "^4.1.2" @@ -25986,9 +26726,9 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", + "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", "requires": { "fs-monkey": "1.0.3" } @@ -26139,18 +26879,18 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "requires": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, "nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "natural-compare": { "version": "1.4.0", @@ -26193,9 +26933,9 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" }, "nodemon": { "version": "2.0.16", @@ -26341,9 +27081,9 @@ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" }, "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", + "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==" }, "object-keys": { "version": "1.1.1", @@ -26382,22 +27122,23 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", "requires": { + "array.prototype.reduce": "^1.0.4", "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" } }, "object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "object.values": { @@ -26416,9 +27157,9 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -26490,11 +27231,11 @@ } }, "p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "requires": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" } }, @@ -26721,32 +27462,12 @@ } } }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "requires": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -26783,9 +27504,9 @@ } }, "postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz", + "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -26818,10 +27539,11 @@ } }, "postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz", + "integrity": "sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q==", "requires": { + "browserslist": "^4.20.3", "postcss-value-parser": "^4.2.0" } }, @@ -27015,9 +27737,9 @@ "requires": {} }, "postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", + "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", "requires": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" @@ -27053,9 +27775,9 @@ } }, "postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", "requires": { "browserslist": "^4.16.6", "cssnano-utils": "^3.1.0", @@ -27111,10 +27833,11 @@ } }, "postcss-nesting": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", - "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz", + "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==", "requires": { + "@csstools/selector-specificity": "1.0.0", "postcss-selector-parser": "^6.0.10" } }, @@ -27235,31 +27958,34 @@ } }, "postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.6.0.tgz", + "integrity": "sha512-5cnzpSFZnQJOlBu85xn4Nnluy/WjIST/ugn+gOVcKnmFJ+GLtkfRhmJPo/TW9UDpG7oyA467kvDOO8mtcpOL4g==", "requires": { - "@csstools/postcss-color-function": "^1.0.3", + "@csstools/postcss-cascade-layers": "^1.0.1", + "@csstools/postcss-color-function": "^1.1.0", "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.1", "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.4", "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", + "@csstools/postcss-oklab-function": "^1.1.0", "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", + "@csstools/postcss-stepped-value-functions": "^1.0.0", + "@csstools/postcss-unset-value": "^1.0.1", + "autoprefixer": "^10.4.7", + "browserslist": "^4.20.3", "css-blank-pseudo": "^3.0.3", "css-has-pseudo": "^3.0.4", "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", + "cssdb": "^6.6.1", "postcss-attribute-case-insensitive": "^5.0.0", "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^4.2.2", "postcss-color-hex-alpha": "^8.0.3", "postcss-color-rebeccapurple": "^7.0.2", "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", + "postcss-custom-properties": "^12.1.7", "postcss-custom-selectors": "^6.0.0", "postcss-dir-pseudo-class": "^6.0.4", "postcss-double-position-gradients": "^3.1.1", @@ -27270,24 +27996,24 @@ "postcss-gap-properties": "^3.0.3", "postcss-image-set-function": "^4.0.6", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", + "postcss-lab-function": "^4.2.0", "postcss-logical": "^5.0.4", "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", + "postcss-nesting": "^10.1.6", "postcss-opacity-percentage": "^1.1.2", "postcss-overflow-shorthand": "^3.0.3", "postcss-page-break": "^3.0.4", "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", + "postcss-pseudo-class-any-link": "^7.1.4", "postcss-replace-overflow-wrap": "^4.0.0", "postcss-selector-not": "^5.0.0", "postcss-value-parser": "^4.2.0" } }, "postcss-pseudo-class-any-link": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", - "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.4.tgz", + "integrity": "sha512-JxRcLXm96u14N3RzFavPIE9cRPuOqLDuzKeBsqi4oRk4vt8n0A7I0plFs/VXTg7U2n7g/XkQi0OwqTO3VWBfEg==", "requires": { "postcss-selector-parser": "^6.0.10" } @@ -27532,9 +28258,12 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } }, "queue-microtask": { "version": "1.2.3", @@ -27568,12 +28297,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -27614,12 +28343,11 @@ } }, "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.1.0.tgz", + "integrity": "sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "react-app-polyfill": { @@ -27768,13 +28496,12 @@ } }, "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz", + "integrity": "sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==", "requires": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.22.0" } }, "react-dropzone": { @@ -27901,21 +28628,6 @@ "prop-types": "^15.6.2" } }, - "react-virtualized-auto-sizer": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", - "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", - "requires": {} - }, - "react-window": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", - "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", - "requires": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - } - }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -28199,9 +28911,9 @@ } }, "rollup": { - "version": "2.70.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz", - "integrity": "sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==", + "version": "2.74.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.74.1.tgz", + "integrity": "sha512-K2zW7kV8Voua5eGkbnBtWYfMIhYhT9Pel2uhBk2WO5eMee161nPze/XRfvEQPFYz7KgrCCnmh2Wy0AMFLGGmMA==", "requires": { "fsevents": "~2.3.2" } @@ -28296,12 +29008,11 @@ } }, "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz", + "integrity": "sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "schema-utils": { @@ -28342,23 +29053,23 @@ } }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -28413,6 +29124,11 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -28438,18 +29154,23 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "setprototypeof": { @@ -28651,9 +29372,9 @@ "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "string_decoder": { "version": "1.3.0", @@ -28728,21 +29449,23 @@ } }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "stringify-object": { @@ -29009,13 +29732,13 @@ } }, "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz", + "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", "requires": { "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", + "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "dependencies": { @@ -29025,9 +29748,35 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } } } }, @@ -29230,13 +29979,13 @@ "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==" }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, @@ -29512,9 +30261,9 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -29525,13 +30274,13 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", @@ -29559,12 +30308,12 @@ } }, "webpack-dev-middleware": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", - "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "requires": { "colorette": "^2.0.10", - "memfs": "^3.4.1", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -29608,9 +30357,9 @@ } }, "webpack-dev-server": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", - "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", + "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -29632,7 +30381,6 @@ "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", @@ -29679,9 +30427,9 @@ } }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", + "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", "requires": {} } } diff --git a/interface/package.json b/interface/package.json index 375f96cb6..528f45f46 100644 --- a/interface/package.json +++ b/interface/package.json @@ -12,8 +12,8 @@ "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", "@types/node": "^17.0.35", - "@types/react": "^17.0.43", - "@types/react-dom": "^17.0.14", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.1.1", "axios": "^0.27.2", @@ -22,9 +22,9 @@ "lodash": "^4.17.21", "notistack": "^2.0.5", "parse-ms": "^3.0.0", - "react": "^17.0.2", + "react": "^18.1.0", "react-app-rewired": "^2.2.1", - "react-dom": "^17.0.2", + "react-dom": "^18.1.0", "react-dropzone": "^14.2.1", "react-icons": "^4.3.1", "react-router-dom": "^6.3.0", diff --git a/interface/src/CustomTheme.tsx b/interface/src/CustomTheme.tsx index d83ffeece..f5ff241ac 100644 --- a/interface/src/CustomTheme.tsx +++ b/interface/src/CustomTheme.tsx @@ -4,6 +4,8 @@ import { CssBaseline } from '@mui/material'; import { createTheme, responsiveFontSizes, ThemeProvider } from '@mui/material/styles'; import { blueGrey, blue } from '@mui/material/colors'; +import { RequiredChildrenProps } from './utils'; + const theme = responsiveFontSizes( createTheme({ typography: { @@ -21,7 +23,7 @@ const theme = responsiveFontSizes( }) ); -const CustomTheme: FC = ({ children }) => ( +const CustomTheme: FC = ({ children }) => ( {children} diff --git a/interface/src/components/SectionContent.tsx b/interface/src/components/SectionContent.tsx index 88cb6bb15..de205a7f8 100644 --- a/interface/src/components/SectionContent.tsx +++ b/interface/src/components/SectionContent.tsx @@ -2,7 +2,9 @@ import { FC } from 'react'; import { Paper, Divider } from '@mui/material'; -interface SectionContentProps { +import { RequiredChildrenProps } from '../utils'; + +interface SectionContentProps extends RequiredChildrenProps { title: string; titleGutter?: boolean; id?: string; diff --git a/interface/src/components/layout/Layout.tsx b/interface/src/components/layout/Layout.tsx index 30136be0c..c4f2c8e31 100644 --- a/interface/src/components/layout/Layout.tsx +++ b/interface/src/components/layout/Layout.tsx @@ -4,13 +4,15 @@ import { useLocation } from 'react-router-dom'; import { Box, Toolbar } from '@mui/material'; import { PROJECT_NAME } from '../../api/env'; +import { RequiredChildrenProps } from '../../utils'; + import LayoutDrawer from './LayoutDrawer'; import LayoutAppBar from './LayoutAppBar'; import { LayoutContext } from './context'; export const DRAWER_WIDTH = 240; -const Layout: FC = ({ children }) => { +const Layout: FC = ({ children }) => { const [mobileOpen, setMobileOpen] = useState(false); const [title, setTitle] = useState(PROJECT_NAME); const { pathname } = useLocation(); diff --git a/interface/src/components/routing/RequireAdmin.tsx b/interface/src/components/routing/RequireAdmin.tsx index 924933336..204ba9660 100644 --- a/interface/src/components/routing/RequireAdmin.tsx +++ b/interface/src/components/routing/RequireAdmin.tsx @@ -2,8 +2,9 @@ import { FC, useContext } from 'react'; import { Navigate } from 'react-router-dom'; import { AuthenticatedContext } from '../../contexts/authentication'; +import { RequiredChildrenProps } from '../../utils'; -const RequireAdmin: FC = ({ children }) => { +const RequireAdmin: FC = ({ children }) => { const authenticatedContext = useContext(AuthenticatedContext); return authenticatedContext.me.admin ? <>{children} : ; }; diff --git a/interface/src/components/routing/RequireAuthenticated.tsx b/interface/src/components/routing/RequireAuthenticated.tsx index 6ae24e760..67abf7d9c 100644 --- a/interface/src/components/routing/RequireAuthenticated.tsx +++ b/interface/src/components/routing/RequireAuthenticated.tsx @@ -8,7 +8,9 @@ import { } from '../../contexts/authentication/context'; import { storeLoginRedirect } from '../../api/authentication'; -const RequireAuthenticated: FC = ({ children }) => { +import { RequiredChildrenProps } from '../../utils'; + +const RequireAuthenticated: FC = ({ children }) => { const authenticationContext = useContext(AuthenticationContext); const location = useLocation(); diff --git a/interface/src/components/routing/RequireUnauthenticated.tsx b/interface/src/components/routing/RequireUnauthenticated.tsx index b8ef2ad61..43fee39d9 100644 --- a/interface/src/components/routing/RequireUnauthenticated.tsx +++ b/interface/src/components/routing/RequireUnauthenticated.tsx @@ -3,9 +3,10 @@ import { Navigate } from 'react-router-dom'; import * as AuthenticationApi from '../../api/authentication'; import { AuthenticationContext } from '../../contexts/authentication'; +import { RequiredChildrenProps } from '../../utils'; import { FeaturesContext } from '../../contexts/features'; -const RequireUnauthenticated: FC = ({ children }) => { +const RequireUnauthenticated: FC = ({ children }) => { const { features } = useContext(FeaturesContext); const authenticationContext = useContext(AuthenticationContext); diff --git a/interface/src/components/routing/RouterTabs.tsx b/interface/src/components/routing/RouterTabs.tsx index 49fd6528b..4c0b16c68 100644 --- a/interface/src/components/routing/RouterTabs.tsx +++ b/interface/src/components/routing/RouterTabs.tsx @@ -3,7 +3,9 @@ import { useNavigate } from 'react-router-dom'; import { Tabs, useMediaQuery, useTheme } from '@mui/material'; -interface RouterTabsProps { +import { RequiredChildrenProps } from '../../utils'; + +interface RouterTabsProps extends RequiredChildrenProps { value: string | false; } diff --git a/interface/src/contexts/authentication/Authentication.tsx b/interface/src/contexts/authentication/Authentication.tsx index 9577fbee4..a1310e894 100644 --- a/interface/src/contexts/authentication/Authentication.tsx +++ b/interface/src/contexts/authentication/Authentication.tsx @@ -4,12 +4,13 @@ import { useNavigate } from 'react-router-dom'; import * as AuthenticationApi from '../../api/authentication'; import { ACCESS_TOKEN } from '../../api/endpoints'; +import { RequiredChildrenProps } from '../../utils'; import { LoadingSpinner } from '../../components'; import { Me } from '../../types'; import { FeaturesContext } from '../features'; import { AuthenticationContext } from './context'; -const Authentication: FC = ({ children }) => { +const Authentication: FC = ({ children }) => { const { features } = useContext(FeaturesContext); const navigate = useNavigate(); const { enqueueSnackbar } = useSnackbar(); diff --git a/interface/src/contexts/features/FeaturesLoader.tsx b/interface/src/contexts/features/FeaturesLoader.tsx index 8f412717c..ed5dd73c0 100644 --- a/interface/src/contexts/features/FeaturesLoader.tsx +++ b/interface/src/contexts/features/FeaturesLoader.tsx @@ -2,13 +2,13 @@ import { FC, useCallback, useEffect, useState } from 'react'; import * as FeaturesApi from '../../api/features'; -import { extractErrorMessage } from '../../utils'; +import { extractErrorMessage, RequiredChildrenProps } from '../../utils'; import { Features } from '../../types'; import { ApplicationError, LoadingSpinner } from '../../components'; import { FeaturesContext } from '.'; -const FeaturesLoader: FC = (props) => { +const FeaturesLoader: FC = (props) => { const [errorMessage, setErrorMessage] = useState(); const [features, setFeatures] = useState(); diff --git a/interface/src/utils/index.ts b/interface/src/utils/index.ts index c1fb87d8f..cf4c0d39c 100644 --- a/interface/src/utils/index.ts +++ b/interface/src/utils/index.ts @@ -4,3 +4,5 @@ export * from './route'; export * from './submit'; export * from './time'; export * from './useRest'; +export * from './props'; + diff --git a/interface/src/utils/props.ts b/interface/src/utils/props.ts new file mode 100644 index 000000000..1186a6241 --- /dev/null +++ b/interface/src/utils/props.ts @@ -0,0 +1,3 @@ +export interface RequiredChildrenProps { + children: React.ReactNode; +} From 86b79a26850004b08d87b7da05a233191b363092 Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 23 May 2022 21:07:53 +0200 Subject: [PATCH 318/319] package update --- interface/package-lock.json | 60 ++++++++++++++++++------------------- interface/package.json | 4 +-- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 68db828eb..65851482f 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -12,12 +12,12 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.8.0", - "@mui/material": "^5.8.0", + "@mui/material": "^5.8.1", "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", "@types/node": "^17.0.35", "@types/react": "^18.0.9", - "@types/react-dom": "^18.0.4", + "@types/react-dom": "^18.0.5", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.1.1", "axios": "^0.27.2", @@ -2991,9 +2991,9 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.81", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.81.tgz", - "integrity": "sha512-KJP+RdKBLSbhiAliy1b5xFuoAezawupfIHc/MRtEZdqAmUW0+UFNDXIUDlBKR9zLCjgjQ7eVJsSe0TwAgd8OMQ==", + "version": "5.0.0-alpha.82", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.82.tgz", + "integrity": "sha512-WUVDjCGnLXzmGxrmfW31blhucg0sRX4YddK2Falq7FlVzwdJaPgWn/xzPZmdLL0+WXon0gQVnDrq2qvggE/GMg==", "dependencies": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", @@ -3048,13 +3048,13 @@ } }, "node_modules/@mui/material": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.8.0.tgz", - "integrity": "sha512-yvt3sUmUZ1i8SPadRYBCThcB57lBZsvyhC7ufVpRxA3AD39O+WXtXAapEfpDdDkJnnKb5MCimDMwBYgWLmY89Q==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.8.1.tgz", + "integrity": "sha512-Vl3BHFzOcAT5TJfvzoQUyuo/Xckn+/NSRyJ8upM4Hbz6Y1egW6P8f1RCa4FdkEfPSd5wSSYdmPfAiEh8eI4rPg==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.81", - "@mui/system": "^5.8.0", + "@mui/base": "5.0.0-alpha.82", + "@mui/system": "^5.8.1", "@mui/types": "^7.1.3", "@mui/utils": "^5.8.0", "@types/react-transition-group": "^4.4.4", @@ -3148,9 +3148,9 @@ } }, "node_modules/@mui/system": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.8.0.tgz", - "integrity": "sha512-1tEj2S59RjlZ/6JMJMUktQDbV2ev7hyGXqO7dRRUQ7nOJi9qHmCFP0uXj3YS6LbM6hVasgYXJg8GBjbEtfTJvg==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.8.1.tgz", + "integrity": "sha512-kWJMEN62+HJb4LMRNEAZQYc++FPYsqPsU9dCL7ByLgmz/ZzRrZ8FjDi2r4j0ZeE4kaVvqBXh+RA7tLzmCKqV9w==", "dependencies": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.8.0", @@ -3975,9 +3975,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.4.tgz", - "integrity": "sha512-FgTtbqPOCI3dzZPZoC2T/sx3L34qxy99ITWn4eoSA95qPyXDMH0ALoAqUp49ITniiJFsXUVBtalh/KffMpg21Q==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", + "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", "dependencies": { "@types/react": "*" } @@ -20069,9 +20069,9 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.81", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.81.tgz", - "integrity": "sha512-KJP+RdKBLSbhiAliy1b5xFuoAezawupfIHc/MRtEZdqAmUW0+UFNDXIUDlBKR9zLCjgjQ7eVJsSe0TwAgd8OMQ==", + "version": "5.0.0-alpha.82", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.82.tgz", + "integrity": "sha512-WUVDjCGnLXzmGxrmfW31blhucg0sRX4YddK2Falq7FlVzwdJaPgWn/xzPZmdLL0+WXon0gQVnDrq2qvggE/GMg==", "requires": { "@babel/runtime": "^7.17.2", "@emotion/is-prop-valid": "^1.1.2", @@ -20092,13 +20092,13 @@ } }, "@mui/material": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.8.0.tgz", - "integrity": "sha512-yvt3sUmUZ1i8SPadRYBCThcB57lBZsvyhC7ufVpRxA3AD39O+WXtXAapEfpDdDkJnnKb5MCimDMwBYgWLmY89Q==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.8.1.tgz", + "integrity": "sha512-Vl3BHFzOcAT5TJfvzoQUyuo/Xckn+/NSRyJ8upM4Hbz6Y1egW6P8f1RCa4FdkEfPSd5wSSYdmPfAiEh8eI4rPg==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.81", - "@mui/system": "^5.8.0", + "@mui/base": "5.0.0-alpha.82", + "@mui/system": "^5.8.1", "@mui/types": "^7.1.3", "@mui/utils": "^5.8.0", "@types/react-transition-group": "^4.4.4", @@ -20131,9 +20131,9 @@ } }, "@mui/system": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.8.0.tgz", - "integrity": "sha512-1tEj2S59RjlZ/6JMJMUktQDbV2ev7hyGXqO7dRRUQ7nOJi9qHmCFP0uXj3YS6LbM6hVasgYXJg8GBjbEtfTJvg==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.8.1.tgz", + "integrity": "sha512-kWJMEN62+HJb4LMRNEAZQYc++FPYsqPsU9dCL7ByLgmz/ZzRrZ8FjDi2r4j0ZeE4kaVvqBXh+RA7tLzmCKqV9w==", "requires": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.8.0", @@ -20716,9 +20716,9 @@ } }, "@types/react-dom": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.4.tgz", - "integrity": "sha512-FgTtbqPOCI3dzZPZoC2T/sx3L34qxy99ITWn4eoSA95qPyXDMH0ALoAqUp49ITniiJFsXUVBtalh/KffMpg21Q==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", + "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", "requires": { "@types/react": "*" } diff --git a/interface/package.json b/interface/package.json index 528f45f46..2ad65f12b 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,12 +8,12 @@ "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.8.0", - "@mui/material": "^5.8.0", + "@mui/material": "^5.8.1", "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", "@types/node": "^17.0.35", "@types/react": "^18.0.9", - "@types/react-dom": "^18.0.4", + "@types/react-dom": "^18.0.5", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.1.1", "axios": "^0.27.2", From b9f63bcfb1522c2bf8591d1b61caedd50e51389a Mon Sep 17 00:00:00 2001 From: Proddy Date: Mon, 23 May 2022 21:08:00 +0200 Subject: [PATCH 319/319] autoformatting --- src/devices/boiler.cpp | 13 ++++---- src/devices/boiler.h | 72 +++++++++++++++++++++--------------------- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index e39a3cc45..918ddc50b 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -206,14 +206,15 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(maintenanceDate), DeviceValueUOM::NONE, MAKE_CF_CB(set_maintenancedate)); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA, - &emergencyOps_, - DeviceValueType::BOOL, - nullptr, FL_(emergencyOps), + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &emergencyOps_, + DeviceValueType::BOOL, + nullptr, + FL_(emergencyOps), DeviceValueUOM::NONE, MAKE_CF_CB(set_emergency_ops)); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA, - &emergencyTemp_, + register_device_value(DeviceValueTAG::TAG_BOILER_DATA, + &emergencyTemp_, DeviceValueType::UINT, nullptr, FL_(emergencyTemp), diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 9d8bd85b0..f60b65120 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -51,40 +51,40 @@ class Boiler : public EMSdevice { static constexpr uint16_t EMS_TYPE_UBAEnergySupplied = 0x494; // ww - uint8_t wwSetTemp_; // DHW set temperature - uint8_t wwSelTemp_; // DHW selected temperature - uint8_t wwSelTempLow_; // DHW lower selected temperature - uint8_t wwSelTempOff_; // DHW selected temperature for off position - uint8_t wwSelTempSingle_; // DHW single charge temperature - uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer - uint8_t wwComfort_; // WW comfort mode - uint8_t wwComfort1_; // WW comfort mode RC310 - uint8_t wwCircPump_; // DHW circulation pump available - uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) - uint8_t wwChargeOptimization_; // DHW charge optimization - uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection - uint8_t wwCircMode_; // DHW circulation pump mode - uint8_t wwCirc_; // Circulation on/off - uint16_t wwCurTemp_; // DHW current temperature - uint16_t wwCurTemp2_; // DHW current temperature storage - uint8_t wwCurFlow_; // DHW current flow temp in l/min - uint16_t wwStorageTemp1_; // DHW storage temp 1 - uint16_t wwStorageTemp2_; // DHW storage temp 2 - uint8_t wwActivated_; // DHW activated - uint8_t wwOneTime_; // DHW one time function on/off - uint8_t wwDisinfect_; // DHW disinfection on/off - uint8_t wwCharging_; // DHW charging on/off - uint8_t wwRecharging_; // DHW recharge on/off - uint8_t wwTempOK_; // DHW temperature ok on/off - uint8_t wwActive_; // - uint8_t ww3wayValve_; // 3-way valve on WW - uint8_t wwSetPumpPower_; // ww pump speed/power? - uint8_t wwFlowTempOffset_; // Boiler offset for ww heating - uint8_t wwMaxPower_; // DHW maximum power - uint8_t wwMaxTemp_; // DHW maximum temperature - uint32_t wwStarts_; // DHW starts - uint32_t wwStarts2_; // DHW control starts - uint32_t wwWorkM_; // DHW minutes + uint8_t wwSetTemp_; // DHW set temperature + uint8_t wwSelTemp_; // DHW selected temperature + uint8_t wwSelTempLow_; // DHW lower selected temperature + uint8_t wwSelTempOff_; // DHW selected temperature for off position + uint8_t wwSelTempSingle_; // DHW single charge temperature + uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer + uint8_t wwComfort_; // WW comfort mode + uint8_t wwComfort1_; // WW comfort mode RC310 + uint8_t wwCircPump_; // DHW circulation pump available + uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) + uint8_t wwChargeOptimization_; // DHW charge optimization + uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection + uint8_t wwCircMode_; // DHW circulation pump mode + uint8_t wwCirc_; // Circulation on/off + uint16_t wwCurTemp_; // DHW current temperature + uint16_t wwCurTemp2_; // DHW current temperature storage + uint8_t wwCurFlow_; // DHW current flow temp in l/min + uint16_t wwStorageTemp1_; // DHW storage temp 1 + uint16_t wwStorageTemp2_; // DHW storage temp 2 + uint8_t wwActivated_; // DHW activated + uint8_t wwOneTime_; // DHW one time function on/off + uint8_t wwDisinfect_; // DHW disinfection on/off + uint8_t wwCharging_; // DHW charging on/off + uint8_t wwRecharging_; // DHW recharge on/off + uint8_t wwTempOK_; // DHW temperature ok on/off + uint8_t wwActive_; // + uint8_t ww3wayValve_; // 3-way valve on WW + uint8_t wwSetPumpPower_; // ww pump speed/power? + uint8_t wwFlowTempOffset_; // Boiler offset for ww heating + uint8_t wwMaxPower_; // DHW maximum power + uint8_t wwMaxTemp_; // DHW maximum temperature + uint32_t wwStarts_; // DHW starts + uint32_t wwStarts2_; // DHW control starts + uint32_t wwWorkM_; // DHW minutes int8_t wwHystOn_; int8_t wwHystOff_; uint8_t wwTapActivated_; // maintenance-mode to switch DHW off @@ -134,8 +134,8 @@ class Boiler : public EMSdevice { char lastCode_[50]; // last error code char serviceCode_[4]; // 3 character status/service code uint16_t serviceCodeNumber_; // error/service code - uint8_t emergencyOps_; - uint8_t emergencyTemp_; + uint8_t emergencyOps_; + uint8_t emergencyTemp_; // info uint32_t upTimeControl_; // Operating time control

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%0DRxQ5Eni80R#h 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

$#=P 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¥uFr|r5eHsQPukZF`VNQS3sD8V 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

+ + Tech Explorations + + + Programming Electronics Academy + +